From b447e962669eeebda2e2d7f07a04fe25fc05c179 Mon Sep 17 00:00:00 2001 From: yexingqiang Date: Mon, 8 Jun 2026 11:02:29 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E5=88=9D=E5=A7=8B=E5=8C=96=E5=B9=B3?= =?UTF-8?q?=E8=8A=9D126kV=E9=9A=94=E7=A6=BB=E5=BC=80=E5=85=B3MesProject?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 31 + AllProject/AllProject.sln | 91 + AllProject/AllProject/AllProject.csproj | 80 + AllProject/AllProject/App.config | 6 + AllProject/AllProject/Form1.Designer.cs | 41 + AllProject/AllProject/Form1.cs | 20 + AllProject/AllProject/Program.cs | 22 + .../AllProject/Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 70 + .../AllProject/Properties/Resources.resx | 117 + .../Properties/Settings.Designer.cs | 29 + .../AllProject/Properties/Settings.settings | 7 + AllProject/输出-调试.txt | 289 ++ Common/00-1Json8.3/Json8.3.1.sln | 25 + .../00-1Json8.3/Json8.3/00-0Json8.3.1.csproj | 244 ++ .../Json8.3/Bson/BsonBinaryType.cs | 44 + .../Json8.3/Bson/BsonBinaryWriter.cs | 331 ++ .../00-1Json8.3/Json8.3/Bson/BsonObjectId.cs | 57 + Common/00-1Json8.3/Json8.3/Bson/BsonReader.cs | 827 +++++ Common/00-1Json8.3/Json8.3/Bson/BsonToken.cs | 157 + Common/00-1Json8.3/Json8.3/Bson/BsonType.cs | 51 + Common/00-1Json8.3/Json8.3/Bson/BsonWriter.cs | 531 +++ Common/00-1Json8.3/Json8.3/Class1.cs | 12 + .../Json8.3/ConstructorHandling.cs | 43 + .../Json8.3/Converters/BinaryConverter.cs | 201 ++ .../Converters/BsonObjectIdConverter.cs | 91 + .../Converters/CustomCreationConverter.cs | 104 + .../Json8.3/Converters/DataSetConverter.cs | 119 + .../Json8.3/Converters/DataTableConverter.cs | 244 ++ .../Converters/DateTimeConverterBase.cs | 58 + .../Converters/DiscriminatedUnionConverter.cs | 280 ++ .../Converters/EntityKeyMemberConverter.cs | 157 + .../Converters/ExpandoObjectConverter.cs | 168 + .../Converters/IsoDateTimeConverter.cs | 197 ++ .../Converters/JavaScriptDateTimeConverter.cs | 127 + .../Json8.3/Converters/JsonValueConverter.cs | 225 ++ .../Converters/KeyValuePairConverter.cs | 149 + .../Json8.3/Converters/RegexConverter.cs | 227 ++ .../Json8.3/Converters/StringEnumConverter.cs | 175 + .../Json8.3/Converters/VersionConverter.cs | 106 + .../Json8.3/Converters/XmlNodeConverter.cs | 1949 +++++++++++ .../00-1Json8.3/Json8.3/DateFormatHandling.cs | 43 + .../00-1Json8.3/Json8.3/DateParseHandling.cs | 49 + .../Json8.3/DateTimeZoneHandling.cs | 56 + .../Json8.3/DefaultValueHandling.cs | 67 + .../Json8.3/FloatFormatHandling.cs | 50 + .../00-1Json8.3/Json8.3/FloatParseHandling.cs | 43 + Common/00-1Json8.3/Json8.3/Formatting.cs | 43 + Common/00-1Json8.3/Json8.3/IArrayPool.cs | 22 + Common/00-1Json8.3/Json8.3/IJsonLineInfo.cs | 53 + .../00-1Json8.3/Json8.3/JsonArrayAttribute.cs | 73 + .../Json8.3/JsonConstructorAttribute.cs | 37 + .../Json8.3/JsonContainerAttribute.cs | 138 + Common/00-1Json8.3/Json8.3/JsonConvert.cs | 1153 +++++++ Common/00-1Json8.3/Json8.3/JsonConverter.cs | 99 + .../Json8.3/JsonConverterAttribute.cs | 80 + .../Json8.3/JsonConverterCollection.cs | 39 + .../Json8.3/JsonDictionaryAttribute.cs | 52 + Common/00-1Json8.3/Json8.3/JsonException.cs | 92 + .../Json8.3/JsonExtensionDataAttribute.cs | 37 + .../Json8.3/JsonIgnoreAttribute.cs | 39 + .../Json8.3/JsonObjectAttribute.cs | 89 + Common/00-1Json8.3/Json8.3/JsonPosition.cs | 167 + .../Json8.3/JsonPropertyAttribute.cs | 201 ++ Common/00-1Json8.3/Json8.3/JsonReader.cs | 1173 +++++++ .../Json8.3/JsonReaderException.cs | 139 + .../Json8.3/JsonRequiredAttribute.cs | 39 + .../Json8.3/JsonSerializationException.cs | 100 + Common/00-1Json8.3/Json8.3/JsonSerializer.cs | 1140 +++++++ .../Json8.3/JsonSerializerSettings.cs | 403 +++ Common/00-1Json8.3/Json8.3/JsonTextReader.cs | 2380 +++++++++++++ Common/00-1Json8.3/Json8.3/JsonTextWriter.cs | 807 +++++ Common/00-1Json8.3/Json8.3/JsonToken.cs | 127 + .../Json8.3/JsonValidatingReader.cs | 1058 ++++++ Common/00-1Json8.3/Json8.3/JsonWriter.cs | 1714 ++++++++++ .../Json8.3/JsonWriterException.cs | 107 + .../Json8.3/Linq/CommentHandling.cs | 34 + Common/00-1Json8.3/Json8.3/Linq/Extensions.cs | 332 ++ .../00-1Json8.3/Json8.3/Linq/IJEnumerable.cs | 46 + Common/00-1Json8.3/Json8.3/Linq/JArray.cs | 406 +++ .../00-1Json8.3/Json8.3/Linq/JConstructor.cs | 247 ++ Common/00-1Json8.3/Json8.3/Linq/JContainer.cs | 1256 +++++++ .../00-1Json8.3/Json8.3/Linq/JEnumerable.cs | 151 + Common/00-1Json8.3/Json8.3/Linq/JObject.cs | 905 +++++ Common/00-1Json8.3/Json8.3/Linq/JProperty.cs | 400 +++ .../Json8.3/Linq/JPropertyDescriptor.cs | 166 + .../Json8.3/Linq/JPropertyKeyedCollection.cs | 280 ++ Common/00-1Json8.3/Json8.3/Linq/JRaw.cs | 75 + Common/00-1Json8.3/Json8.3/Linq/JToken.cs | 2704 +++++++++++++++ .../Json8.3/Linq/JTokenEqualityComparer.cs | 64 + .../00-1Json8.3/Json8.3/Linq/JTokenReader.cs | 330 ++ Common/00-1Json8.3/Json8.3/Linq/JTokenType.cs | 123 + .../00-1Json8.3/Json8.3/Linq/JTokenWriter.cs | 489 +++ Common/00-1Json8.3/Json8.3/Linq/JValue.cs | 1186 +++++++ .../Json8.3/Linq/JsonLoadSettings.cs | 49 + .../Json8.3/Linq/JsonMergeSettings.cs | 49 + .../Json8.3/Linq/JsonPath/ArrayIndexFilter.cs | 44 + .../Linq/JsonPath/ArrayMultipleIndexFilter.cs | 25 + .../Json8.3/Linq/JsonPath/ArraySliceFilter.cs | 88 + .../Json8.3/Linq/JsonPath/FieldFilter.cs | 49 + .../Linq/JsonPath/FieldMultipleFilter.cs | 48 + .../Json8.3/Linq/JsonPath/JPath.cs | 777 +++++ .../Json8.3/Linq/JsonPath/PathFilter.cs | 55 + .../Json8.3/Linq/JsonPath/QueryExpression.cs | 180 + .../Json8.3/Linq/JsonPath/QueryFilter.cs | 24 + .../Json8.3/Linq/JsonPath/ScanFilter.cs | 63 + .../Json8.3/Linq/MergeArrayHandling.cs | 20 + .../Json8.3/Linq/MergeNullValueHandling.cs | 21 + .../Json8.3/MemberSerialization.cs | 58 + .../Json8.3/MetadataPropertyHandling.cs | 52 + .../Json8.3/MissingMemberHandling.cs | 47 + .../00-1Json8.3/Json8.3/NullValueHandling.cs | 47 + .../Json8.3/ObjectCreationHandling.cs | 48 + .../Json8.3/PreserveReferencesHandling.cs | 62 + .../Json8.3/Properties/AssemblyInfo.cs | 36 + .../Json8.3/ReferenceLoopHandling.cs | 52 + Common/00-1Json8.3/Json8.3/Required.cs | 53 + .../00-1Json8.3/Json8.3/Schema/Extensions.cs | 137 + .../00-1Json8.3/Json8.3/Schema/JsonSchema.cs | 356 ++ .../Json8.3/Schema/JsonSchemaBuilder.cs | 495 +++ .../Json8.3/Schema/JsonSchemaConstants.cs | 80 + .../Json8.3/Schema/JsonSchemaException.cs | 113 + .../Json8.3/Schema/JsonSchemaGenerator.cs | 515 +++ .../Json8.3/Schema/JsonSchemaModel.cs | 125 + .../Json8.3/Schema/JsonSchemaModelBuilder.cs | 213 ++ .../Json8.3/Schema/JsonSchemaNode.cs | 81 + .../Schema/JsonSchemaNodeCollection.cs | 39 + .../Json8.3/Schema/JsonSchemaResolver.cs | 79 + .../Json8.3/Schema/JsonSchemaType.cs | 87 + .../Json8.3/Schema/JsonSchemaWriter.cs | 259 ++ .../Schema/UndefinedSchemaIdHandling.cs | 56 + .../Json8.3/Schema/ValidationEventArgs.cs | 77 + .../Json8.3/Schema/ValidationEventHandler.cs | 40 + .../Serialization/CachedAttributeGetter.cs | 41 + .../CamelCasePropertyNamesContractResolver.cs | 57 + .../Serialization/DefaultContractResolver.cs | 1571 +++++++++ .../Serialization/DefaultReferenceResolver.cs | 89 + .../DefaultSerializationBinder.cs | 164 + .../Serialization/DiagnosticsTraceWriter.cs | 79 + .../Serialization/DynamicValueProvider.cs | 120 + .../Json8.3/Serialization/ErrorContext.cs | 75 + .../Json8.3/Serialization/ErrorEventArgs.cs | 58 + .../Serialization/ExpressionValueProvider.cs | 120 + .../Serialization/IAttributeProvider.cs | 51 + .../Serialization/IContractResolver.cs | 46 + .../Serialization/IReferenceResolver.cs | 67 + .../Json8.3/Serialization/ITraceWriter.cs | 28 + .../Json8.3/Serialization/IValueProvider.cs | 47 + .../Serialization/JsonArrayContract.cs | 310 ++ .../Serialization/JsonContainerContract.cs | 120 + .../Json8.3/Serialization/JsonContract.cs | 392 +++ .../Serialization/JsonDictionaryContract.cs | 242 ++ .../Serialization/JsonDynamicContract.cs | 119 + .../Serialization/JsonFormatterConverter.cs | 161 + .../JsonISerializableContract.cs | 55 + .../Json8.3/Serialization/JsonLinqContract.cs | 45 + .../Serialization/JsonObjectContract.cs | 227 ++ .../Serialization/JsonPrimitiveContract.cs | 75 + .../Json8.3/Serialization/JsonProperty.cs | 308 ++ .../Serialization/JsonPropertyCollection.cs | 180 + .../JsonSerializerInternalBase.cs | 149 + .../JsonSerializerInternalReader.cs | 2585 ++++++++++++++ .../JsonSerializerInternalWriter.cs | 1196 +++++++ .../Serialization/JsonSerializerProxy.cs | 278 ++ .../Serialization/JsonStringContract.cs | 45 + .../Serialization/JsonTypeReflector.cs | 461 +++ .../Serialization/MemoryTraceWriter.cs | 90 + .../Serialization/ObjectConstructor.cs | 33 + .../Json8.3/Serialization/OnErrorAttribute.cs | 37 + .../ReflectionAttributeProvider.cs | 71 + .../Serialization/ReflectionValueProvider.cs | 84 + .../Json8.3/Serialization/TraceJsonReader.cs | 157 + .../Json8.3/Serialization/TraceJsonWriter.cs | 322 ++ .../Json8.3/StringEscapeHandling.cs | 48 + .../00-1Json8.3/Json8.3/TypeNameHandling.cs | 67 + .../Json8.3/Utilities/Base64Encoder.cs | 128 + .../Utilities/BidirectionalDictionary.cs | 97 + .../Json8.3/Utilities/CollectionUtils.cs | 348 ++ .../Json8.3/Utilities/CollectionWrapper.cs | 348 ++ .../Json8.3/Utilities/ConvertUtils.cs | 987 ++++++ .../Json8.3/Utilities/DateTimeParser.cs | 277 ++ .../Json8.3/Utilities/DateTimeUtils.cs | 824 +++++ .../Json8.3/Utilities/DictionaryWrapper.cs | 700 ++++ .../Json8.3/Utilities/DynamicProxy.cs | 113 + .../Utilities/DynamicProxyMetaObject.cs | 427 +++ .../DynamicReflectionDelegateFactory.cs | 360 ++ .../Json8.3/Utilities/DynamicUtils.cs | 210 ++ .../Json8.3/Utilities/EnumUtils.cs | 257 ++ .../Json8.3/Utilities/EnumValue.cs | 49 + .../ExpressionReflectionDelegateFactory.cs | 368 ++ .../Json8.3/Utilities/FSharpUtils.cs | 195 ++ .../Utilities/ILGeneratorExtensions.cs | 98 + .../Utilities/ImmutableCollectionsUtils.cs | 176 + .../Json8.3/Utilities/JavaScriptUtils.cs | 318 ++ .../Json8.3/Utilities/JsonTokenUtils.cs | 77 + .../LateBoundReflectionDelegateFactory.cs | 119 + .../Json8.3/Utilities/LinqBridge.cs | 3014 +++++++++++++++++ .../Json8.3/Utilities/MathUtils.cs | 187 + .../Json8.3/Utilities/MethodCall.cs | 29 + .../Json8.3/Utilities/MiscellaneousUtils.cs | 162 + .../Json8.3/Utilities/PropertyNameTable.cs | 173 + .../Utilities/ReflectionDelegateFactory.cs | 81 + .../Json8.3/Utilities/ReflectionObject.cs | 165 + .../Json8.3/Utilities/ReflectionUtils.cs | 1122 ++++++ .../Json8.3/Utilities/StringBuffer.cs | 122 + .../Json8.3/Utilities/StringReference.cs | 123 + .../Json8.3/Utilities/StringUtils.cs | 231 ++ .../Json8.3/Utilities/ThreadSafeStore.cs | 97 + .../Json8.3/Utilities/TypeExtensions.cs | 628 ++++ .../Json8.3/Utilities/ValidationUtils.cs | 40 + Common/00-1Json8.3/Json8.3/WriteState.cs | 72 + Common/00-2AppConfigSet/AppConfigSet.sln | 25 + .../AppConfigSet/00-1AppConfigSetForm.csproj | 87 + .../00-2AppConfigSet/AppConfigSet/App.config | 6 + .../AppConfigSet/AppConfigSetForm.Designer.cs | 213 ++ .../AppConfigSet/AppConfigSetForm.cs | 81 + .../AppConfigSet/AppConfigSetForm.resx | 200 ++ .../00-2AppConfigSet/AppConfigSet/Program.cs | 22 + .../AppConfigSet/Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 63 + .../AppConfigSet/Properties/Resources.resx | 117 + .../Properties/Settings.Designer.cs | 26 + .../AppConfigSet/Properties/Settings.settings | 7 + .../dll/MQTTnet.Extensions.ManagedClient.dll | Bin 0 -> 45568 bytes Common/00MesWorkMqtt/Common/dll/MQTTnet.dll | Bin 0 -> 293376 bytes .../00MesWorkMqtt/Common/dll/MesWorkMqtt.dll | Bin 0 -> 10240 bytes .../00MesWorkMqtt/Common/dll/MesWorkMqtt.pdb | Bin 0 -> 24064 bytes .../DataBaseAccess/04DataBaseAccess.csproj | 52 + .../DataBaseAccess/DataAccess.cs | 527 +++ .../DataBaseAccess/JsonHelper.cs | 334 ++ .../DataBaseAccess/Properties/AssemblyInfo.cs | 36 + Common/00MesWorkMqtt/MesWorkMqtt.sln | 25 + .../MesWorkMqtt/00MesWorkMqtt.csproj | 56 + Common/00MesWorkMqtt/MesWorkMqtt/Mqtt.cs | 281 ++ .../MesWorkMqtt/Properties/AssemblyInfo.cs | 36 + Common/01DoWhatPlc/01_01DoWhatPlc.csproj | 60 + Common/01DoWhatPlc/01_01DoWhatPlc.sln | 25 + Common/01DoWhatPlc/DoWhat.cs | 1408 ++++++++ Common/01DoWhatPlc/Properties/AssemblyInfo.cs | 36 + Common/01DoWhatPlc/TagTypeCodeID.cs | 462 +++ Common/01DoWhatPlc/TagTypeID.cs | 28 + Common/01DoWhatPlc/Utils.cs | 82 + Common/01DoWhatPlc/packages.config | 4 + Common/02WebApiCall/02_02WebApiCallPLC.csproj | 110 + Common/02WebApiCall/02_02WebApiCallPLC.sln | 25 + Common/02WebApiCall/App.config | 11 + Common/02WebApiCall/Form1.Designer.cs | 48 + Common/02WebApiCall/Form1.cs | 20 + Common/02WebApiCall/Form1.resx | 120 + Common/02WebApiCall/Program.cs | 22 + .../02WebApiCall/Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 63 + Common/02WebApiCall/Properties/Resources.resx | 117 + .../Properties/Settings.Designer.cs | 26 + .../02WebApiCall/Properties/Settings.settings | 7 + .../WebApiCall/CallWebApi.SQLCommon.cs | 132 + Common/02WebApiCall/WebApiCall/CallWebApi.cs | 448 +++ .../WebApiCall/CallWebApiDT.SQLCommon.cs | 188 + .../02WebApiCall/WebApiCall/CallWebApiDT.cs | 407 +++ Common/02WebApiCall/WebApiCall/Opc.Demo.cs | 123 + .../02WebApiCall/WebApiCall/Opc.SaveData.cs | 44 + Common/02WebApiCall/WebApiCall/ReadPLC.cs | 190 ++ .../WebApiCall/ReadWritePLCMesRead.cs | 67 + Common/02WebApiCall/WebApiCall/Utils.cs | 82 + Common/02WebApiCall/WebApiCall/WbApi.cs | 15 + Common/02WebApiCall/WebApiCall/WritePLC.cs | 129 + Common/02WebApiCall/packages.config | 4 + .../Common/dll/DataBaseAccess.dll | Bin 0 -> 15872 bytes .../Common/dll/DataBaseAccess.pdb | Bin 0 -> 44544 bytes .../04DataBaseAccess/Common/dll/DoWhatPlc.dll | Bin 0 -> 19456 bytes .../04DataBaseAccess/Common/dll/DoWhatPlc.pdb | Bin 0 -> 56832 bytes .../dll/MQTTnet.Extensions.ManagedClient.dll | Bin 0 -> 45568 bytes .../04DataBaseAccess/Common/dll/MQTTnet.dll | Bin 0 -> 293376 bytes .../Common/dll/MesWorkMqtt.dll | Bin 0 -> 10240 bytes .../Common/dll/MesWorkMqtt.pdb | Bin 0 -> 24064 bytes .../Common/dll/Newtonsoft.Json.dll | Bin 0 -> 502272 bytes .../Common/dll/WebApiCall.dll | Bin 0 -> 21504 bytes .../Common/dll/WebApiCall.dll.config | 11 + .../Common/dll/WebApiCall.pdb | Bin 0 -> 75264 bytes Common/04DataBaseAccess/DataBaseAccess.sln | 25 + .../DataBaseAccess/04-DataBaseAccess.csproj | 54 + .../DataBaseAccess/DataAccess.cs | 611 ++++ .../DataBaseAccess/JsonHelper.cs | 336 ++ .../DataBaseAccess/Properties/AssemblyInfo.cs | 36 + Common/07WebBusinessFacade/BusinessFacade.sln | 25 + .../BusinessFacade/05Biz/MES/EngineIDCode.cs | 105 + .../BusinessFacade/05Biz/MES/Materials.cs | 204 ++ .../05Biz/MES/OpName.MainForm.Launch.cs | 447 +++ .../05Biz/MES/RepairWorkStation.cs | 52 + .../BusinessFacade/05Biz/MES/ShowLED.cs | 91 + .../BusinessFacade/05Biz/MES/vssver2.scc | Bin 0 -> 1047 bytes .../05Biz/OPC/BaseDataSystemMES.OPC.Alarm.cs | 162 + ...seDataSystemMES.OPC.QualityData.GoodBad.cs | 84 + .../OPC/BaseDataSystemMES.OPC.QualityData.cs | 54 + .../05Biz/OPC/BaseDataSystemMES.OPC.cs | 98 + .../BusinessFacade/05Biz/OPC/vssver2.scc | Bin 0 -> 432 bytes .../05Biz/QualityData/DataVerify.cs | 129 + .../QualityData/GetQualityData_GoodBad.cs | 415 +++ .../BusinessFacade/07BusinessFacade.csproj | 147 + .../BusinessFacade/Db2023/Order.cs | 340 ++ .../BusinessFacade/MES.B5A.Factory/Factory.cs | 93 + .../MES.B5A.Factory/vssver2.scc | Bin 0 -> 106 bytes .../MES.B5A.MainForm/EngineIDCode.cs | 405 +++ .../OpName.MainForm.Launch.cs | 316 ++ .../OpName.MainForm.Material.cs | 165 + .../MES.B5A.MainForm/OpName.MainForm.cs | 89 + .../MES.B5A.MainForm/UserManage.cs | 223 ++ .../MES.B5A.MainForm/UserNamePassword.cs | 127 + .../MES.B5A.MainForm/vssver2.scc | Bin 0 -> 299 bytes .../MES.B5A.Manager/EngineType.cs | 238 ++ .../BusinessFacade/MES.B5A.Manager/IsMES.cs | 59 + .../MES.B5A.Manager/OpName.Material.cs | 111 + .../MES.B5A.Manager/OpName.Proccess.cs | 113 + .../MES.B5A.Manager/OpName.Shaft.cs | 244 ++ .../MES.B5A.Manager/vssver2.scc | Bin 0 -> 236 bytes .../QualityData.B5A.Pack.cs | 904 +++++ .../QualityData.B5A.Save.cs | 247 ++ .../MES.B5A.QualityData/QualityData.B5A.cs | 162 + .../MES.B5A.QualityData/vssver2.scc | Bin 0 -> 198 bytes .../MES.B5A.ShaftPosition/OpNameCount.cs | 40 + .../MES.B5A.ShaftPosition/OpNameRepair.cs | 33 + .../MES.B5A.ShaftPosition/ShaftPosition.cs | 203 ++ .../ShaftPositionData.cs | 199 ++ .../MES.B5A.ShaftPosition/vssver2.scc | Bin 0 -> 218 bytes .../MES.Biz.TraceTable.Cap.cs | 60 + .../MES.Biz.TraceTable.Cylinder.cs | 388 +++ .../MES.Biz.TraceTable.ToOpName.cs | 66 + .../MES.Biz.TraceTable/MES.Biz.TraceTable.cs | 817 +++++ .../MES.Biz.TraceTable/vssver2.scc | Bin 0 -> 256 bytes .../MES.Data.GetData/GetOpNameOrderForm.cs | 281 ++ .../MES.Biz.TraceTable.GetData.cs | 86 + .../MES.Data.GetData/OpNameGuid.cs | 124 + .../MES.Data.GetData/vssver2.scc | Bin 0 -> 194 bytes .../MES.Biz.Material.SaveData.cs | 338 ++ .../MES.Biz.TraceTable.SaveData.cs | 222 ++ .../MES.Data.SaveData/vssver2.scc | Bin 0 -> 173 bytes .../BusinessFacade/MES.HL/MesFunctions.cs | 83 + .../BusinessFacade/MES.Material/Materials.cs | 1042 ++++++ .../BusinessFacade/MES.Material/vssver2.scc | Bin 0 -> 105 bytes ...eDataSystemMES.AssemblyPartTrace.Repair.cs | 509 +++ .../BaseDataSystemMES.AssemblyPartTrace.cs | 687 ++++ .../MES/BaseDataSystemMES.CartTrace.cs | 124 + .../MES/BaseDataSystemMES.FalseOverGo.cs | 34 + .../MES/BaseDataSystemMES.FirstOpName.cs | 52 + ...temMES.KeyPart.KeyPartAssemblyTempTable.cs | 395 +++ .../MES/BaseDataSystemMES.Load.cs | 47 + .../MES/BaseDataSystemMES.Login.cs | 76 + .../MES/BaseDataSystemMES.MOBY.cs | 98 + .../MES/BaseDataSystemMES.MaterialList.cs | 216 ++ ...eDataSystemMES.MaterialVerifyManagement.cs | 232 ++ .../MES/BaseDataSystemMES.MesOverGo.cs | 33 + .../MES/BaseDataSystemMES.MesServer.cs | 56 + .../MES/BaseDataSystemMES.ProduceCount.cs | 73 + .../MES/BaseDataSystemMES.SubLineOpName.cs | 58 + .../MES/BaseDataSystemMES.WorkSheet.cs | 75 + .../BusinessFacade/MES/BaseDataSystemMES.cs | 224 ++ .../BusinessFacade/MES/MES.Biz.Config.cs | 196 ++ .../MES/MES.Biz.MaterialList.cs | 298 ++ .../BusinessFacade/MES/MaterialData.cs | 1504 ++++++++ .../BusinessFacade/MES/vssver2.scc | Bin 0 -> 981 bytes .../BusinessFacade/Properties/AssemblyInfo.cs | 36 + .../BusinessFacade/SyPartLoad/EngineIDCode.cs | 230 ++ .../BusinessFacade/Web.New/MES1.cs | 119 + .../BusinessFacade/Web/Buttons.cs | 225 ++ .../BusinessFacade/Web/Login.cs | 237 ++ .../BusinessFacade/Web/MES.Functions.cs | 656 ++++ .../BusinessFacade/Web/MES.MaterialPull.cs | 684 ++++ .../BusinessFacade/Web/MES.cs | 748 ++++ .../BusinessFacade/Web/MES_Loading.cs | 99 + .../BusinessFacade/Web/MES_MachineManage.cs | 29 + .../BusinessFacade/Web/ando_load.cs | 67 + .../BusinessFacade/Web/ando_load_2.cs | 67 + .../BusinessFacade/Web/ando_machine.cs | 225 ++ .../BusinessFacade/Web/ando_machine_2.cs | 225 ++ .../BusinessFacade/Web/ando_matertial.cs | 605 ++++ .../BusinessFacade/Web/ando_matertial_2.cs | 605 ++++ .../BusinessFacade/Web/ando_quality.cs | 225 ++ .../BusinessFacade/Web/ando_quality_2.cs | 225 ++ .../BusinessFacade/Web/vssver2.scc | Bin 0 -> 541 bytes Common/08WebFun_base/WebFun_base.sln | 25 + .../WebFun_base/08-WebFun_base.csproj | 119 + Common/08WebFun_base/WebFun_base/Class1.cs | 12 + .../WebFun_base/MesWebFun_MateriallPull.cs | 125 + .../WebFun_base/MesWebFun_MateriallPullFun.cs | 870 +++++ .../WebFun_base/MesWebFun_Special.cs | 104 + .../WebFun_base/MesWebFun_base.cs | 231 ++ .../WebFun_base/MesWebFun_baseFun.cs | 1848 ++++++++++ .../MisWebInterfaceFunc/Tab_OperateGuid.cs | 232 ++ .../WWW - 复制 - 复制(2).cs | 24 + .../WWW - 复制 - 复制(3).cs | 24 + .../WWW - 复制 - 复制(4).cs | 24 + .../WWW - 复制 - 复制(5).cs | 24 + .../WWW - 复制 - 复制(6).cs | 24 + .../WWW - 复制 - 复制(7).cs | 24 + .../WWW - 复制 - 复制(8).cs | 24 + .../WWW - 复制 - 复制(9).cs | 24 + .../MisWebInterfaceFunc/WWW - 复制 - 复制.cs | 24 + .../MisWebInterfaceFunc/WWW - 复制.cs | 24 + .../MisWebInterfaceFunc/Web_Common_Barcode.cs | 40 + .../Web_Common_ShowEngineID.cs | 175 + .../Web_Common_ShowQuality.cs | 65 + .../Web_Common_ShowTime.cs | 187 + .../MisWebInterfaceFunc/Web_FixGuiad.cs | 327 ++ .../MisWebInterfaceFunc/Web_Init.cs | 816 +++++ .../MisWebInterfaceFunc/Web_MaterialCheck.cs | 155 + .../MisWebInterfaceFunc/Web_Notice.cs | 38 + .../MisWebInterfaceFunc/Web_OutLineRepair.cs | 420 +++ .../MisWebInterfaceFunc/Web_Socket.cs | 189 ++ .../Web_Socket_Interface.cs | 170 + .../WebFun_base/Properties/AssemblyInfo.cs | 36 + Common/08WebFun_base/WebFun_base/Reference.cs | 1224 +++++++ .../WebFun_base/SpecialFun/WebFunction01.cs | 475 +++ .../WebFun_base/SpecialFun/WebFunction02.cs | 489 +++ .../WebFun_base/SpecialFun/WebFunction04.cs | 491 +++ .../WebFun_base/SpecialFun/WebFunction05.cs | 491 +++ .../WebFun_base/SpecialFun/WebFunction06.cs | 491 +++ .../WebFun_base/SpecialFun/WebFunction07.cs | 417 +++ .../WebFun_base/SpecialFun/WebFunction08.cs | 695 ++++ .../WebFun_base/SpecialFun/WebFunction10.cs | 482 +++ .../WebFun_base/SpecialFun/WebFunction11.cs | 491 +++ .../WebFun_base/SpecialFun/WebFunction12.cs | 491 +++ .../WebFun_base/SpecialFun/WebFunction13.cs | 491 +++ .../WebFun_base/SpecialFun/WebFunction14.cs | 493 +++ .../WebFun_base/SpecialFun/WebFunction15.cs | 489 +++ .../WebFun_base/SpecialFun/WebFunction16.cs | 483 +++ .../WebFun_base/SpecialFun/WebFunction17.cs | 483 +++ .../WebFun_base/SpecialFun/vssver2.scc | Bin 0 -> 572 bytes Common/09MesDataFunction/MesDataFunction.sln | 25 + .../MesDataFunction/09-MesDataFunction.csproj | 149 + .../MesDataFunction/LoadTagTypeCodeID.cs | 128 + .../MesDataFunction/InitTagValueListData.cs | 84 + .../MesDataFunction/MIS.Functions.Barcode.cs | 95 + .../MIS.Functions.ConfirmOkGo.cs | 47 + ...IS.Functions.EngineTypeGetOver_PLC_Work.cs | 139 + .../MesDataFunction/MIS.Functions.FalseGO.cs | 48 + .../MIS.Functions.Material_Insert.cs | 59 + .../MIS.Functions.MesReadOver.cs | 66 + .../MIS.Functions.SendMessage.cs | 162 + .../MIS.Functions.WebSubmit.cs | 282 ++ .../MIS.Functions.WorkStart.cs | 45 + .../MesDataFunction/MIS.Hashtable.TagID.cs | 806 +++++ .../MIS.Machine.ServicePlan.cs | 98 + .../MesDataFunction/MIS.OpcServerMIS.Read.cs | 1202 +++++++ .../MesDataFunction/MIS.OpcServerMIS.Write.cs | 564 +++ .../MesDataFunction/MIS.QualityData.Read.cs | 119 + .../MesDataFunction/MIS.SendMessage.cs | 127 + .../MesDataFunction/MIS_BASE.cs | 431 +++ .../MesDataFunction/MesWorkPlc.cs | 40 + .../MisDataFunction/Heartbeat.cs | 25 + .../MisDataFunction/MIS.Interface.cs | 326 ++ .../MisDataFunction/MesRead.cs | 465 +++ .../MisDataFunction/WorkStart.cs | 236 ++ .../Properties/AssemblyInfo.cs | 36 + .../10MesControl.csproj | 139 + .../MesBoolSignal.Designer.cs | 79 + .../MesBoolSignal.cs | 111 + .../MesBoolSignal.resx | 126 + .../MesControl.sln | 55 + .../PlcConnect.Designer.cs | 81 + .../PlcConnect.cs | 221 ++ .../PlcConnect.resx | 129 + .../PlcWorkStationSignal.Designer.cs | 80 + .../PlcWorkStationSignal.cs | 228 ++ .../PlcWorkStationSignal.resx | 123 + .../Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 193 ++ .../Properties/Resources.resx | 160 + .../Properties/_system~.ini | 0 .../Resources/BreakPLC.png | Bin 0 -> 4041 bytes .../Resources/PlcConnect0.png | Bin 0 -> 2859 bytes .../Resources/PlcConnect1.png | Bin 0 -> 2936 bytes .../Resources/PlcConnect2.png | Bin 0 -> 3271 bytes .../Resources/PlcConnect3.png | Bin 0 -> 3647 bytes .../Resources/PlcConnect4.png | Bin 0 -> 4047 bytes .../Resources/PlcConnectBig.png | Bin 0 -> 4061 bytes .../Resources/PlcConnectSmall.png | Bin 0 -> 3265 bytes .../Resources/_system~.ini | 0 .../Resources/green.png | Bin 0 -> 3885 bytes .../Resources/init.png | Bin 0 -> 3902 bytes .../Resources/none.png | Bin 0 -> 3888 bytes .../Resources/red.png | Bin 0 -> 3852 bytes .../Resources/yellow.png | Bin 0 -> 3905 bytes .../SignalInit.cs | 37 + .../10SignalChangeMonitorControl/_system~.ini | 0 Common/11MonitorForm/11MonitorForm.csproj | 137 + Common/11MonitorForm/App.config | 16 + Common/11MonitorForm/Form1.Designer.cs | 41 + Common/11MonitorForm/Form1.cs | 20 + .../11MonitorForm/FunctionForm_HashiTable.cs | 103 + Common/11MonitorForm/MainSignalChangeEvent.cs | 127 + Common/11MonitorForm/Mes32X32.ico | Bin 0 -> 4286 bytes .../11MonitorForm/PlcSignalDynamicCreate.cs | 139 + Common/11MonitorForm/Program.cs | 22 + .../11MonitorForm/Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 63 + .../11MonitorForm/Properties/Resources.resx | 117 + .../Properties/Settings.Designer.cs | 26 + .../Properties/Settings.settings | 7 + Common/11MonitorForm/SecondForm.Designer.cs | 83 + Common/11MonitorForm/SecondForm.cs | 86 + Common/11MonitorForm/SecondForm.resx | 197 ++ Common/11MonitorForm/SecondFormDelegate.cs | 15 + .../Common/dll/DataBaseAccess.dll | Bin 0 -> 15872 bytes .../Common/dll/DataBaseAccess.pdb | Bin 0 -> 44544 bytes .../Common/dll/DoWhatPlc.dll | Bin 0 -> 19456 bytes .../Common/dll/DoWhatPlc.pdb | Bin 0 -> 56832 bytes .../dll/MQTTnet.Extensions.ManagedClient.dll | Bin 0 -> 45568 bytes .../99DataBaseAccess2/Common/dll/MQTTnet.dll | Bin 0 -> 293376 bytes .../Common/dll/MesWorkMqtt.dll | Bin 0 -> 10240 bytes .../Common/dll/MesWorkMqtt.pdb | Bin 0 -> 24064 bytes .../Common/dll/Newtonsoft.Json.dll | Bin 0 -> 502272 bytes .../Common/dll/WebApiCall.dll | Bin 0 -> 21504 bytes .../Common/dll/WebApiCall.dll.config | 11 + .../Common/dll/WebApiCall.pdb | Bin 0 -> 75264 bytes Common/99DataBaseAccess2/DataBaseAccess.sln | 25 + .../DataBaseAccess/99-DataBaseAccess2.csproj | 54 + .../DataBaseAccess/DataAccess.cs | 611 ++++ .../DataBaseAccess/JsonHelper.cs | 336 ++ .../DataBaseAccess/Properties/AssemblyInfo.cs | 36 + Common/DoWhatPlc/01_01DoWhatPlc.csproj | 56 + Common/DoWhatPlc/DoWhat.cs | 1299 +++++++ Common/DoWhatPlc/Properties/AssemblyInfo.cs | 36 + Common/DoWhatPlc/TagTypeCodeID.cs | 463 +++ Common/DoWhatPlc/TagTypeID.cs | 28 + Common/DoWhatPlc/packages.config | 4 + Common/MesControl/MesBoolSignal.Designer.cs | 79 + Common/MesControl/MesBoolSignal.cs | 111 + Common/MesControl/MesBoolSignal.resx | 126 + Common/MesControl/MesControl.csproj | 139 + Common/MesControl/PlcConnect.Designer.cs | 81 + Common/MesControl/PlcConnect.cs | 221 ++ Common/MesControl/PlcConnect.resx | 129 + .../PlcWorkStationSignal.Designer.cs | 80 + Common/MesControl/PlcWorkStationSignal.cs | 225 ++ Common/MesControl/PlcWorkStationSignal.resx | 123 + Common/MesControl/Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 193 ++ Common/MesControl/Properties/Resources.resx | 160 + Common/MesControl/Properties/_system~.ini | 0 Common/MesControl/Resources/BreakPLC.png | Bin 0 -> 4041 bytes Common/MesControl/Resources/PlcConnect0.png | Bin 0 -> 2859 bytes Common/MesControl/Resources/PlcConnect1.png | Bin 0 -> 2936 bytes Common/MesControl/Resources/PlcConnect2.png | Bin 0 -> 3271 bytes Common/MesControl/Resources/PlcConnect3.png | Bin 0 -> 3647 bytes Common/MesControl/Resources/PlcConnect4.png | Bin 0 -> 4047 bytes Common/MesControl/Resources/PlcConnectBig.png | Bin 0 -> 4061 bytes .../MesControl/Resources/PlcConnectSmall.png | Bin 0 -> 3265 bytes Common/MesControl/Resources/_system~.ini | 0 Common/MesControl/Resources/green.png | Bin 0 -> 3885 bytes Common/MesControl/Resources/init.png | Bin 0 -> 3902 bytes Common/MesControl/Resources/none.png | Bin 0 -> 3888 bytes Common/MesControl/Resources/red.png | Bin 0 -> 3852 bytes Common/MesControl/Resources/yellow.png | Bin 0 -> 3905 bytes Common/MesControl/SignalInit.cs | 37 + Common/MesControl/_system~.ini | 0 Common/MyLog4Net/00_MyLog4Net.csproj | 61 + Common/MyLog4Net/MyLogEventArgs.cs | 14 + Common/MyLog4Net/MyLogHelper.cs | 65 + Common/MyLog4Net/Properties/AssemblyInfo.cs | 37 + Common/MyLog4Net/log4net.config | 35 + Common/MyLog4Net/packages.config | 4 + Common/WebApiDll/DoWhatPlc.dll | Bin 0 -> 35328 bytes Common/WebApiDll/DoWhatPlc.pdb | Bin 0 -> 116224 bytes Common/WebApiDll/Newtonsoft.Json.dll | Bin 0 -> 504320 bytes Common/dll/00.1Newtonsoft.Json.dll | Bin 0 -> 587776 bytes Common/dll/00.1Newtonsoft.Json.pdb | Bin 0 -> 1969664 bytes Common/dll/00MesWorkMqtt.dll | Bin 0 -> 12288 bytes Common/dll/00MesWorkMqtt.pdb | Bin 0 -> 32256 bytes Common/dll/01DoWhatPlc.dll | Bin 0 -> 20480 bytes Common/dll/01DoWhatPlc.pdb | Bin 0 -> 60928 bytes Common/dll/02WebApiCall.dll | Bin 0 -> 33280 bytes Common/dll/02WebApiCall.dll.config | 11 + Common/dll/02WebApiCall.pdb | Bin 0 -> 120320 bytes Common/dll/04DataBaseAccess.dll | Bin 0 -> 16896 bytes Common/dll/04DataBaseAccess.pdb | Bin 0 -> 48640 bytes Common/dll/07BusinessFacade.dll | Bin 0 -> 184832 bytes Common/dll/07BusinessFacade.pdb | Bin 0 -> 517632 bytes Common/dll/08WebFun_base.dll | Bin 0 -> 126464 bytes Common/dll/08WebFun_base.pdb | Bin 0 -> 452096 bytes Common/dll/09MesDataFunction.dll | Bin 0 -> 54272 bytes Common/dll/09MesDataFunction.pdb | Bin 0 -> 196096 bytes Common/dll/99DataBaseAccess2.dll | Bin 0 -> 16896 bytes Common/dll/99DataBaseAccess2.pdb | Bin 0 -> 48640 bytes Common/dll/BasicData.dll | Bin 0 -> 60416 bytes Common/dll/BasicData.pdb | Bin 0 -> 75264 bytes Common/dll/BouncyCastle.Crypto.dll | Bin 0 -> 2740824 bytes Common/dll/BusinessFacade.pdb | Bin 0 -> 460288 bytes Common/dll/ConLink.dll | Bin 0 -> 931840 bytes Common/dll/DataLinkMesWork.dll | Bin 0 -> 224256 bytes Common/dll/DoWhatPlc.dll | Bin 0 -> 35328 bytes Common/dll/DoWhatPlc.pdb | Bin 0 -> 116224 bytes Common/dll/ICSharpCode.SharpZipLib.dll | Bin 0 -> 227328 bytes .../dll/MQTTnet.Extensions.ManagedClient.dll | Bin 0 -> 45568 bytes Common/dll/MQTTnet.dll | Bin 0 -> 293376 bytes Common/dll/MesControl.dll | Bin 0 -> 104960 bytes Common/dll/MesControl.pdb | Bin 0 -> 48640 bytes Common/dll/MesWork.DeviceDriver.dll | Bin 0 -> 166912 bytes Common/dll/MesWork.DeviceDriver.pdb | Bin 0 -> 316928 bytes Common/dll/MesWork.PLC.dll | Bin 0 -> 739840 bytes Common/dll/MesWork.PLC.pdb | Bin 0 -> 290304 bytes Common/dll/Monitor.MesWork.dll | Bin 0 -> 242688 bytes Common/dll/Monitor.MesWork.pdb | Bin 0 -> 243200 bytes Common/dll/Monitor.MesWork.xml | 2860 ++++++++++++++++ Common/dll/NPOI.OOXML.dll | Bin 0 -> 596480 bytes Common/dll/NPOI.OpenXml4Net.dll | Bin 0 -> 98816 bytes Common/dll/NPOI.OpenXmlFormats.dll | Bin 0 -> 2356224 bytes Common/dll/NPOI.dll | Bin 0 -> 1882112 bytes Common/dll/Newtonsoft.Json.dll | Bin 0 -> 701992 bytes Common/dll/Opc.Ua.Client.dll | Bin 0 -> 123792 bytes Common/dll/Opc.Ua.Configuration.dll | Bin 0 -> 67464 bytes Common/dll/Opc.Ua.Core.dll | Bin 0 -> 5484944 bytes Common/dll/OpcUaHelper.dll | Bin 0 -> 173056 bytes Common/dll/OpcUaHelper.pdb | Bin 0 -> 198144 bytes Common/dll/OpcUaHelper.xml | 1281 +++++++ MESUploadFileProject.ashx | 85 + MES基础数据.xlsx | Bin 0 -> 140111 bytes MIS_FuntionSaveData/MIS_FuntionSaveData.sln | 25 + .../13.3MIS_FuntionSaveData.csproj | 99 + .../MIS_FuntionSaveData/Funtion.Alarm.cs | 277 ++ .../Funtion.EngTypeGetOver.cs | 107 + .../MIS_FuntionSaveData/Funtion.MesRead.cs | 777 +++++ .../MIS_FuntionSaveData/Funtion.WorkStart.cs | 186 + .../MIS_FuntionSaveData/MIS_Funtion.cs | 269 ++ .../Properties/AssemblyInfo.cs | 36 + Mes32X32.ico | Bin 0 -> 4286 bytes MesMonitor/--PlcMonitor/PlcMonitor.sln | 25 + MesMonitor/--PlcMonitor/PlcMonitor/App.config | 6 + .../--PlcMonitor/PlcMonitor/Form1.Designer.cs | 41 + MesMonitor/--PlcMonitor/PlcMonitor/Form1.cs | 20 + .../--PlcMonitor/PlcMonitor/PlcMonitor.csproj | 80 + MesMonitor/--PlcMonitor/PlcMonitor/Program.cs | 22 + .../PlcMonitor/Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 70 + .../PlcMonitor/Properties/Resources.resx | 117 + .../Properties/Settings.Designer.cs | 29 + .../PlcMonitor/Properties/Settings.settings | 7 + .../FunctionForm_HashiTable.cs | 103 + .../MainSignalChangeEvent.cs | 55 + .../PlcSignalDynamicCreate.cs | 138 + .../SecondForm.Designer.cs | 91 + .../--SignalChangeMonitor/SecondForm.cs | 231 ++ .../--SignalChangeMonitor/SecondForm.resx | 123 + .../SecondFormDelegate.cs | 15 + MesMonitor/--SignalChangeMonitor/vssver2.scc | Bin 0 -> 344 bytes MesMonitor/MonitorForm/App.config | 16 + MesMonitor/MonitorForm/Form1.Designer.cs | 41 + MesMonitor/MonitorForm/Form1.cs | 20 + .../MonitorForm/FunctionForm_HashiTable.cs | 103 + .../MonitorForm/MainSignalChangeEvent.cs | 126 + MesMonitor/MonitorForm/Mes32X32.ico | Bin 0 -> 4286 bytes MesMonitor/MonitorForm/MonitorForm.csproj | 136 + MesMonitor/MonitorForm/MonitorForm.sln | 25 + .../MonitorForm/PlcSignalDynamicCreate.cs | 138 + MesMonitor/MonitorForm/Program.cs | 22 + .../MonitorForm/Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 70 + .../MonitorForm/Properties/Resources.resx | 117 + .../Properties/Settings.Designer.cs | 29 + .../MonitorForm/Properties/Settings.settings | 7 + MesMonitor/MonitorForm/SecondForm.Designer.cs | 83 + MesMonitor/MonitorForm/SecondForm.cs | 86 + MesMonitor/MonitorForm/SecondForm.resx | 197 ++ MesMonitor/MonitorForm/SecondFormDelegate.cs | 15 + .../MesBoolSignal.Designer.cs | 79 + .../MesBoolSignal.cs | 111 + .../MesBoolSignal.resx | 126 + .../MesControl.csproj | 139 + .../SignalChangeMonitorControl/MesControl.sln | 55 + .../PlcConnect.Designer.cs | 81 + .../SignalChangeMonitorControl/PlcConnect.cs | 221 ++ .../PlcConnect.resx | 129 + .../PlcWorkStationSignal.Designer.cs | 80 + .../PlcWorkStationSignal.cs | 228 ++ .../PlcWorkStationSignal.resx | 123 + .../Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 193 ++ .../Properties/Resources.resx | 160 + .../Properties/_system~.ini | 0 .../Resources/BreakPLC.png | Bin 0 -> 4041 bytes .../Resources/PlcConnect0.png | Bin 0 -> 2859 bytes .../Resources/PlcConnect1.png | Bin 0 -> 2936 bytes .../Resources/PlcConnect2.png | Bin 0 -> 3271 bytes .../Resources/PlcConnect3.png | Bin 0 -> 3647 bytes .../Resources/PlcConnect4.png | Bin 0 -> 4047 bytes .../Resources/PlcConnectBig.png | Bin 0 -> 4061 bytes .../Resources/PlcConnectSmall.png | Bin 0 -> 3265 bytes .../Resources/_system~.ini | 0 .../Resources/green.png | Bin 0 -> 3885 bytes .../Resources/init.png | Bin 0 -> 3902 bytes .../Resources/none.png | Bin 0 -> 3888 bytes .../Resources/red.png | Bin 0 -> 3852 bytes .../Resources/yellow.png | Bin 0 -> 3905 bytes .../SignalChangeMonitorControl/SignalInit.cs | 37 + .../SignalChangeMonitorControl/_system~.ini | 0 MisDataFun/MesFun/App.config | 29 + MisDataFun/MesFun/MesFun.csproj | 99 + MisDataFun/MesFun/MesFunction.Designer.cs | 40 + MisDataFun/MesFun/MesFunction.cs | 42 + MisDataFun/MesFun/Program.cs | 22 + MisDataFun/MesFun/Properties/AssemblyInfo.cs | 36 + .../MesFun/Properties/Resources.Designer.cs | 71 + MisDataFun/MesFun/Properties/Resources.resx | 117 + .../MesFun/Properties/Settings.Designer.cs | 30 + .../MesFun/Properties/Settings.settings | 7 + MisDataFun/MesFunDll/MesFunDll.cs | 12 + MisDataFun/MesFunDll/MesFunDll.csproj | 48 + .../MesFunDll/Properties/AssemblyInfo.cs | 36 + MisDataFun/MisDataFun.sln | 233 ++ MisDataFun/MisDataFun/AgvApiHelper.cs | 431 +++ MisDataFun/MisDataFun/App.config | 50 + MisDataFun/MisDataFun/Mes32X32.ico | Bin 0 -> 4286 bytes .../MisDataFun/MisAddition/ControlData.cs | 38 + .../MisDataFun/MisAddition/ForOtherForm.cs | 83 + .../MisAddition/ManualSimulateSignal.cs | 515 +++ .../MisDataFun/MisAddition/MisAdditionInit.cs | 89 + .../MisAddition/QualityDataQueryStruct.cs | 87 + .../MisAddition/ReadThisStationProductInfo.cs | 107 + .../MisDataFun/MisAddition/TestPlcConnect.cs | 175 + .../MisAddition/ThisStationStatusDisplay.cs | 128 + .../WriteQualityValueForm.Designer.cs | 114 + .../MisAddition/WriteQualityValueForm.cs | 275 ++ .../MisAddition/WriteQualityValueForm.resx | 120 + MisDataFun/MisDataFun/MisDataFun.Designer.cs | 1306 +++++++ MisDataFun/MisDataFun/MisDataFun.cs | 1284 +++++++ MisDataFun/MisDataFun/MisDataFun.csproj | 268 ++ MisDataFun/MisDataFun/MisDataFun.resx | 218 ++ MisDataFun/MisDataFun/OrderForm.Designer.cs | 417 +++ MisDataFun/MisDataFun/OrderForm.cs | 73 + MisDataFun/MisDataFun/OrderForm.resx | 228 ++ MisDataFun/MisDataFun/Program.cs | 28 + .../MisDataFun/Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 63 + .../MisDataFun/Properties/Resources.resx | 117 + .../Properties/Settings.Designer.cs | 26 + .../MisDataFun/Properties/Settings.settings | 7 + MisDataFun/MisDataFun/jsconfig1.json | 10 + .../12SendMessageToWeb.csproj | 70 + .../InitHashtable_MesServerCode.cs | 52 + .../Properties/AssemblyInfo.cs | 36 + .../SendMessageToWebMqtt/SendMessage.cs | 736 ++++ .../SendMessageToWebMqtt/SendMessageFun.cs | 231 ++ MisDataFun/WebSubmit/13.1WebSubmit.csproj | 102 + MisDataFun/WebSubmit/Db.cs | 74 + .../MesServerFunction/Fun_WebSubmit.cs | 100 + .../WebSubmit/MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 286 ++ .../WebSubmit/Methods/SubmitToMisweb.cs | 145 + MisDataFun/WebSubmit/Methods/UDP.Send.cs | 62 + MisDataFun/WebSubmit/Methods/vssver2.scc | Bin 0 -> 199 bytes MisDataFun/WebSubmit/OpcServer/Barcode.cs | 86 + MisDataFun/WebSubmit/OpcServer/ConfirmOkGo.cs | 35 + .../WebSubmit/OpcServer/EngineGetOver.cs | 87 + MisDataFun/WebSubmit/OpcServer/FalseGO.cs | 37 + MisDataFun/WebSubmit/OpcServer/MesRead.cs | 49 + MisDataFun/WebSubmit/OpcServer/MesReadOver.cs | 37 + MisDataFun/WebSubmit/OpcServer/WebSubmit.cs | 309 ++ MisDataFun/WebSubmit/OpcServer/WorkStart.cs | 59 + MisDataFun/WebSubmit/OpcServer/vssver2.scc | Bin 0 -> 305 bytes .../WebSubmit/Properties/AssemblyInfo.cs | 36 + MisDataFunDll/MisDataFunDll.sln | 25 + .../MisDataFunDll/13.4MisDataFunction.csproj | 90 + .../MisDataFunDll/MisDataFun.MES.New.cs | 161 + MisDataFunDll/MisDataFunDll/MisDataFun.MES.cs | 458 +++ .../MisDataFunDll/MisDataFun.MIS_Funtion.cs | 301 ++ .../MisDataFunDll/Properties/AssemblyInfo.cs | 36 + MisDataFunDll/MisDataFunDll/Reflection.cs | 94 + .../Function1051/DataAccess/DataAccess.cs | 16 + .../Function1051/DataAccess/vssver2.scc | Bin 0 -> 129 bytes .../MesServer.Function/Function1051/Db.cs | 112 + .../Function1051/Function08.csproj.vspscc | 10 + .../Function1051/Function1051.csproj | 170 + .../MesServerFunction/Function1051.cs | 283 ++ .../MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 341 ++ .../Function1051/Methods/SubmitToMisweb.cs | 145 + .../Function1051/Methods/UDP.Send.cs | 62 + .../Function1051/Methods/vssver2.scc | Bin 0 -> 199 bytes .../Function1051/OpcServer/Barcode.cs | 237 ++ .../Function1051/OpcServer/ConfirmOkGo.cs | 35 + .../Function1051/OpcServer/EngineGetOver.cs | 130 + .../Function1051/OpcServer/FalseGO.cs | 37 + .../Function1051/OpcServer/HeartBeat.cs | 62 + .../Function1051/OpcServer/MesRead.cs | 141 + .../Function1051/OpcServer/MesReadOver.cs | 37 + .../Function1051/OpcServer/PartLoad.cs | 68 + .../OpcServer/PartLoadInPallet.cs | 43 + .../Function1051/OpcServer/WebSubmit.cs | 409 +++ .../Function1051/OpcServer/WorkStart.cs | 69 + .../Function1051/OpcServer/vssver2.scc | Bin 0 -> 305 bytes .../Function1051/Properties/AssemblyInfo.cs | 36 + .../Function1051/Properties/vssver2.scc | Bin 0 -> 131 bytes .../Function1051/app.config | 19 + .../Function1051/mssccprj.scc | 5 + .../Function1051/packages.config | 15 + .../Function1051/vssver2.scc | Bin 0 -> 163 bytes .../Function1052/DataAccess/DataAccess.cs | 15 + .../Function1052/DataAccess/vssver2.scc | Bin 0 -> 129 bytes .../Function1052/Function02.csproj.vspscc | 10 + .../Function1052/Function1052.csproj | 171 + .../MesServerFunction/Fun_1052.cs | 239 ++ .../MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 123 + .../Function1052/Methods/SubmitToMisweb.cs | 127 + .../Function1052/Methods/UDP.Send.cs | 53 + .../Function1052/Methods/vssver2.scc | Bin 0 -> 199 bytes .../Function1052/OpcServer/Barcode.cs | 90 + .../Function1052/OpcServer/ConfirmOkGo.cs | 41 + .../Function1052/OpcServer/EngineGetOver.cs | 126 + .../Function1052/OpcServer/FalseGO.cs | 46 + .../Function1052/OpcServer/HeartBeat.cs | 35 + .../Function1052/OpcServer/MesRead.cs | 119 + .../Function1052/OpcServer/MesReadOver.cs | 55 + .../Function1052/OpcServer/MesSaveNowData.cs | 40 + .../Function1052/OpcServer/WebSubmit.cs | 376 ++ .../Function1052/OpcServer/WorkIsOk.cs | 45 + .../Function1052/OpcServer/WorkStart.cs | 57 + .../Function1052/OpcServer/vssver2.scc | Bin 0 -> 332 bytes .../Function1052/Properties/AssemblyInfo.cs | 36 + .../Function1052/Properties/vssver2.scc | Bin 0 -> 131 bytes .../Function1052/app.config | 19 + .../Function1052/mssccprj.scc | 5 + .../Function1052/packages.config | 15 + .../Function1052/vssver2.scc | Bin 0 -> 163 bytes .../Function1053/DataAccess/DataAccess.cs | 15 + .../Function1053/DataAccess/vssver2.scc | Bin 0 -> 129 bytes .../MesServer.Function/Function1053/Db.cs | 111 + .../Function1053/Function02.csproj.vspscc | 10 + .../Function1053/Function1053.csproj | 170 + .../MesServerFunction/Fun_1053.cs | 261 ++ .../MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 182 + .../Function1053/Methods/SubmitToMisweb.cs | 127 + .../Function1053/Methods/UDP.Send.cs | 53 + .../Function1053/Methods/vssver2.scc | Bin 0 -> 199 bytes .../Function1053/OpcServer/Barcode.cs | 80 + .../Function1053/OpcServer/ConfirmOkGo.cs | 41 + .../Function1053/OpcServer/EngineGetOver.cs | 74 + .../Function1053/OpcServer/FalseGO.cs | 46 + .../Function1053/OpcServer/HeartBeat.cs | 35 + .../Function1053/OpcServer/MesRead.cs | 99 + .../Function1053/OpcServer/MesReadOver.cs | 55 + .../Function1053/OpcServer/MesSaveNowData.cs | 40 + .../Function1053/OpcServer/PartLoad.cs | 99 + .../Function1053/OpcServer/WebSubmit.cs | 367 ++ .../Function1053/OpcServer/WorkIsOk.cs | 45 + .../Function1053/OpcServer/WorkStart.cs | 50 + .../Function1053/OpcServer/vssver2.scc | Bin 0 -> 332 bytes .../Function1053/Properties/AssemblyInfo.cs | 36 + .../Function1053/Properties/vssver2.scc | Bin 0 -> 131 bytes .../Function1053/app.config | 19 + .../Function1053/mssccprj.scc | 5 + .../Function1053/packages.config | 15 + .../Function1053/vssver2.scc | Bin 0 -> 163 bytes .../Function1054/DataAccess/DataAccess.cs | 15 + .../Function1054/DataAccess/vssver2.scc | Bin 0 -> 129 bytes .../MesServer.Function/Function1054/Db.cs | 84 + .../Function1054/Function02.csproj.vspscc | 10 + .../Function1054/Function1054.csproj | 169 + .../MesServerFunction/Fun_1054.cs | 237 ++ .../MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 181 + .../Function1054/Methods/SubmitToMisweb.cs | 127 + .../Function1054/Methods/UDP.Send.cs | 53 + .../Function1054/Methods/vssver2.scc | Bin 0 -> 199 bytes .../Function1054/OpcServer/Barcode.cs | 90 + .../Function1054/OpcServer/ConfirmOkGo.cs | 41 + .../Function1054/OpcServer/EngineGetOver.cs | 79 + .../Function1054/OpcServer/FalseGO.cs | 46 + .../Function1054/OpcServer/HeartBeat.cs | 35 + .../Function1054/OpcServer/MesRead.cs | 68 + .../Function1054/OpcServer/MesReadOver.cs | 55 + .../Function1054/OpcServer/MesSaveNowData.cs | 40 + .../Function1054/OpcServer/WebSubmit.cs | 304 ++ .../Function1054/OpcServer/WorkIsOk.cs | 45 + .../Function1054/OpcServer/WorkStart.cs | 50 + .../Function1054/OpcServer/vssver2.scc | Bin 0 -> 332 bytes .../Function1054/Properties/AssemblyInfo.cs | 36 + .../Function1054/Properties/vssver2.scc | Bin 0 -> 131 bytes .../Function1054/app.config | 19 + .../Function1054/mssccprj.scc | 5 + .../Function1054/packages.config | 15 + .../Function1054/vssver2.scc | Bin 0 -> 163 bytes .../Function1055/DataAccess/DataAccess.cs | 15 + .../Function1055/DataAccess/vssver2.scc | Bin 0 -> 129 bytes .../MesServer.Function/Function1055/Db.cs | 60 + .../Function1055/Function02.csproj.vspscc | 10 + .../Function1055/Function1055.csproj | 169 + .../MesServerFunction/Fun_1055.cs | 242 ++ .../MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 120 + .../Function1055/Methods/SubmitToMisweb.cs | 127 + .../Function1055/Methods/UDP.Send.cs | 53 + .../Function1055/Methods/vssver2.scc | Bin 0 -> 199 bytes .../Function1055/OpcServer/Barcode.cs | 90 + .../Function1055/OpcServer/ConfirmOkGo.cs | 41 + .../Function1055/OpcServer/EngineGetOver.cs | 79 + .../Function1055/OpcServer/FalseGO.cs | 46 + .../Function1055/OpcServer/HeartBeat.cs | 35 + .../Function1055/OpcServer/MesRead.cs | 77 + .../Function1055/OpcServer/MesReadOver.cs | 55 + .../Function1055/OpcServer/MesSaveNowData.cs | 40 + .../Function1055/OpcServer/WebSubmit.cs | 304 ++ .../Function1055/OpcServer/WorkIsOk.cs | 45 + .../Function1055/OpcServer/WorkStart.cs | 53 + .../Function1055/OpcServer/vssver2.scc | Bin 0 -> 332 bytes .../Function1055/Properties/AssemblyInfo.cs | 36 + .../Function1055/Properties/vssver2.scc | Bin 0 -> 131 bytes .../Function1055/app.config | 19 + .../Function1055/mssccprj.scc | 5 + .../Function1055/packages.config | 15 + .../Function1055/vssver2.scc | Bin 0 -> 163 bytes .../Function1056/DataAccess/DataAccess.cs | 15 + .../Function1056/DataAccess/vssver2.scc | Bin 0 -> 129 bytes .../MesServer.Function/Function1056/Db.cs | 57 + .../Function1056/Function02.csproj.vspscc | 10 + .../Function1056/Function1056.csproj | 169 + .../MesServerFunction/Fun_1056.cs | 223 ++ .../MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 109 + .../Function1056/Methods/SubmitToMisweb.cs | 127 + .../Function1056/Methods/UDP.Send.cs | 53 + .../Function1056/Methods/vssver2.scc | Bin 0 -> 199 bytes .../Function1056/OpcServer/Barcode.cs | 98 + .../Function1056/OpcServer/ConfirmOkGo.cs | 41 + .../Function1056/OpcServer/EngineGetOver.cs | 67 + .../Function1056/OpcServer/FalseGO.cs | 41 + .../Function1056/OpcServer/HeartBeat.cs | 35 + .../Function1056/OpcServer/MesRead.cs | 92 + .../Function1056/OpcServer/MesReadOver.cs | 55 + .../Function1056/OpcServer/MesSaveNowData.cs | 40 + .../Function1056/OpcServer/WebSubmit.cs | 294 ++ .../Function1056/OpcServer/WorkStart.cs | 46 + .../Function1056/OpcServer/WritePLC.cs | 41 + .../Function1056/OpcServer/vssver2.scc | Bin 0 -> 332 bytes .../Function1056/Properties/AssemblyInfo.cs | 36 + .../Function1056/Properties/vssver2.scc | Bin 0 -> 131 bytes .../Function1056/app.config | 19 + .../Function1056/mssccprj.scc | 5 + .../Function1056/packages.config | 15 + .../Function1056/vssver2.scc | Bin 0 -> 163 bytes .../Function1057/DataAccess/DataAccess.cs | 15 + .../Function1057/DataAccess/vssver2.scc | Bin 0 -> 129 bytes .../MesServer.Function/Function1057/Db.cs | 67 + .../Function1057/Function02.csproj.vspscc | 10 + .../Function1057/Function1057.csproj | 167 + .../MesServerFunction/Fun_1057.cs | 206 ++ .../MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 98 + .../Function1057/Methods/SubmitToMisweb.cs | 127 + .../Function1057/Methods/UDP.Send.cs | 53 + .../Function1057/Methods/vssver2.scc | Bin 0 -> 199 bytes .../Function1057/OpcServer/Barcode.cs | 228 ++ .../Function1057/OpcServer/ConfirmOkGo.cs | 41 + .../Function1057/OpcServer/EngineGetOver.cs | 79 + .../Function1057/OpcServer/FalseGO.cs | 41 + .../Function1057/OpcServer/HeartBeat.cs | 35 + .../Function1057/OpcServer/MesRead.cs | 123 + .../Function1057/OpcServer/MesReadOver.cs | 55 + .../Function1057/OpcServer/WebSubmit.cs | 307 ++ .../Function1057/OpcServer/WorkStart.cs | 44 + .../Function1057/OpcServer/vssver2.scc | Bin 0 -> 332 bytes .../Function1057/Properties/AssemblyInfo.cs | 36 + .../Function1057/Properties/vssver2.scc | Bin 0 -> 131 bytes .../Function1057/app.config | 19 + .../Function1057/mssccprj.scc | 5 + .../Function1057/packages.config | 15 + .../Function1057/vssver2.scc | Bin 0 -> 163 bytes .../Function1058/DataAccess/DataAccess.cs | 16 + .../Function1058/DataAccess/vssver2.scc | Bin 0 -> 129 bytes .../MesServer.Function/Function1058/Db.cs | 74 + .../Function1058/Function08.csproj.vspscc | 10 + .../Function1058/Function1058.csproj | 168 + .../MesServerFunction/Function1058.cs | 253 ++ .../MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 288 ++ .../Function1058/Methods/SubmitToMisweb.cs | 145 + .../Function1058/Methods/UDP.Send.cs | 62 + .../Function1058/Methods/vssver2.scc | Bin 0 -> 199 bytes .../Function1058/OpcServer/Barcode.cs | 220 ++ .../Function1058/OpcServer/ConfirmOkGo.cs | 35 + .../Function1058/OpcServer/EngineGetOver.cs | 98 + .../Function1058/OpcServer/FalseGO.cs | 37 + .../Function1058/OpcServer/HeartBeat.cs | 35 + .../Function1058/OpcServer/MesRead.cs | 85 + .../Function1058/OpcServer/MesReadOver.cs | 37 + .../Function1058/OpcServer/WebSubmit.cs | 342 ++ .../Function1058/OpcServer/WorkStart.cs | 55 + .../Function1058/OpcServer/vssver2.scc | Bin 0 -> 305 bytes .../Function1058/Properties/AssemblyInfo.cs | 36 + .../Function1058/Properties/vssver2.scc | Bin 0 -> 131 bytes .../Function1058/app.config | 19 + .../Function1058/mssccprj.scc | 5 + .../Function1058/packages.config | 15 + .../Function1058/vssver2.scc | Bin 0 -> 163 bytes .../Function1059/DataAccess/DataAccess.cs | 16 + .../Function1059/DataAccess/vssver2.scc | Bin 0 -> 129 bytes .../MesServer.Function/Function1059/Db.cs | 74 + .../Function1059/Function1059.csproj | 113 + .../MesServerFunction/Function1059.cs | 270 ++ .../MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 279 ++ .../Function1059/Methods/SubmitToMisweb.cs | 145 + .../Function1059/Methods/UDP.Send.cs | 62 + .../Function1059/Methods/vssver2.scc | Bin 0 -> 199 bytes .../Function1059/OpcServer/Barcode.cs | 239 ++ .../Function1059/OpcServer/ConfirmOkGo.cs | 35 + .../Function1059/OpcServer/EngineGetOver.cs | 108 + .../Function1059/OpcServer/FalseGO.cs | 37 + .../Function1059/OpcServer/HeartBeat.cs | 35 + .../Function1059/OpcServer/MesRead.cs | 77 + .../Function1059/OpcServer/MesReadOver.cs | 37 + .../Function1059/OpcServer/MesSaveNowData.cs | 35 + .../Function1059/OpcServer/PartLoad.cs | 39 + .../Function1059/OpcServer/WebSubmit.cs | 343 ++ .../Function1059/OpcServer/WorkStart.cs | 75 + .../Function1059/OpcServer/vssver2.scc | Bin 0 -> 305 bytes .../Function1059/Properties/AssemblyInfo.cs | 36 + .../Function1059/app.config | 19 + .../Function1059/mssccprj.scc | 5 + .../Function1059/packages.config | 15 + .../Function1060/DataAccess/DataAccess.cs | 15 + .../Function1060/DataAccess/vssver2.scc | Bin 0 -> 129 bytes .../MesServer.Function/Function1060/Db.cs | 74 + .../Function1060/Function1060.csproj | 109 + .../MesServerFunction/Fun_1060.cs | 217 ++ .../MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 96 + .../Function1060/Methods/SubmitToMisweb.cs | 127 + .../Function1060/Methods/UDP.Send.cs | 53 + .../Function1060/Methods/vssver2.scc | Bin 0 -> 199 bytes .../Function1060/OpcServer/Barcode.cs | 97 + .../Function1060/OpcServer/ConfirmOkGo.cs | 41 + .../Function1060/OpcServer/EngineGetOver.cs | 90 + .../Function1060/OpcServer/FalseGO.cs | 41 + .../Function1060/OpcServer/HeartBeat.cs | 35 + .../Function1060/OpcServer/MesRead.cs | 72 + .../Function1060/OpcServer/MesReadOver.cs | 55 + .../Function1060/OpcServer/MesSaveNowData.cs | 35 + .../Function1060/OpcServer/PartLoad.cs | 23 + .../Function1060/OpcServer/WebSubmit.cs | 334 ++ .../Function1060/OpcServer/WorkStart.cs | 91 + .../Function1060/OpcServer/vssver2.scc | Bin 0 -> 332 bytes .../Function1060/Properties/AssemblyInfo.cs | 36 + .../Function1060/app.config | 19 + .../Function1060/packages.config | 15 + MisDataFunction/MisDataFunction.sln | 127 + MisDataPlcTagID/MisDataPlcTagID.sln | 25 + .../20-12MisDataPlcTagID.csproj | 148 + MisDataPlcTagID/MisDataPlcTagID/Class1.cs | 12 + .../MisDataPlcTagID/ListViewNF .cs | 28 + .../MisDataPlcTagID/ManualSimulateSignal.cs | 522 +++ .../ManualSimulateSignalSim.cs | 522 +++ .../MisDataPlcTagID/MisDataWebFun.Designer.cs | 1923 +++++++++++ .../MisDataPlcTagID/MisDataWebFun.cs | 1043 ++++++ .../MisDataPlcTagID/MisDataWebFun.resx | 212 ++ .../MisDataWebFunSim.Designer.cs | 1776 ++++++++++ .../MisDataPlcTagID/MisDataWebFunSim.cs | 1022 ++++++ .../MisDataPlcTagID/MisDataWebFunSim.resx | 209 ++ .../Properties/AssemblyInfo.cs | 36 + .../ReadThisStationProductInfo.cs | 107 + .../ReadThisStationProductInfoSim.cs | 107 + .../WriteQualityValueForm.Designer.cs | 115 + .../MisDataPlcTagID/WriteQualityValueForm.cs | 267 ++ .../WriteQualityValueForm.resx | 120 + .../WriteQualityValueFormSim.Designer.cs | 115 + .../WriteQualityValueFormSim.cs | 267 ++ .../WriteQualityValueFormSim.resx | 120 + MisDataPlcTagID/Properties/AssemblyInfo.cs | 36 + MisDataSaveDate/MisDataSaveDate.sln | 25 + MisDataSaveDate/MisDataSaveDate/App.config | 22 + .../MisDataSaveDate/Funtion .Mqtt.cs | 55 + .../MisDataSaveDate/Funtion.Alarm.cs | 75 + .../MisDataSaveDate/Funtion.EngTypeGetOver.cs | 104 + .../MisDataSaveDate/Funtion.MesRead.cs | 351 ++ .../MisDataSaveDate/Funtion.WorkStart.cs | 228 ++ MisDataSaveDate/MisDataSaveDate/Funtion.cs | 152 + .../MisDataSaveDate/MisDataSaveDate.csproj | 159 + MisDataSaveDate/MisDataSaveDate/Program.cs | 22 + .../Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 70 + .../MisDataSaveDate/Properties/Resources.resx | 117 + .../Properties/Settings.Designer.cs | 29 + .../Properties/Settings.settings | 7 + .../MisDataSaveDate/SaveData.Designer.cs | 49 + MisDataSaveDate/MisDataSaveDate/SaveData.cs | 69 + MisDataSaveDate/MisDataSaveDate/SaveData.resx | 120 + .../MisDataSaveDate/packages.config | 15 + MisDataSaveDate/dll/00MesWorkMqtt.dll | Bin 0 -> 10240 bytes MisDataSaveDate/dll/00MesWorkMqtt.pdb | Bin 0 -> 24064 bytes MisDataSaveDate/dll/01DoWhatPlc.dll | Bin 0 -> 19456 bytes MisDataSaveDate/dll/01DoWhatPlc.pdb | Bin 0 -> 56832 bytes MisDataSaveDate/dll/02WebApiCall.dll | Bin 0 -> 21504 bytes MisDataSaveDate/dll/02WebApiCall.dll.config | 11 + MisDataSaveDate/dll/02WebApiCall.pdb | Bin 0 -> 75264 bytes MisDataSaveDate/dll/04DataBaseAccess.dll | Bin 0 -> 15872 bytes MisDataSaveDate/dll/04DataBaseAccess.pdb | Bin 0 -> 44544 bytes MisDataSaveDate/dll/07BusinessFacade.dll | Bin 0 -> 167936 bytes MisDataSaveDate/dll/07BusinessFacade.pdb | Bin 0 -> 466432 bytes MisDataSaveDate/dll/08WebFun_base.dll | Bin 0 -> 125440 bytes MisDataSaveDate/dll/08WebFun_base.pdb | Bin 0 -> 443904 bytes MisDataSaveDate/dll/09MesDataFunction.dll | Bin 0 -> 42496 bytes MisDataSaveDate/dll/09MesDataFunction.pdb | Bin 0 -> 161280 bytes MisDataSaveDate/dll/BusinessFacade.pdb | Bin 0 -> 460288 bytes .../dll/MQTTnet.Extensions.ManagedClient.dll | Bin 0 -> 45568 bytes MisDataSaveDate/dll/MQTTnet.dll | Bin 0 -> 293376 bytes MisDataSaveDate/dll/Newtonsoft.Json.dll | Bin 0 -> 502272 bytes MisDataSaveDateDll/MisDataSaveDate.sln | 25 + MisDataSaveDateDll/MisDataSaveDate/App.config | 22 + .../MisDataSaveDate/Funtion.Alarm.cs | 75 + .../MisDataSaveDate/Funtion.EngTypeGetOver.cs | 104 + .../MisDataSaveDate/Funtion.MesRead.cs | 351 ++ .../MisDataSaveDate/Funtion.WorkStart.cs | 228 ++ MisDataSaveDateDll/MisDataSaveDate/Funtion.cs | 151 + .../MisDataSaveDate/MisDataSaveDateDll.csproj | 162 + MisDataSaveDateDll/MisDataSaveDate/Program.cs | 22 + .../Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 70 + .../MisDataSaveDate/Properties/Resources.resx | 117 + .../Properties/Settings.Designer.cs | 29 + .../Properties/Settings.settings | 7 + .../MisDataSaveDate/SaveData.Designer.cs | 49 + .../MisDataSaveDate/SaveData.cs | 69 + .../MisDataSaveDate/SaveData.resx | 120 + .../MisDataSaveDate/packages.config | 15 + MisDataSaveDateDll/dll/00MesWorkMqtt.dll | Bin 0 -> 10240 bytes MisDataSaveDateDll/dll/00MesWorkMqtt.pdb | Bin 0 -> 24064 bytes MisDataSaveDateDll/dll/01DoWhatPlc.dll | Bin 0 -> 19456 bytes MisDataSaveDateDll/dll/01DoWhatPlc.pdb | Bin 0 -> 56832 bytes MisDataSaveDateDll/dll/02WebApiCall.dll | Bin 0 -> 21504 bytes .../dll/02WebApiCall.dll.config | 11 + MisDataSaveDateDll/dll/02WebApiCall.pdb | Bin 0 -> 75264 bytes MisDataSaveDateDll/dll/04DataBaseAccess.dll | Bin 0 -> 15872 bytes MisDataSaveDateDll/dll/04DataBaseAccess.pdb | Bin 0 -> 44544 bytes MisDataSaveDateDll/dll/07BusinessFacade.dll | Bin 0 -> 167936 bytes MisDataSaveDateDll/dll/07BusinessFacade.pdb | Bin 0 -> 466432 bytes MisDataSaveDateDll/dll/08WebFun_base.dll | Bin 0 -> 125440 bytes MisDataSaveDateDll/dll/08WebFun_base.pdb | Bin 0 -> 443904 bytes MisDataSaveDateDll/dll/09MesDataFunction.dll | Bin 0 -> 42496 bytes MisDataSaveDateDll/dll/09MesDataFunction.pdb | Bin 0 -> 161280 bytes MisDataSaveDateDll/dll/BusinessFacade.pdb | Bin 0 -> 460288 bytes .../dll/MQTTnet.Extensions.ManagedClient.dll | Bin 0 -> 45568 bytes MisDataSaveDateDll/dll/MQTTnet.dll | Bin 0 -> 293376 bytes MisDataSaveDateDll/dll/Newtonsoft.Json.dll | Bin 0 -> 502272 bytes PrintBarCode/21PrintBarCode.csproj | 92 + PrintBarCode/App.config | 10 + PrintBarCode/DB.cs | 168 + PrintBarCode/PrintBarCodeForm.Designer.cs | 261 ++ PrintBarCode/PrintBarCodeForm.cs | 214 ++ PrintBarCode/PrintBarCodeForm.resx | 120 + PrintBarCode/Program.cs | 22 + PrintBarCode/Properties/AssemblyInfo.cs | 36 + PrintBarCode/Properties/Resources.Designer.cs | 63 + PrintBarCode/Properties/Resources.resx | 117 + PrintBarCode/Properties/Settings.Designer.cs | 26 + PrintBarCode/Properties/Settings.settings | 7 + SyUpLoad/SyUpLoad.sln | 73 + SyUpLoad/SyUpLoad/App.config | 37 + .../SyUpLoad/BarCode/MESPC.BarCode.Read.cs | 325 ++ SyUpLoad/SyUpLoad/BarCode/MESPC.BarCode.cs | 57 + SyUpLoad/SyUpLoad/BarCode/_system~.ini | 0 .../SyUpLoad/Fun1.EngineTypeGetOverPLC.cs | 174 + SyUpLoad/SyUpLoad/Fun2.cs | 229 ++ .../SyUpLoad/Fun3.EngineTypeGetOverPLC.cs | 222 ++ .../SyUpLoad/Methods/EngineGetOverBaseWork.cs | 134 + SyUpLoad/SyUpLoad/Methods/SubmitToMisweb.cs | 139 + SyUpLoad/SyUpLoad/Methods/UDP.Send.cs | 57 + SyUpLoad/SyUpLoad/Methods/vssver2.scc | Bin 0 -> 234 bytes SyUpLoad/SyUpLoad/PartLoad.CreateEngineID.cs | 180 + SyUpLoad/SyUpLoad/PartLoad.Designer.cs | 786 +++++ SyUpLoad/SyUpLoad/PartLoad.Fun1.BarCode.cs | 93 + SyUpLoad/SyUpLoad/PartLoad.Fun1.PartLoad.cs | 160 + SyUpLoad/SyUpLoad/PartLoad.Fun1.cs | 105 + SyUpLoad/SyUpLoad/PartLoad.SetControl.cs | 53 + SyUpLoad/SyUpLoad/PartLoad.cs | 184 + SyUpLoad/SyUpLoad/PartLoad.resx | 120 + SyUpLoad/SyUpLoad/Program.cs | 22 + SyUpLoad/SyUpLoad/Properties/AssemblyInfo.cs | 36 + .../SyUpLoad/Properties/Resources.Designer.cs | 63 + SyUpLoad/SyUpLoad/Properties/Resources.resx | 117 + .../SyUpLoad/Properties/Settings.Designer.cs | 26 + .../SyUpLoad/Properties/Settings.settings | 7 + SyUpLoad/SyUpLoad/SyUpLoad.csproj | 205 ++ SyUpLoad/SyUpLoad/packages.config | 17 + SyUpLoad/dll/00.1Newtonsoft.Json.dll | Bin 0 -> 588288 bytes SyUpLoad/dll/00.1Newtonsoft.Json.pdb | Bin 0 -> 1994240 bytes SyUpLoad/dll/00MesWorkMqtt.dll | Bin 0 -> 10240 bytes SyUpLoad/dll/00MesWorkMqtt.pdb | Bin 0 -> 24064 bytes SyUpLoad/dll/01DoWhatPlc.dll | Bin 0 -> 19456 bytes SyUpLoad/dll/01DoWhatPlc.pdb | Bin 0 -> 56832 bytes SyUpLoad/dll/02WebApiCall.dll | Bin 0 -> 21504 bytes SyUpLoad/dll/02WebApiCall.dll.config | 11 + SyUpLoad/dll/02WebApiCall.pdb | Bin 0 -> 75264 bytes SyUpLoad/dll/04DataBaseAccess.dll | Bin 0 -> 15872 bytes SyUpLoad/dll/04DataBaseAccess.pdb | Bin 0 -> 44544 bytes SyUpLoad/dll/07BusinessFacade.dll | Bin 0 -> 167936 bytes SyUpLoad/dll/07BusinessFacade.pdb | Bin 0 -> 466432 bytes SyUpLoad/dll/08WebFun_base.dll | Bin 0 -> 125440 bytes SyUpLoad/dll/08WebFun_base.pdb | Bin 0 -> 443904 bytes SyUpLoad/dll/09MesDataFunction.dll | Bin 0 -> 42496 bytes SyUpLoad/dll/09MesDataFunction.pdb | Bin 0 -> 161280 bytes SyUpLoad/dll/BusinessFacade.pdb | Bin 0 -> 460288 bytes .../dll/MQTTnet.Extensions.ManagedClient.dll | Bin 0 -> 45568 bytes SyUpLoad/dll/MQTTnet.dll | Bin 0 -> 293376 bytes SyUpLoadBak/SyUpLoad.sln | 25 + SyUpLoadBak/SyUpLoad/App.config | 36 + .../SyUpLoad/BarCode/MESPC.BarCode.Read.cs | 325 ++ SyUpLoadBak/SyUpLoad/BarCode/MESPC.BarCode.cs | 57 + SyUpLoadBak/SyUpLoad/BarCode/_system~.ini | 0 .../SyUpLoad/Methods/EngineGetOverBaseWork.cs | 134 + .../SyUpLoad/Methods/SubmitToMisweb.cs | 139 + SyUpLoadBak/SyUpLoad/Methods/UDP.Send.cs | 57 + SyUpLoadBak/SyUpLoad/Methods/vssver2.scc | Bin 0 -> 234 bytes .../SyUpLoad/PartLoad.CreateEngineID.cs | 180 + SyUpLoadBak/SyUpLoad/PartLoad.Designer.cs | 786 +++++ SyUpLoadBak/SyUpLoad/PartLoad.Fun0.BarCode.cs | 93 + .../SyUpLoad/PartLoad.Fun1.PartLoad.cs | 223 ++ SyUpLoadBak/SyUpLoad/PartLoad.Fun1.cs | 215 ++ SyUpLoadBak/SyUpLoad/PartLoad.Fun2.cs | 209 ++ SyUpLoadBak/SyUpLoad/PartLoad.Fun3.cs | 138 + SyUpLoadBak/SyUpLoad/PartLoad.SetControl.cs | 53 + SyUpLoadBak/SyUpLoad/PartLoad.cs | 180 + SyUpLoadBak/SyUpLoad/PartLoad.resx | 120 + SyUpLoadBak/SyUpLoad/Program.cs | 22 + .../SyUpLoad/Properties/AssemblyInfo.cs | 36 + .../SyUpLoad/Properties/Resources.Designer.cs | 70 + .../SyUpLoad/Properties/Resources.resx | 117 + .../SyUpLoad/Properties/Settings.Designer.cs | 29 + .../SyUpLoad/Properties/Settings.settings | 7 + SyUpLoadBak/SyUpLoad/SyUpLoad.csproj | 212 ++ SyUpLoadBak/SyUpLoad/packages.config | 17 + SyUpLoadBak/dll/00.1Newtonsoft.Json.dll | Bin 0 -> 588288 bytes SyUpLoadBak/dll/00.1Newtonsoft.Json.pdb | Bin 0 -> 1994240 bytes SyUpLoadBak/dll/00MesWorkMqtt.dll | Bin 0 -> 10240 bytes SyUpLoadBak/dll/00MesWorkMqtt.pdb | Bin 0 -> 24064 bytes SyUpLoadBak/dll/01DoWhatPlc.dll | Bin 0 -> 19456 bytes SyUpLoadBak/dll/01DoWhatPlc.pdb | Bin 0 -> 56832 bytes SyUpLoadBak/dll/02WebApiCall.dll | Bin 0 -> 21504 bytes SyUpLoadBak/dll/02WebApiCall.dll.config | 11 + SyUpLoadBak/dll/02WebApiCall.pdb | Bin 0 -> 75264 bytes SyUpLoadBak/dll/04DataBaseAccess.dll | Bin 0 -> 15872 bytes SyUpLoadBak/dll/04DataBaseAccess.pdb | Bin 0 -> 44544 bytes SyUpLoadBak/dll/07BusinessFacade.dll | Bin 0 -> 167936 bytes SyUpLoadBak/dll/07BusinessFacade.pdb | Bin 0 -> 466432 bytes SyUpLoadBak/dll/08WebFun_base.dll | Bin 0 -> 125440 bytes SyUpLoadBak/dll/08WebFun_base.pdb | Bin 0 -> 443904 bytes SyUpLoadBak/dll/09MesDataFunction.dll | Bin 0 -> 42496 bytes SyUpLoadBak/dll/09MesDataFunction.pdb | Bin 0 -> 161280 bytes SyUpLoadBak/dll/BusinessFacade.pdb | Bin 0 -> 460288 bytes .../dll/MQTTnet.Extensions.ManagedClient.dll | Bin 0 -> 45568 bytes SyUpLoadBak/dll/MQTTnet.dll | Bin 0 -> 293376 bytes SystemConfig.xml | 261 ++ TagTypeCodeID/TagTypeCodeID.sln | 25 + .../TagTypeCodeID/13.2TagTypeCodeID.csproj | 73 + .../TagTypeCodeID/InitMqtt2TagTypeCodeID.cs | 132 + .../TagTypeCodeID/Properties/AssemblyInfo.cs | 36 + Test/ManualSimulateSignal.cs | 522 +++ Test/MisDataWebFun.Designer.cs | 1741 ++++++++++ Test/MisDataWebFun.cs | 956 ++++++ Test/MisDataWebFun.resx | 209 ++ Test/ReadThisStationProductInfo.cs | 107 + Test/WriteQualityValueForm.Designer.cs | 114 + Test/WriteQualityValueForm.cs | 266 ++ Test/WriteQualityValueForm.resx | 120 + dll_common/AsyncIO.dll | Bin 0 -> 30208 bytes dll_common/BasicData.dll | Bin 0 -> 60416 bytes dll_common/BasicData.pdb | Bin 0 -> 75264 bytes dll_common/BouncyCastle.Crypto.dll | Bin 0 -> 2740824 bytes dll_common/ConLink.dll | Bin 0 -> 931840 bytes dll_common/DataLinkMesWork.dll | Bin 0 -> 224256 bytes dll_common/ICSharpCode.SharpZipLib.dll | Bin 0 -> 227328 bytes dll_common/MQTT.dll | Bin 0 -> 46080 bytes .../MQTTnet.Extensions.ManagedClient.dll | Bin 0 -> 45568 bytes dll_common/MQTTnet.dll | Bin 0 -> 293376 bytes dll_common/MesControl.dll | Bin 0 -> 104960 bytes dll_common/MesControl.pdb | Bin 0 -> 48640 bytes dll_common/MesWork.DeviceDriver.dll | Bin 0 -> 166912 bytes dll_common/MesWork.DeviceDriver.pdb | Bin 0 -> 316928 bytes dll_common/MesWork.PLC.dll | Bin 0 -> 739840 bytes dll_common/MesWork.PLC.pdb | Bin 0 -> 290304 bytes dll_common/MesWork.exe.config | 64 + dll_common/MesWork.pdb | Bin 0 -> 44544 bytes dll_common/Monitor.MesWork.dll | Bin 0 -> 242688 bytes dll_common/Monitor.MesWork.pdb | Bin 0 -> 243200 bytes dll_common/Monitor.MesWork.xml | 2860 ++++++++++++++++ dll_common/NPOI.OOXML.dll | Bin 0 -> 596480 bytes dll_common/NPOI.OpenXml4Net.dll | Bin 0 -> 98816 bytes dll_common/NPOI.OpenXmlFormats.dll | Bin 0 -> 2356224 bytes dll_common/NPOI.dll | Bin 0 -> 1882112 bytes dll_common/NetMQ.dll | Bin 0 -> 181760 bytes dll_common/Newtonsoft.Json.7z | Bin 0 -> 204433 bytes dll_common/Newtonsoft.Json.dll | Bin 0 -> 701992 bytes dll_common/Opc.Ua.Client.dll | Bin 0 -> 123792 bytes dll_common/Opc.Ua.Configuration.dll | Bin 0 -> 67464 bytes dll_common/Opc.Ua.Core.dll | Bin 0 -> 5484944 bytes dll_common/OpcUaHelper.dll | Bin 0 -> 173056 bytes dll_common/OpcUaHelper.pdb | Bin 0 -> 198144 bytes dll_common/OpcUaHelper.xml | 1281 +++++++ dll_common/SqlCmd.dll | Bin 0 -> 8704 bytes dll_common/System.Net.Http.Formatting.dll | Bin 0 -> 179680 bytes dll_common/System.Net.Http.dll | Bin 0 -> 198472 bytes dll_common/System.Web.Cors.dll | Bin 0 -> 28648 bytes dll_common/System.Web.Http.Cors.dll | Bin 0 -> 40416 bytes dll_common/System.Web.Http.SelfHost.dll | Bin 0 -> 91112 bytes dll_common/System.Web.Http.dll | Bin 0 -> 456168 bytes dll_common/WC.xlsx | Bin 0 -> 63508 bytes dll_fun/00.1Newtonsoft.Json.dll | Bin 0 -> 587776 bytes dll_fun/00.1Newtonsoft.Json.pdb | Bin 0 -> 1969664 bytes dll_fun/00MesWorkMqtt.dll | Bin 0 -> 12288 bytes dll_fun/00MesWorkMqtt.pdb | Bin 0 -> 32256 bytes dll_fun/02WebApiCall.dll | Bin 0 -> 33280 bytes dll_fun/02WebApiCall.dll.config | 11 + dll_fun/02WebApiCall.pdb | Bin 0 -> 120320 bytes dll_fun/04DataBaseAccess.dll | Bin 0 -> 16896 bytes dll_fun/04DataBaseAccess.pdb | Bin 0 -> 48640 bytes dll_fun/07BusinessFacade.dll | Bin 0 -> 184832 bytes dll_fun/07BusinessFacade.pdb | Bin 0 -> 517632 bytes dll_fun/08WebFun_base.dll | Bin 0 -> 126464 bytes dll_fun/08WebFun_base.pdb | Bin 0 -> 452096 bytes dll_fun/09MesDataFunction.dll | Bin 0 -> 54272 bytes dll_fun/09MesDataFunction.pdb | Bin 0 -> 196096 bytes dll_fun/BasicData.dll | Bin 0 -> 60416 bytes dll_fun/BasicData.pdb | Bin 0 -> 75264 bytes dll_fun/DoWhatPlc.dll | Bin 0 -> 35328 bytes dll_fun/DoWhatPlc.pdb | Bin 0 -> 116224 bytes dll_fun/Function1051.dll | Bin 0 -> 23040 bytes dll_fun/Function1051.dll.config | 19 + dll_fun/Function1051.pdb | Bin 0 -> 67072 bytes dll_fun/Function1052.dll | Bin 0 -> 19968 bytes dll_fun/Function1052.dll.config | 19 + dll_fun/Function1052.pdb | Bin 0 -> 60928 bytes dll_fun/Function1053.dll | Bin 0 -> 22528 bytes dll_fun/Function1053.dll.config | 19 + dll_fun/Function1053.pdb | Bin 0 -> 67072 bytes dll_fun/Function1054.dll | Bin 0 -> 19968 bytes dll_fun/Function1054.dll.config | 19 + dll_fun/Function1054.pdb | Bin 0 -> 60928 bytes dll_fun/Function1055.dll | Bin 0 -> 19456 bytes dll_fun/Function1055.dll.config | 19 + dll_fun/Function1055.pdb | Bin 0 -> 60928 bytes dll_fun/Function1056.dll | Bin 0 -> 18432 bytes dll_fun/Function1056.dll.config | 19 + dll_fun/Function1056.pdb | Bin 0 -> 58880 bytes dll_fun/Function1057.dll | Bin 0 -> 20480 bytes dll_fun/Function1057.dll.config | 19 + dll_fun/Function1057.pdb | Bin 0 -> 58880 bytes dll_fun/Function1058.dll | Bin 0 -> 19968 bytes dll_fun/Function1058.dll.config | 19 + dll_fun/Function1058.pdb | Bin 0 -> 58880 bytes dll_fun/Function1059.dll | Bin 0 -> 19968 bytes dll_fun/Function1059.dll.config | 19 + dll_fun/Function1059.pdb | Bin 0 -> 81408 bytes dll_fun/Function1060.dll | Bin 0 -> 22528 bytes dll_fun/Function1060.dll.config | 19 + dll_fun/Function1060.pdb | Bin 0 -> 87552 bytes dll_fun/Function1061.dll | Bin 0 -> 20992 bytes dll_fun/Function1061.dll.config | 19 + dll_fun/Function1061.pdb | Bin 0 -> 85504 bytes dll_fun/MIS_FuntionSaveData.dll | Bin 0 -> 22528 bytes dll_fun/MIS_FuntionSaveData.pdb | Bin 0 -> 60928 bytes dll_fun/MQTTnet.Extensions.ManagedClient.dll | Bin 0 -> 45568 bytes dll_fun/MQTTnet.dll | Bin 0 -> 293376 bytes dll_fun/MesWork.DeviceDriver.dll | Bin 0 -> 166912 bytes dll_fun/MesWork.DeviceDriver.pdb | Bin 0 -> 316928 bytes dll_fun/MesWork.PLC.dll | Bin 0 -> 739840 bytes dll_fun/MesWork.PLC.pdb | Bin 0 -> 290304 bytes dll_fun/MyLog4Net.dll | Bin 0 -> 6144 bytes dll_fun/MyLog4Net.pdb | Bin 0 -> 24064 bytes dll_fun/Newtonsoft.Json.dll | Bin 0 -> 701992 bytes dll_fun/SendMessageToWebMqtt.dll | Bin 0 -> 17920 bytes dll_fun/SendMessageToWebMqtt.pdb | Bin 0 -> 69120 bytes dll_fun/log4net.config | 35 + dll_fun/log4net.dll | Bin 0 -> 270336 bytes 基本变量.xlsx | Bin 0 -> 6601 bytes 数据库结构.xlsx | Bin 0 -> 29710 bytes 1374 files changed, 183429 insertions(+) create mode 100644 .gitignore create mode 100644 AllProject/AllProject.sln create mode 100644 AllProject/AllProject/AllProject.csproj create mode 100644 AllProject/AllProject/App.config create mode 100644 AllProject/AllProject/Form1.Designer.cs create mode 100644 AllProject/AllProject/Form1.cs create mode 100644 AllProject/AllProject/Program.cs create mode 100644 AllProject/AllProject/Properties/AssemblyInfo.cs create mode 100644 AllProject/AllProject/Properties/Resources.Designer.cs create mode 100644 AllProject/AllProject/Properties/Resources.resx create mode 100644 AllProject/AllProject/Properties/Settings.Designer.cs create mode 100644 AllProject/AllProject/Properties/Settings.settings create mode 100644 AllProject/输出-调试.txt create mode 100644 Common/00-1Json8.3/Json8.3.1.sln create mode 100644 Common/00-1Json8.3/Json8.3/00-0Json8.3.1.csproj create mode 100644 Common/00-1Json8.3/Json8.3/Bson/BsonBinaryType.cs create mode 100644 Common/00-1Json8.3/Json8.3/Bson/BsonBinaryWriter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Bson/BsonObjectId.cs create mode 100644 Common/00-1Json8.3/Json8.3/Bson/BsonReader.cs create mode 100644 Common/00-1Json8.3/Json8.3/Bson/BsonToken.cs create mode 100644 Common/00-1Json8.3/Json8.3/Bson/BsonType.cs create mode 100644 Common/00-1Json8.3/Json8.3/Bson/BsonWriter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Class1.cs create mode 100644 Common/00-1Json8.3/Json8.3/ConstructorHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/Converters/BinaryConverter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Converters/BsonObjectIdConverter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Converters/CustomCreationConverter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Converters/DataSetConverter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Converters/DataTableConverter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Converters/DateTimeConverterBase.cs create mode 100644 Common/00-1Json8.3/Json8.3/Converters/DiscriminatedUnionConverter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Converters/EntityKeyMemberConverter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Converters/ExpandoObjectConverter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Converters/IsoDateTimeConverter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Converters/JavaScriptDateTimeConverter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Converters/JsonValueConverter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Converters/KeyValuePairConverter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Converters/RegexConverter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Converters/StringEnumConverter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Converters/VersionConverter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Converters/XmlNodeConverter.cs create mode 100644 Common/00-1Json8.3/Json8.3/DateFormatHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/DateParseHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/DateTimeZoneHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/DefaultValueHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/FloatFormatHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/FloatParseHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/Formatting.cs create mode 100644 Common/00-1Json8.3/Json8.3/IArrayPool.cs create mode 100644 Common/00-1Json8.3/Json8.3/IJsonLineInfo.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonArrayAttribute.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonConstructorAttribute.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonContainerAttribute.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonConvert.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonConverter.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonConverterAttribute.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonConverterCollection.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonDictionaryAttribute.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonException.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonExtensionDataAttribute.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonIgnoreAttribute.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonObjectAttribute.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonPosition.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonPropertyAttribute.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonReader.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonReaderException.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonRequiredAttribute.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonSerializationException.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonSerializer.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonSerializerSettings.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonTextReader.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonTextWriter.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonToken.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonValidatingReader.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonWriter.cs create mode 100644 Common/00-1Json8.3/Json8.3/JsonWriterException.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/CommentHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/Extensions.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/IJEnumerable.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JArray.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JConstructor.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JContainer.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JEnumerable.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JObject.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JProperty.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JPropertyDescriptor.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JPropertyKeyedCollection.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JRaw.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JToken.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JTokenEqualityComparer.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JTokenReader.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JTokenType.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JTokenWriter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JValue.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JsonLoadSettings.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JsonMergeSettings.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JsonPath/ArrayIndexFilter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JsonPath/ArrayMultipleIndexFilter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JsonPath/ArraySliceFilter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JsonPath/FieldFilter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JsonPath/FieldMultipleFilter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JsonPath/JPath.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JsonPath/PathFilter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JsonPath/QueryExpression.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JsonPath/QueryFilter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/JsonPath/ScanFilter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/MergeArrayHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/Linq/MergeNullValueHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/MemberSerialization.cs create mode 100644 Common/00-1Json8.3/Json8.3/MetadataPropertyHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/MissingMemberHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/NullValueHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/ObjectCreationHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/PreserveReferencesHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/Properties/AssemblyInfo.cs create mode 100644 Common/00-1Json8.3/Json8.3/ReferenceLoopHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/Required.cs create mode 100644 Common/00-1Json8.3/Json8.3/Schema/Extensions.cs create mode 100644 Common/00-1Json8.3/Json8.3/Schema/JsonSchema.cs create mode 100644 Common/00-1Json8.3/Json8.3/Schema/JsonSchemaBuilder.cs create mode 100644 Common/00-1Json8.3/Json8.3/Schema/JsonSchemaConstants.cs create mode 100644 Common/00-1Json8.3/Json8.3/Schema/JsonSchemaException.cs create mode 100644 Common/00-1Json8.3/Json8.3/Schema/JsonSchemaGenerator.cs create mode 100644 Common/00-1Json8.3/Json8.3/Schema/JsonSchemaModel.cs create mode 100644 Common/00-1Json8.3/Json8.3/Schema/JsonSchemaModelBuilder.cs create mode 100644 Common/00-1Json8.3/Json8.3/Schema/JsonSchemaNode.cs create mode 100644 Common/00-1Json8.3/Json8.3/Schema/JsonSchemaNodeCollection.cs create mode 100644 Common/00-1Json8.3/Json8.3/Schema/JsonSchemaResolver.cs create mode 100644 Common/00-1Json8.3/Json8.3/Schema/JsonSchemaType.cs create mode 100644 Common/00-1Json8.3/Json8.3/Schema/JsonSchemaWriter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Schema/UndefinedSchemaIdHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/Schema/ValidationEventArgs.cs create mode 100644 Common/00-1Json8.3/Json8.3/Schema/ValidationEventHandler.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/CachedAttributeGetter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/CamelCasePropertyNamesContractResolver.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/DefaultContractResolver.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/DefaultReferenceResolver.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/DefaultSerializationBinder.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/DiagnosticsTraceWriter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/DynamicValueProvider.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/ErrorContext.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/ErrorEventArgs.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/ExpressionValueProvider.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/IAttributeProvider.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/IContractResolver.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/IReferenceResolver.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/ITraceWriter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/IValueProvider.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/JsonArrayContract.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/JsonContainerContract.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/JsonContract.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/JsonDictionaryContract.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/JsonDynamicContract.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/JsonFormatterConverter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/JsonISerializableContract.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/JsonLinqContract.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/JsonObjectContract.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/JsonPrimitiveContract.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/JsonProperty.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/JsonPropertyCollection.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/JsonSerializerInternalBase.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/JsonSerializerInternalReader.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/JsonSerializerInternalWriter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/JsonSerializerProxy.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/JsonStringContract.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/JsonTypeReflector.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/MemoryTraceWriter.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/ObjectConstructor.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/OnErrorAttribute.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/ReflectionAttributeProvider.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/ReflectionValueProvider.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/TraceJsonReader.cs create mode 100644 Common/00-1Json8.3/Json8.3/Serialization/TraceJsonWriter.cs create mode 100644 Common/00-1Json8.3/Json8.3/StringEscapeHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/TypeNameHandling.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/Base64Encoder.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/BidirectionalDictionary.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/CollectionUtils.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/CollectionWrapper.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/ConvertUtils.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/DateTimeParser.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/DateTimeUtils.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/DictionaryWrapper.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/DynamicProxy.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/DynamicProxyMetaObject.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/DynamicReflectionDelegateFactory.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/DynamicUtils.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/EnumUtils.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/EnumValue.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/ExpressionReflectionDelegateFactory.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/FSharpUtils.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/ILGeneratorExtensions.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/ImmutableCollectionsUtils.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/JavaScriptUtils.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/JsonTokenUtils.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/LateBoundReflectionDelegateFactory.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/LinqBridge.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/MathUtils.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/MethodCall.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/MiscellaneousUtils.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/PropertyNameTable.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/ReflectionDelegateFactory.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/ReflectionObject.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/ReflectionUtils.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/StringBuffer.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/StringReference.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/StringUtils.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/ThreadSafeStore.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/TypeExtensions.cs create mode 100644 Common/00-1Json8.3/Json8.3/Utilities/ValidationUtils.cs create mode 100644 Common/00-1Json8.3/Json8.3/WriteState.cs create mode 100644 Common/00-2AppConfigSet/AppConfigSet.sln create mode 100644 Common/00-2AppConfigSet/AppConfigSet/00-1AppConfigSetForm.csproj create mode 100644 Common/00-2AppConfigSet/AppConfigSet/App.config create mode 100644 Common/00-2AppConfigSet/AppConfigSet/AppConfigSetForm.Designer.cs create mode 100644 Common/00-2AppConfigSet/AppConfigSet/AppConfigSetForm.cs create mode 100644 Common/00-2AppConfigSet/AppConfigSet/AppConfigSetForm.resx create mode 100644 Common/00-2AppConfigSet/AppConfigSet/Program.cs create mode 100644 Common/00-2AppConfigSet/AppConfigSet/Properties/AssemblyInfo.cs create mode 100644 Common/00-2AppConfigSet/AppConfigSet/Properties/Resources.Designer.cs create mode 100644 Common/00-2AppConfigSet/AppConfigSet/Properties/Resources.resx create mode 100644 Common/00-2AppConfigSet/AppConfigSet/Properties/Settings.Designer.cs create mode 100644 Common/00-2AppConfigSet/AppConfigSet/Properties/Settings.settings create mode 100644 Common/00MesWorkMqtt/Common/dll/MQTTnet.Extensions.ManagedClient.dll create mode 100644 Common/00MesWorkMqtt/Common/dll/MQTTnet.dll create mode 100644 Common/00MesWorkMqtt/Common/dll/MesWorkMqtt.dll create mode 100644 Common/00MesWorkMqtt/Common/dll/MesWorkMqtt.pdb create mode 100644 Common/00MesWorkMqtt/DataBaseAccess/04DataBaseAccess.csproj create mode 100644 Common/00MesWorkMqtt/DataBaseAccess/DataAccess.cs create mode 100644 Common/00MesWorkMqtt/DataBaseAccess/JsonHelper.cs create mode 100644 Common/00MesWorkMqtt/DataBaseAccess/Properties/AssemblyInfo.cs create mode 100644 Common/00MesWorkMqtt/MesWorkMqtt.sln create mode 100644 Common/00MesWorkMqtt/MesWorkMqtt/00MesWorkMqtt.csproj create mode 100644 Common/00MesWorkMqtt/MesWorkMqtt/Mqtt.cs create mode 100644 Common/00MesWorkMqtt/MesWorkMqtt/Properties/AssemblyInfo.cs create mode 100644 Common/01DoWhatPlc/01_01DoWhatPlc.csproj create mode 100644 Common/01DoWhatPlc/01_01DoWhatPlc.sln create mode 100644 Common/01DoWhatPlc/DoWhat.cs create mode 100644 Common/01DoWhatPlc/Properties/AssemblyInfo.cs create mode 100644 Common/01DoWhatPlc/TagTypeCodeID.cs create mode 100644 Common/01DoWhatPlc/TagTypeID.cs create mode 100644 Common/01DoWhatPlc/Utils.cs create mode 100644 Common/01DoWhatPlc/packages.config create mode 100644 Common/02WebApiCall/02_02WebApiCallPLC.csproj create mode 100644 Common/02WebApiCall/02_02WebApiCallPLC.sln create mode 100644 Common/02WebApiCall/App.config create mode 100644 Common/02WebApiCall/Form1.Designer.cs create mode 100644 Common/02WebApiCall/Form1.cs create mode 100644 Common/02WebApiCall/Form1.resx create mode 100644 Common/02WebApiCall/Program.cs create mode 100644 Common/02WebApiCall/Properties/AssemblyInfo.cs create mode 100644 Common/02WebApiCall/Properties/Resources.Designer.cs create mode 100644 Common/02WebApiCall/Properties/Resources.resx create mode 100644 Common/02WebApiCall/Properties/Settings.Designer.cs create mode 100644 Common/02WebApiCall/Properties/Settings.settings create mode 100644 Common/02WebApiCall/WebApiCall/CallWebApi.SQLCommon.cs create mode 100644 Common/02WebApiCall/WebApiCall/CallWebApi.cs create mode 100644 Common/02WebApiCall/WebApiCall/CallWebApiDT.SQLCommon.cs create mode 100644 Common/02WebApiCall/WebApiCall/CallWebApiDT.cs create mode 100644 Common/02WebApiCall/WebApiCall/Opc.Demo.cs create mode 100644 Common/02WebApiCall/WebApiCall/Opc.SaveData.cs create mode 100644 Common/02WebApiCall/WebApiCall/ReadPLC.cs create mode 100644 Common/02WebApiCall/WebApiCall/ReadWritePLCMesRead.cs create mode 100644 Common/02WebApiCall/WebApiCall/Utils.cs create mode 100644 Common/02WebApiCall/WebApiCall/WbApi.cs create mode 100644 Common/02WebApiCall/WebApiCall/WritePLC.cs create mode 100644 Common/02WebApiCall/packages.config create mode 100644 Common/04DataBaseAccess/Common/dll/DataBaseAccess.dll create mode 100644 Common/04DataBaseAccess/Common/dll/DataBaseAccess.pdb create mode 100644 Common/04DataBaseAccess/Common/dll/DoWhatPlc.dll create mode 100644 Common/04DataBaseAccess/Common/dll/DoWhatPlc.pdb create mode 100644 Common/04DataBaseAccess/Common/dll/MQTTnet.Extensions.ManagedClient.dll create mode 100644 Common/04DataBaseAccess/Common/dll/MQTTnet.dll create mode 100644 Common/04DataBaseAccess/Common/dll/MesWorkMqtt.dll create mode 100644 Common/04DataBaseAccess/Common/dll/MesWorkMqtt.pdb create mode 100644 Common/04DataBaseAccess/Common/dll/Newtonsoft.Json.dll create mode 100644 Common/04DataBaseAccess/Common/dll/WebApiCall.dll create mode 100644 Common/04DataBaseAccess/Common/dll/WebApiCall.dll.config create mode 100644 Common/04DataBaseAccess/Common/dll/WebApiCall.pdb create mode 100644 Common/04DataBaseAccess/DataBaseAccess.sln create mode 100644 Common/04DataBaseAccess/DataBaseAccess/04-DataBaseAccess.csproj create mode 100644 Common/04DataBaseAccess/DataBaseAccess/DataAccess.cs create mode 100644 Common/04DataBaseAccess/DataBaseAccess/JsonHelper.cs create mode 100644 Common/04DataBaseAccess/DataBaseAccess/Properties/AssemblyInfo.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade.sln create mode 100644 Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/EngineIDCode.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/Materials.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/OpName.MainForm.Launch.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/RepairWorkStation.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/ShowLED.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/vssver2.scc create mode 100644 Common/07WebBusinessFacade/BusinessFacade/05Biz/OPC/BaseDataSystemMES.OPC.Alarm.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/05Biz/OPC/BaseDataSystemMES.OPC.QualityData.GoodBad.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/05Biz/OPC/BaseDataSystemMES.OPC.QualityData.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/05Biz/OPC/BaseDataSystemMES.OPC.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/05Biz/OPC/vssver2.scc create mode 100644 Common/07WebBusinessFacade/BusinessFacade/05Biz/QualityData/DataVerify.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/05Biz/QualityData/GetQualityData_GoodBad.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/07BusinessFacade.csproj create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Db2023/Order.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Factory/Factory.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Factory/vssver2.scc create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/EngineIDCode.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/OpName.MainForm.Launch.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/OpName.MainForm.Material.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/OpName.MainForm.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/UserManage.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/UserNamePassword.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/vssver2.scc create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/EngineType.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/IsMES.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/OpName.Material.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/OpName.Proccess.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/OpName.Shaft.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/vssver2.scc create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.QualityData/QualityData.B5A.Pack.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.QualityData/QualityData.B5A.Save.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.QualityData/QualityData.B5A.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.QualityData/vssver2.scc create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/OpNameCount.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/OpNameRepair.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/ShaftPosition.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/ShaftPositionData.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/vssver2.scc create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/MES.Biz.TraceTable.Cap.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/MES.Biz.TraceTable.Cylinder.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/MES.Biz.TraceTable.ToOpName.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/MES.Biz.TraceTable.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/vssver2.scc create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.Data.GetData/GetOpNameOrderForm.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.Data.GetData/MES.Biz.TraceTable.GetData.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.Data.GetData/OpNameGuid.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.Data.GetData/vssver2.scc create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.Data.SaveData/MES.Biz.Material.SaveData.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.Data.SaveData/MES.Biz.TraceTable.SaveData.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.Data.SaveData/vssver2.scc create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.HL/MesFunctions.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.Material/Materials.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES.Material/vssver2.scc create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.AssemblyPartTrace.Repair.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.AssemblyPartTrace.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.CartTrace.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.FalseOverGo.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.FirstOpName.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.KeyPart.KeyPartAssemblyTempTable.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.Load.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.Login.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MOBY.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MaterialList.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MaterialVerifyManagement.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MesOverGo.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MesServer.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.ProduceCount.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.SubLineOpName.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.WorkSheet.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/MES.Biz.Config.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/MES.Biz.MaterialList.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/MaterialData.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/MES/vssver2.scc create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Properties/AssemblyInfo.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/SyPartLoad/EngineIDCode.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Web.New/MES1.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Web/Buttons.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Web/Login.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Web/MES.Functions.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Web/MES.MaterialPull.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Web/MES.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Web/MES_Loading.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Web/MES_MachineManage.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Web/ando_load.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Web/ando_load_2.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Web/ando_machine.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Web/ando_machine_2.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Web/ando_matertial.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Web/ando_matertial_2.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Web/ando_quality.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Web/ando_quality_2.cs create mode 100644 Common/07WebBusinessFacade/BusinessFacade/Web/vssver2.scc create mode 100644 Common/08WebFun_base/WebFun_base.sln create mode 100644 Common/08WebFun_base/WebFun_base/08-WebFun_base.csproj create mode 100644 Common/08WebFun_base/WebFun_base/Class1.cs create mode 100644 Common/08WebFun_base/WebFun_base/MesWebFun_MateriallPull.cs create mode 100644 Common/08WebFun_base/WebFun_base/MesWebFun_MateriallPullFun.cs create mode 100644 Common/08WebFun_base/WebFun_base/MesWebFun_Special.cs create mode 100644 Common/08WebFun_base/WebFun_base/MesWebFun_base.cs create mode 100644 Common/08WebFun_base/WebFun_base/MesWebFun_baseFun.cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Tab_OperateGuid.cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(2).cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(3).cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(4).cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(5).cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(6).cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(7).cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(8).cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(9).cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制.cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制.cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Common_Barcode.cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Common_ShowEngineID.cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Common_ShowQuality.cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Common_ShowTime.cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_FixGuiad.cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Init.cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_MaterialCheck.cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Notice.cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_OutLineRepair.cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Socket.cs create mode 100644 Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Socket_Interface.cs create mode 100644 Common/08WebFun_base/WebFun_base/Properties/AssemblyInfo.cs create mode 100644 Common/08WebFun_base/WebFun_base/Reference.cs create mode 100644 Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction01.cs create mode 100644 Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction02.cs create mode 100644 Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction04.cs create mode 100644 Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction05.cs create mode 100644 Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction06.cs create mode 100644 Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction07.cs create mode 100644 Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction08.cs create mode 100644 Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction10.cs create mode 100644 Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction11.cs create mode 100644 Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction12.cs create mode 100644 Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction13.cs create mode 100644 Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction14.cs create mode 100644 Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction15.cs create mode 100644 Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction16.cs create mode 100644 Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction17.cs create mode 100644 Common/08WebFun_base/WebFun_base/SpecialFun/vssver2.scc create mode 100644 Common/09MesDataFunction/MesDataFunction.sln create mode 100644 Common/09MesDataFunction/MesDataFunction/09-MesDataFunction.csproj create mode 100644 Common/09MesDataFunction/MesDataFunction/LoadTagTypeCodeID.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/InitTagValueListData.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.Barcode.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.ConfirmOkGo.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.EngineTypeGetOver_PLC_Work.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.FalseGO.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.Material_Insert.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.MesReadOver.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.SendMessage.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.WebSubmit.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.WorkStart.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Hashtable.TagID.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Machine.ServicePlan.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.OpcServerMIS.Read.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.OpcServerMIS.Write.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.QualityData.Read.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.SendMessage.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS_BASE.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesWorkPlc.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MisDataFunction/Heartbeat.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MisDataFunction/MIS.Interface.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MisDataFunction/MesRead.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MisDataFunction/WorkStart.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/Properties/AssemblyInfo.cs create mode 100644 Common/10SignalChangeMonitorControl/10MesControl.csproj create mode 100644 Common/10SignalChangeMonitorControl/MesBoolSignal.Designer.cs create mode 100644 Common/10SignalChangeMonitorControl/MesBoolSignal.cs create mode 100644 Common/10SignalChangeMonitorControl/MesBoolSignal.resx create mode 100644 Common/10SignalChangeMonitorControl/MesControl.sln create mode 100644 Common/10SignalChangeMonitorControl/PlcConnect.Designer.cs create mode 100644 Common/10SignalChangeMonitorControl/PlcConnect.cs create mode 100644 Common/10SignalChangeMonitorControl/PlcConnect.resx create mode 100644 Common/10SignalChangeMonitorControl/PlcWorkStationSignal.Designer.cs create mode 100644 Common/10SignalChangeMonitorControl/PlcWorkStationSignal.cs create mode 100644 Common/10SignalChangeMonitorControl/PlcWorkStationSignal.resx create mode 100644 Common/10SignalChangeMonitorControl/Properties/AssemblyInfo.cs create mode 100644 Common/10SignalChangeMonitorControl/Properties/Resources.Designer.cs create mode 100644 Common/10SignalChangeMonitorControl/Properties/Resources.resx create mode 100644 Common/10SignalChangeMonitorControl/Properties/_system~.ini create mode 100644 Common/10SignalChangeMonitorControl/Resources/BreakPLC.png create mode 100644 Common/10SignalChangeMonitorControl/Resources/PlcConnect0.png create mode 100644 Common/10SignalChangeMonitorControl/Resources/PlcConnect1.png create mode 100644 Common/10SignalChangeMonitorControl/Resources/PlcConnect2.png create mode 100644 Common/10SignalChangeMonitorControl/Resources/PlcConnect3.png create mode 100644 Common/10SignalChangeMonitorControl/Resources/PlcConnect4.png create mode 100644 Common/10SignalChangeMonitorControl/Resources/PlcConnectBig.png create mode 100644 Common/10SignalChangeMonitorControl/Resources/PlcConnectSmall.png create mode 100644 Common/10SignalChangeMonitorControl/Resources/_system~.ini create mode 100644 Common/10SignalChangeMonitorControl/Resources/green.png create mode 100644 Common/10SignalChangeMonitorControl/Resources/init.png create mode 100644 Common/10SignalChangeMonitorControl/Resources/none.png create mode 100644 Common/10SignalChangeMonitorControl/Resources/red.png create mode 100644 Common/10SignalChangeMonitorControl/Resources/yellow.png create mode 100644 Common/10SignalChangeMonitorControl/SignalInit.cs create mode 100644 Common/10SignalChangeMonitorControl/_system~.ini create mode 100644 Common/11MonitorForm/11MonitorForm.csproj create mode 100644 Common/11MonitorForm/App.config create mode 100644 Common/11MonitorForm/Form1.Designer.cs create mode 100644 Common/11MonitorForm/Form1.cs create mode 100644 Common/11MonitorForm/FunctionForm_HashiTable.cs create mode 100644 Common/11MonitorForm/MainSignalChangeEvent.cs create mode 100644 Common/11MonitorForm/Mes32X32.ico create mode 100644 Common/11MonitorForm/PlcSignalDynamicCreate.cs create mode 100644 Common/11MonitorForm/Program.cs create mode 100644 Common/11MonitorForm/Properties/AssemblyInfo.cs create mode 100644 Common/11MonitorForm/Properties/Resources.Designer.cs create mode 100644 Common/11MonitorForm/Properties/Resources.resx create mode 100644 Common/11MonitorForm/Properties/Settings.Designer.cs create mode 100644 Common/11MonitorForm/Properties/Settings.settings create mode 100644 Common/11MonitorForm/SecondForm.Designer.cs create mode 100644 Common/11MonitorForm/SecondForm.cs create mode 100644 Common/11MonitorForm/SecondForm.resx create mode 100644 Common/11MonitorForm/SecondFormDelegate.cs create mode 100644 Common/99DataBaseAccess2/Common/dll/DataBaseAccess.dll create mode 100644 Common/99DataBaseAccess2/Common/dll/DataBaseAccess.pdb create mode 100644 Common/99DataBaseAccess2/Common/dll/DoWhatPlc.dll create mode 100644 Common/99DataBaseAccess2/Common/dll/DoWhatPlc.pdb create mode 100644 Common/99DataBaseAccess2/Common/dll/MQTTnet.Extensions.ManagedClient.dll create mode 100644 Common/99DataBaseAccess2/Common/dll/MQTTnet.dll create mode 100644 Common/99DataBaseAccess2/Common/dll/MesWorkMqtt.dll create mode 100644 Common/99DataBaseAccess2/Common/dll/MesWorkMqtt.pdb create mode 100644 Common/99DataBaseAccess2/Common/dll/Newtonsoft.Json.dll create mode 100644 Common/99DataBaseAccess2/Common/dll/WebApiCall.dll create mode 100644 Common/99DataBaseAccess2/Common/dll/WebApiCall.dll.config create mode 100644 Common/99DataBaseAccess2/Common/dll/WebApiCall.pdb create mode 100644 Common/99DataBaseAccess2/DataBaseAccess.sln create mode 100644 Common/99DataBaseAccess2/DataBaseAccess/99-DataBaseAccess2.csproj create mode 100644 Common/99DataBaseAccess2/DataBaseAccess/DataAccess.cs create mode 100644 Common/99DataBaseAccess2/DataBaseAccess/JsonHelper.cs create mode 100644 Common/99DataBaseAccess2/DataBaseAccess/Properties/AssemblyInfo.cs create mode 100644 Common/DoWhatPlc/01_01DoWhatPlc.csproj create mode 100644 Common/DoWhatPlc/DoWhat.cs create mode 100644 Common/DoWhatPlc/Properties/AssemblyInfo.cs create mode 100644 Common/DoWhatPlc/TagTypeCodeID.cs create mode 100644 Common/DoWhatPlc/TagTypeID.cs create mode 100644 Common/DoWhatPlc/packages.config create mode 100644 Common/MesControl/MesBoolSignal.Designer.cs create mode 100644 Common/MesControl/MesBoolSignal.cs create mode 100644 Common/MesControl/MesBoolSignal.resx create mode 100644 Common/MesControl/MesControl.csproj create mode 100644 Common/MesControl/PlcConnect.Designer.cs create mode 100644 Common/MesControl/PlcConnect.cs create mode 100644 Common/MesControl/PlcConnect.resx create mode 100644 Common/MesControl/PlcWorkStationSignal.Designer.cs create mode 100644 Common/MesControl/PlcWorkStationSignal.cs create mode 100644 Common/MesControl/PlcWorkStationSignal.resx create mode 100644 Common/MesControl/Properties/AssemblyInfo.cs create mode 100644 Common/MesControl/Properties/Resources.Designer.cs create mode 100644 Common/MesControl/Properties/Resources.resx create mode 100644 Common/MesControl/Properties/_system~.ini create mode 100644 Common/MesControl/Resources/BreakPLC.png create mode 100644 Common/MesControl/Resources/PlcConnect0.png create mode 100644 Common/MesControl/Resources/PlcConnect1.png create mode 100644 Common/MesControl/Resources/PlcConnect2.png create mode 100644 Common/MesControl/Resources/PlcConnect3.png create mode 100644 Common/MesControl/Resources/PlcConnect4.png create mode 100644 Common/MesControl/Resources/PlcConnectBig.png create mode 100644 Common/MesControl/Resources/PlcConnectSmall.png create mode 100644 Common/MesControl/Resources/_system~.ini create mode 100644 Common/MesControl/Resources/green.png create mode 100644 Common/MesControl/Resources/init.png create mode 100644 Common/MesControl/Resources/none.png create mode 100644 Common/MesControl/Resources/red.png create mode 100644 Common/MesControl/Resources/yellow.png create mode 100644 Common/MesControl/SignalInit.cs create mode 100644 Common/MesControl/_system~.ini create mode 100644 Common/MyLog4Net/00_MyLog4Net.csproj create mode 100644 Common/MyLog4Net/MyLogEventArgs.cs create mode 100644 Common/MyLog4Net/MyLogHelper.cs create mode 100644 Common/MyLog4Net/Properties/AssemblyInfo.cs create mode 100644 Common/MyLog4Net/log4net.config create mode 100644 Common/MyLog4Net/packages.config create mode 100644 Common/WebApiDll/DoWhatPlc.dll create mode 100644 Common/WebApiDll/DoWhatPlc.pdb create mode 100644 Common/WebApiDll/Newtonsoft.Json.dll create mode 100644 Common/dll/00.1Newtonsoft.Json.dll create mode 100644 Common/dll/00.1Newtonsoft.Json.pdb create mode 100644 Common/dll/00MesWorkMqtt.dll create mode 100644 Common/dll/00MesWorkMqtt.pdb create mode 100644 Common/dll/01DoWhatPlc.dll create mode 100644 Common/dll/01DoWhatPlc.pdb create mode 100644 Common/dll/02WebApiCall.dll create mode 100644 Common/dll/02WebApiCall.dll.config create mode 100644 Common/dll/02WebApiCall.pdb create mode 100644 Common/dll/04DataBaseAccess.dll create mode 100644 Common/dll/04DataBaseAccess.pdb create mode 100644 Common/dll/07BusinessFacade.dll create mode 100644 Common/dll/07BusinessFacade.pdb create mode 100644 Common/dll/08WebFun_base.dll create mode 100644 Common/dll/08WebFun_base.pdb create mode 100644 Common/dll/09MesDataFunction.dll create mode 100644 Common/dll/09MesDataFunction.pdb create mode 100644 Common/dll/99DataBaseAccess2.dll create mode 100644 Common/dll/99DataBaseAccess2.pdb create mode 100644 Common/dll/BasicData.dll create mode 100644 Common/dll/BasicData.pdb create mode 100644 Common/dll/BouncyCastle.Crypto.dll create mode 100644 Common/dll/BusinessFacade.pdb create mode 100644 Common/dll/ConLink.dll create mode 100644 Common/dll/DataLinkMesWork.dll create mode 100644 Common/dll/DoWhatPlc.dll create mode 100644 Common/dll/DoWhatPlc.pdb create mode 100644 Common/dll/ICSharpCode.SharpZipLib.dll create mode 100644 Common/dll/MQTTnet.Extensions.ManagedClient.dll create mode 100644 Common/dll/MQTTnet.dll create mode 100644 Common/dll/MesControl.dll create mode 100644 Common/dll/MesControl.pdb create mode 100644 Common/dll/MesWork.DeviceDriver.dll create mode 100644 Common/dll/MesWork.DeviceDriver.pdb create mode 100644 Common/dll/MesWork.PLC.dll create mode 100644 Common/dll/MesWork.PLC.pdb create mode 100644 Common/dll/Monitor.MesWork.dll create mode 100644 Common/dll/Monitor.MesWork.pdb create mode 100644 Common/dll/Monitor.MesWork.xml create mode 100644 Common/dll/NPOI.OOXML.dll create mode 100644 Common/dll/NPOI.OpenXml4Net.dll create mode 100644 Common/dll/NPOI.OpenXmlFormats.dll create mode 100644 Common/dll/NPOI.dll create mode 100644 Common/dll/Newtonsoft.Json.dll create mode 100644 Common/dll/Opc.Ua.Client.dll create mode 100644 Common/dll/Opc.Ua.Configuration.dll create mode 100644 Common/dll/Opc.Ua.Core.dll create mode 100644 Common/dll/OpcUaHelper.dll create mode 100644 Common/dll/OpcUaHelper.pdb create mode 100644 Common/dll/OpcUaHelper.xml create mode 100644 MESUploadFileProject.ashx create mode 100644 MES基础数据.xlsx create mode 100644 MIS_FuntionSaveData/MIS_FuntionSaveData.sln create mode 100644 MIS_FuntionSaveData/MIS_FuntionSaveData/13.3MIS_FuntionSaveData.csproj create mode 100644 MIS_FuntionSaveData/MIS_FuntionSaveData/Funtion.Alarm.cs create mode 100644 MIS_FuntionSaveData/MIS_FuntionSaveData/Funtion.EngTypeGetOver.cs create mode 100644 MIS_FuntionSaveData/MIS_FuntionSaveData/Funtion.MesRead.cs create mode 100644 MIS_FuntionSaveData/MIS_FuntionSaveData/Funtion.WorkStart.cs create mode 100644 MIS_FuntionSaveData/MIS_FuntionSaveData/MIS_Funtion.cs create mode 100644 MIS_FuntionSaveData/MIS_FuntionSaveData/Properties/AssemblyInfo.cs create mode 100644 Mes32X32.ico create mode 100644 MesMonitor/--PlcMonitor/PlcMonitor.sln create mode 100644 MesMonitor/--PlcMonitor/PlcMonitor/App.config create mode 100644 MesMonitor/--PlcMonitor/PlcMonitor/Form1.Designer.cs create mode 100644 MesMonitor/--PlcMonitor/PlcMonitor/Form1.cs create mode 100644 MesMonitor/--PlcMonitor/PlcMonitor/PlcMonitor.csproj create mode 100644 MesMonitor/--PlcMonitor/PlcMonitor/Program.cs create mode 100644 MesMonitor/--PlcMonitor/PlcMonitor/Properties/AssemblyInfo.cs create mode 100644 MesMonitor/--PlcMonitor/PlcMonitor/Properties/Resources.Designer.cs create mode 100644 MesMonitor/--PlcMonitor/PlcMonitor/Properties/Resources.resx create mode 100644 MesMonitor/--PlcMonitor/PlcMonitor/Properties/Settings.Designer.cs create mode 100644 MesMonitor/--PlcMonitor/PlcMonitor/Properties/Settings.settings create mode 100644 MesMonitor/--SignalChangeMonitor/FunctionForm_HashiTable.cs create mode 100644 MesMonitor/--SignalChangeMonitor/MainSignalChangeEvent.cs create mode 100644 MesMonitor/--SignalChangeMonitor/PlcSignalDynamicCreate.cs create mode 100644 MesMonitor/--SignalChangeMonitor/SecondForm.Designer.cs create mode 100644 MesMonitor/--SignalChangeMonitor/SecondForm.cs create mode 100644 MesMonitor/--SignalChangeMonitor/SecondForm.resx create mode 100644 MesMonitor/--SignalChangeMonitor/SecondFormDelegate.cs create mode 100644 MesMonitor/--SignalChangeMonitor/vssver2.scc create mode 100644 MesMonitor/MonitorForm/App.config create mode 100644 MesMonitor/MonitorForm/Form1.Designer.cs create mode 100644 MesMonitor/MonitorForm/Form1.cs create mode 100644 MesMonitor/MonitorForm/FunctionForm_HashiTable.cs create mode 100644 MesMonitor/MonitorForm/MainSignalChangeEvent.cs create mode 100644 MesMonitor/MonitorForm/Mes32X32.ico create mode 100644 MesMonitor/MonitorForm/MonitorForm.csproj create mode 100644 MesMonitor/MonitorForm/MonitorForm.sln create mode 100644 MesMonitor/MonitorForm/PlcSignalDynamicCreate.cs create mode 100644 MesMonitor/MonitorForm/Program.cs create mode 100644 MesMonitor/MonitorForm/Properties/AssemblyInfo.cs create mode 100644 MesMonitor/MonitorForm/Properties/Resources.Designer.cs create mode 100644 MesMonitor/MonitorForm/Properties/Resources.resx create mode 100644 MesMonitor/MonitorForm/Properties/Settings.Designer.cs create mode 100644 MesMonitor/MonitorForm/Properties/Settings.settings create mode 100644 MesMonitor/MonitorForm/SecondForm.Designer.cs create mode 100644 MesMonitor/MonitorForm/SecondForm.cs create mode 100644 MesMonitor/MonitorForm/SecondForm.resx create mode 100644 MesMonitor/MonitorForm/SecondFormDelegate.cs create mode 100644 MesMonitor/SignalChangeMonitorControl/MesBoolSignal.Designer.cs create mode 100644 MesMonitor/SignalChangeMonitorControl/MesBoolSignal.cs create mode 100644 MesMonitor/SignalChangeMonitorControl/MesBoolSignal.resx create mode 100644 MesMonitor/SignalChangeMonitorControl/MesControl.csproj create mode 100644 MesMonitor/SignalChangeMonitorControl/MesControl.sln create mode 100644 MesMonitor/SignalChangeMonitorControl/PlcConnect.Designer.cs create mode 100644 MesMonitor/SignalChangeMonitorControl/PlcConnect.cs create mode 100644 MesMonitor/SignalChangeMonitorControl/PlcConnect.resx create mode 100644 MesMonitor/SignalChangeMonitorControl/PlcWorkStationSignal.Designer.cs create mode 100644 MesMonitor/SignalChangeMonitorControl/PlcWorkStationSignal.cs create mode 100644 MesMonitor/SignalChangeMonitorControl/PlcWorkStationSignal.resx create mode 100644 MesMonitor/SignalChangeMonitorControl/Properties/AssemblyInfo.cs create mode 100644 MesMonitor/SignalChangeMonitorControl/Properties/Resources.Designer.cs create mode 100644 MesMonitor/SignalChangeMonitorControl/Properties/Resources.resx create mode 100644 MesMonitor/SignalChangeMonitorControl/Properties/_system~.ini create mode 100644 MesMonitor/SignalChangeMonitorControl/Resources/BreakPLC.png create mode 100644 MesMonitor/SignalChangeMonitorControl/Resources/PlcConnect0.png create mode 100644 MesMonitor/SignalChangeMonitorControl/Resources/PlcConnect1.png create mode 100644 MesMonitor/SignalChangeMonitorControl/Resources/PlcConnect2.png create mode 100644 MesMonitor/SignalChangeMonitorControl/Resources/PlcConnect3.png create mode 100644 MesMonitor/SignalChangeMonitorControl/Resources/PlcConnect4.png create mode 100644 MesMonitor/SignalChangeMonitorControl/Resources/PlcConnectBig.png create mode 100644 MesMonitor/SignalChangeMonitorControl/Resources/PlcConnectSmall.png create mode 100644 MesMonitor/SignalChangeMonitorControl/Resources/_system~.ini create mode 100644 MesMonitor/SignalChangeMonitorControl/Resources/green.png create mode 100644 MesMonitor/SignalChangeMonitorControl/Resources/init.png create mode 100644 MesMonitor/SignalChangeMonitorControl/Resources/none.png create mode 100644 MesMonitor/SignalChangeMonitorControl/Resources/red.png create mode 100644 MesMonitor/SignalChangeMonitorControl/Resources/yellow.png create mode 100644 MesMonitor/SignalChangeMonitorControl/SignalInit.cs create mode 100644 MesMonitor/SignalChangeMonitorControl/_system~.ini create mode 100644 MisDataFun/MesFun/App.config create mode 100644 MisDataFun/MesFun/MesFun.csproj create mode 100644 MisDataFun/MesFun/MesFunction.Designer.cs create mode 100644 MisDataFun/MesFun/MesFunction.cs create mode 100644 MisDataFun/MesFun/Program.cs create mode 100644 MisDataFun/MesFun/Properties/AssemblyInfo.cs create mode 100644 MisDataFun/MesFun/Properties/Resources.Designer.cs create mode 100644 MisDataFun/MesFun/Properties/Resources.resx create mode 100644 MisDataFun/MesFun/Properties/Settings.Designer.cs create mode 100644 MisDataFun/MesFun/Properties/Settings.settings create mode 100644 MisDataFun/MesFunDll/MesFunDll.cs create mode 100644 MisDataFun/MesFunDll/MesFunDll.csproj create mode 100644 MisDataFun/MesFunDll/Properties/AssemblyInfo.cs create mode 100644 MisDataFun/MisDataFun.sln create mode 100644 MisDataFun/MisDataFun/AgvApiHelper.cs create mode 100644 MisDataFun/MisDataFun/App.config create mode 100644 MisDataFun/MisDataFun/Mes32X32.ico create mode 100644 MisDataFun/MisDataFun/MisAddition/ControlData.cs create mode 100644 MisDataFun/MisDataFun/MisAddition/ForOtherForm.cs create mode 100644 MisDataFun/MisDataFun/MisAddition/ManualSimulateSignal.cs create mode 100644 MisDataFun/MisDataFun/MisAddition/MisAdditionInit.cs create mode 100644 MisDataFun/MisDataFun/MisAddition/QualityDataQueryStruct.cs create mode 100644 MisDataFun/MisDataFun/MisAddition/ReadThisStationProductInfo.cs create mode 100644 MisDataFun/MisDataFun/MisAddition/TestPlcConnect.cs create mode 100644 MisDataFun/MisDataFun/MisAddition/ThisStationStatusDisplay.cs create mode 100644 MisDataFun/MisDataFun/MisAddition/WriteQualityValueForm.Designer.cs create mode 100644 MisDataFun/MisDataFun/MisAddition/WriteQualityValueForm.cs create mode 100644 MisDataFun/MisDataFun/MisAddition/WriteQualityValueForm.resx create mode 100644 MisDataFun/MisDataFun/MisDataFun.Designer.cs create mode 100644 MisDataFun/MisDataFun/MisDataFun.cs create mode 100644 MisDataFun/MisDataFun/MisDataFun.csproj create mode 100644 MisDataFun/MisDataFun/MisDataFun.resx create mode 100644 MisDataFun/MisDataFun/OrderForm.Designer.cs create mode 100644 MisDataFun/MisDataFun/OrderForm.cs create mode 100644 MisDataFun/MisDataFun/OrderForm.resx create mode 100644 MisDataFun/MisDataFun/Program.cs create mode 100644 MisDataFun/MisDataFun/Properties/AssemblyInfo.cs create mode 100644 MisDataFun/MisDataFun/Properties/Resources.Designer.cs create mode 100644 MisDataFun/MisDataFun/Properties/Resources.resx create mode 100644 MisDataFun/MisDataFun/Properties/Settings.Designer.cs create mode 100644 MisDataFun/MisDataFun/Properties/Settings.settings create mode 100644 MisDataFun/MisDataFun/jsconfig1.json create mode 100644 MisDataFun/SendMessageToWebMqtt/12SendMessageToWeb.csproj create mode 100644 MisDataFun/SendMessageToWebMqtt/InitHashtable_MesServerCode.cs create mode 100644 MisDataFun/SendMessageToWebMqtt/Properties/AssemblyInfo.cs create mode 100644 MisDataFun/SendMessageToWebMqtt/SendMessage.cs create mode 100644 MisDataFun/SendMessageToWebMqtt/SendMessageFun.cs create mode 100644 MisDataFun/WebSubmit/13.1WebSubmit.csproj create mode 100644 MisDataFun/WebSubmit/Db.cs create mode 100644 MisDataFun/WebSubmit/MesServerFunction/Fun_WebSubmit.cs create mode 100644 MisDataFun/WebSubmit/MesServerFunction/vssver2.scc create mode 100644 MisDataFun/WebSubmit/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFun/WebSubmit/Methods/SubmitToMisweb.cs create mode 100644 MisDataFun/WebSubmit/Methods/UDP.Send.cs create mode 100644 MisDataFun/WebSubmit/Methods/vssver2.scc create mode 100644 MisDataFun/WebSubmit/OpcServer/Barcode.cs create mode 100644 MisDataFun/WebSubmit/OpcServer/ConfirmOkGo.cs create mode 100644 MisDataFun/WebSubmit/OpcServer/EngineGetOver.cs create mode 100644 MisDataFun/WebSubmit/OpcServer/FalseGO.cs create mode 100644 MisDataFun/WebSubmit/OpcServer/MesRead.cs create mode 100644 MisDataFun/WebSubmit/OpcServer/MesReadOver.cs create mode 100644 MisDataFun/WebSubmit/OpcServer/WebSubmit.cs create mode 100644 MisDataFun/WebSubmit/OpcServer/WorkStart.cs create mode 100644 MisDataFun/WebSubmit/OpcServer/vssver2.scc create mode 100644 MisDataFun/WebSubmit/Properties/AssemblyInfo.cs create mode 100644 MisDataFunDll/MisDataFunDll.sln create mode 100644 MisDataFunDll/MisDataFunDll/13.4MisDataFunction.csproj create mode 100644 MisDataFunDll/MisDataFunDll/MisDataFun.MES.New.cs create mode 100644 MisDataFunDll/MisDataFunDll/MisDataFun.MES.cs create mode 100644 MisDataFunDll/MisDataFunDll/MisDataFun.MIS_Funtion.cs create mode 100644 MisDataFunDll/MisDataFunDll/Properties/AssemblyInfo.cs create mode 100644 MisDataFunDll/MisDataFunDll/Reflection.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/DataAccess/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1051/Db.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/Function08.csproj.vspscc create mode 100644 MisDataFunction/MesServer.Function/Function1051/Function1051.csproj create mode 100644 MisDataFunction/MesServer.Function/Function1051/MesServerFunction/Function1051.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/MesServerFunction/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1051/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/Methods/SubmitToMisweb.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/Methods/UDP.Send.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/Methods/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1051/OpcServer/Barcode.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/OpcServer/ConfirmOkGo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/OpcServer/FalseGO.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/OpcServer/HeartBeat.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/OpcServer/MesRead.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/OpcServer/MesReadOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/OpcServer/PartLoad.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/OpcServer/PartLoadInPallet.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/OpcServer/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1051/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1051/Properties/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1051/app.config create mode 100644 MisDataFunction/MesServer.Function/Function1051/mssccprj.scc create mode 100644 MisDataFunction/MesServer.Function/Function1051/packages.config create mode 100644 MisDataFunction/MesServer.Function/Function1051/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1052/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/MesServer.Function/Function1052/DataAccess/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1052/Function02.csproj.vspscc create mode 100644 MisDataFunction/MesServer.Function/Function1052/Function1052.csproj create mode 100644 MisDataFunction/MesServer.Function/Function1052/MesServerFunction/Fun_1052.cs create mode 100644 MisDataFunction/MesServer.Function/Function1052/MesServerFunction/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1052/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/MesServer.Function/Function1052/Methods/SubmitToMisweb.cs create mode 100644 MisDataFunction/MesServer.Function/Function1052/Methods/UDP.Send.cs create mode 100644 MisDataFunction/MesServer.Function/Function1052/Methods/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1052/OpcServer/Barcode.cs create mode 100644 MisDataFunction/MesServer.Function/Function1052/OpcServer/ConfirmOkGo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1052/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1052/OpcServer/FalseGO.cs create mode 100644 MisDataFunction/MesServer.Function/Function1052/OpcServer/HeartBeat.cs create mode 100644 MisDataFunction/MesServer.Function/Function1052/OpcServer/MesRead.cs create mode 100644 MisDataFunction/MesServer.Function/Function1052/OpcServer/MesReadOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1052/OpcServer/MesSaveNowData.cs create mode 100644 MisDataFunction/MesServer.Function/Function1052/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/MesServer.Function/Function1052/OpcServer/WorkIsOk.cs create mode 100644 MisDataFunction/MesServer.Function/Function1052/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/MesServer.Function/Function1052/OpcServer/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1052/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1052/Properties/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1052/app.config create mode 100644 MisDataFunction/MesServer.Function/Function1052/mssccprj.scc create mode 100644 MisDataFunction/MesServer.Function/Function1052/packages.config create mode 100644 MisDataFunction/MesServer.Function/Function1052/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1053/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/DataAccess/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1053/Db.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/Function02.csproj.vspscc create mode 100644 MisDataFunction/MesServer.Function/Function1053/Function1053.csproj create mode 100644 MisDataFunction/MesServer.Function/Function1053/MesServerFunction/Fun_1053.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/MesServerFunction/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1053/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/Methods/SubmitToMisweb.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/Methods/UDP.Send.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/Methods/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1053/OpcServer/Barcode.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/OpcServer/ConfirmOkGo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/OpcServer/FalseGO.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/OpcServer/HeartBeat.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/OpcServer/MesRead.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/OpcServer/MesReadOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/OpcServer/MesSaveNowData.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/OpcServer/PartLoad.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/OpcServer/WorkIsOk.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/OpcServer/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1053/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1053/Properties/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1053/app.config create mode 100644 MisDataFunction/MesServer.Function/Function1053/mssccprj.scc create mode 100644 MisDataFunction/MesServer.Function/Function1053/packages.config create mode 100644 MisDataFunction/MesServer.Function/Function1053/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1054/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/MesServer.Function/Function1054/DataAccess/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1054/Db.cs create mode 100644 MisDataFunction/MesServer.Function/Function1054/Function02.csproj.vspscc create mode 100644 MisDataFunction/MesServer.Function/Function1054/Function1054.csproj create mode 100644 MisDataFunction/MesServer.Function/Function1054/MesServerFunction/Fun_1054.cs create mode 100644 MisDataFunction/MesServer.Function/Function1054/MesServerFunction/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1054/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/MesServer.Function/Function1054/Methods/SubmitToMisweb.cs create mode 100644 MisDataFunction/MesServer.Function/Function1054/Methods/UDP.Send.cs create mode 100644 MisDataFunction/MesServer.Function/Function1054/Methods/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1054/OpcServer/Barcode.cs create mode 100644 MisDataFunction/MesServer.Function/Function1054/OpcServer/ConfirmOkGo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1054/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1054/OpcServer/FalseGO.cs create mode 100644 MisDataFunction/MesServer.Function/Function1054/OpcServer/HeartBeat.cs create mode 100644 MisDataFunction/MesServer.Function/Function1054/OpcServer/MesRead.cs create mode 100644 MisDataFunction/MesServer.Function/Function1054/OpcServer/MesReadOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1054/OpcServer/MesSaveNowData.cs create mode 100644 MisDataFunction/MesServer.Function/Function1054/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/MesServer.Function/Function1054/OpcServer/WorkIsOk.cs create mode 100644 MisDataFunction/MesServer.Function/Function1054/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/MesServer.Function/Function1054/OpcServer/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1054/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1054/Properties/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1054/app.config create mode 100644 MisDataFunction/MesServer.Function/Function1054/mssccprj.scc create mode 100644 MisDataFunction/MesServer.Function/Function1054/packages.config create mode 100644 MisDataFunction/MesServer.Function/Function1054/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1055/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/MesServer.Function/Function1055/DataAccess/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1055/Db.cs create mode 100644 MisDataFunction/MesServer.Function/Function1055/Function02.csproj.vspscc create mode 100644 MisDataFunction/MesServer.Function/Function1055/Function1055.csproj create mode 100644 MisDataFunction/MesServer.Function/Function1055/MesServerFunction/Fun_1055.cs create mode 100644 MisDataFunction/MesServer.Function/Function1055/MesServerFunction/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1055/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/MesServer.Function/Function1055/Methods/SubmitToMisweb.cs create mode 100644 MisDataFunction/MesServer.Function/Function1055/Methods/UDP.Send.cs create mode 100644 MisDataFunction/MesServer.Function/Function1055/Methods/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1055/OpcServer/Barcode.cs create mode 100644 MisDataFunction/MesServer.Function/Function1055/OpcServer/ConfirmOkGo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1055/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1055/OpcServer/FalseGO.cs create mode 100644 MisDataFunction/MesServer.Function/Function1055/OpcServer/HeartBeat.cs create mode 100644 MisDataFunction/MesServer.Function/Function1055/OpcServer/MesRead.cs create mode 100644 MisDataFunction/MesServer.Function/Function1055/OpcServer/MesReadOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1055/OpcServer/MesSaveNowData.cs create mode 100644 MisDataFunction/MesServer.Function/Function1055/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/MesServer.Function/Function1055/OpcServer/WorkIsOk.cs create mode 100644 MisDataFunction/MesServer.Function/Function1055/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/MesServer.Function/Function1055/OpcServer/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1055/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1055/Properties/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1055/app.config create mode 100644 MisDataFunction/MesServer.Function/Function1055/mssccprj.scc create mode 100644 MisDataFunction/MesServer.Function/Function1055/packages.config create mode 100644 MisDataFunction/MesServer.Function/Function1055/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1056/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/MesServer.Function/Function1056/DataAccess/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1056/Db.cs create mode 100644 MisDataFunction/MesServer.Function/Function1056/Function02.csproj.vspscc create mode 100644 MisDataFunction/MesServer.Function/Function1056/Function1056.csproj create mode 100644 MisDataFunction/MesServer.Function/Function1056/MesServerFunction/Fun_1056.cs create mode 100644 MisDataFunction/MesServer.Function/Function1056/MesServerFunction/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1056/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/MesServer.Function/Function1056/Methods/SubmitToMisweb.cs create mode 100644 MisDataFunction/MesServer.Function/Function1056/Methods/UDP.Send.cs create mode 100644 MisDataFunction/MesServer.Function/Function1056/Methods/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1056/OpcServer/Barcode.cs create mode 100644 MisDataFunction/MesServer.Function/Function1056/OpcServer/ConfirmOkGo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1056/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1056/OpcServer/FalseGO.cs create mode 100644 MisDataFunction/MesServer.Function/Function1056/OpcServer/HeartBeat.cs create mode 100644 MisDataFunction/MesServer.Function/Function1056/OpcServer/MesRead.cs create mode 100644 MisDataFunction/MesServer.Function/Function1056/OpcServer/MesReadOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1056/OpcServer/MesSaveNowData.cs create mode 100644 MisDataFunction/MesServer.Function/Function1056/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/MesServer.Function/Function1056/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/MesServer.Function/Function1056/OpcServer/WritePLC.cs create mode 100644 MisDataFunction/MesServer.Function/Function1056/OpcServer/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1056/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1056/Properties/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1056/app.config create mode 100644 MisDataFunction/MesServer.Function/Function1056/mssccprj.scc create mode 100644 MisDataFunction/MesServer.Function/Function1056/packages.config create mode 100644 MisDataFunction/MesServer.Function/Function1056/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1057/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/MesServer.Function/Function1057/DataAccess/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1057/Db.cs create mode 100644 MisDataFunction/MesServer.Function/Function1057/Function02.csproj.vspscc create mode 100644 MisDataFunction/MesServer.Function/Function1057/Function1057.csproj create mode 100644 MisDataFunction/MesServer.Function/Function1057/MesServerFunction/Fun_1057.cs create mode 100644 MisDataFunction/MesServer.Function/Function1057/MesServerFunction/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1057/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/MesServer.Function/Function1057/Methods/SubmitToMisweb.cs create mode 100644 MisDataFunction/MesServer.Function/Function1057/Methods/UDP.Send.cs create mode 100644 MisDataFunction/MesServer.Function/Function1057/Methods/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1057/OpcServer/Barcode.cs create mode 100644 MisDataFunction/MesServer.Function/Function1057/OpcServer/ConfirmOkGo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1057/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1057/OpcServer/FalseGO.cs create mode 100644 MisDataFunction/MesServer.Function/Function1057/OpcServer/HeartBeat.cs create mode 100644 MisDataFunction/MesServer.Function/Function1057/OpcServer/MesRead.cs create mode 100644 MisDataFunction/MesServer.Function/Function1057/OpcServer/MesReadOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1057/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/MesServer.Function/Function1057/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/MesServer.Function/Function1057/OpcServer/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1057/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1057/Properties/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1057/app.config create mode 100644 MisDataFunction/MesServer.Function/Function1057/mssccprj.scc create mode 100644 MisDataFunction/MesServer.Function/Function1057/packages.config create mode 100644 MisDataFunction/MesServer.Function/Function1057/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1058/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/MesServer.Function/Function1058/DataAccess/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1058/Db.cs create mode 100644 MisDataFunction/MesServer.Function/Function1058/Function08.csproj.vspscc create mode 100644 MisDataFunction/MesServer.Function/Function1058/Function1058.csproj create mode 100644 MisDataFunction/MesServer.Function/Function1058/MesServerFunction/Function1058.cs create mode 100644 MisDataFunction/MesServer.Function/Function1058/MesServerFunction/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1058/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/MesServer.Function/Function1058/Methods/SubmitToMisweb.cs create mode 100644 MisDataFunction/MesServer.Function/Function1058/Methods/UDP.Send.cs create mode 100644 MisDataFunction/MesServer.Function/Function1058/Methods/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1058/OpcServer/Barcode.cs create mode 100644 MisDataFunction/MesServer.Function/Function1058/OpcServer/ConfirmOkGo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1058/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1058/OpcServer/FalseGO.cs create mode 100644 MisDataFunction/MesServer.Function/Function1058/OpcServer/HeartBeat.cs create mode 100644 MisDataFunction/MesServer.Function/Function1058/OpcServer/MesRead.cs create mode 100644 MisDataFunction/MesServer.Function/Function1058/OpcServer/MesReadOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1058/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/MesServer.Function/Function1058/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/MesServer.Function/Function1058/OpcServer/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1058/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1058/Properties/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1058/app.config create mode 100644 MisDataFunction/MesServer.Function/Function1058/mssccprj.scc create mode 100644 MisDataFunction/MesServer.Function/Function1058/packages.config create mode 100644 MisDataFunction/MesServer.Function/Function1058/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1059/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/MesServer.Function/Function1059/DataAccess/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1059/Db.cs create mode 100644 MisDataFunction/MesServer.Function/Function1059/Function1059.csproj create mode 100644 MisDataFunction/MesServer.Function/Function1059/MesServerFunction/Function1059.cs create mode 100644 MisDataFunction/MesServer.Function/Function1059/MesServerFunction/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1059/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/MesServer.Function/Function1059/Methods/SubmitToMisweb.cs create mode 100644 MisDataFunction/MesServer.Function/Function1059/Methods/UDP.Send.cs create mode 100644 MisDataFunction/MesServer.Function/Function1059/Methods/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1059/OpcServer/Barcode.cs create mode 100644 MisDataFunction/MesServer.Function/Function1059/OpcServer/ConfirmOkGo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1059/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1059/OpcServer/FalseGO.cs create mode 100644 MisDataFunction/MesServer.Function/Function1059/OpcServer/HeartBeat.cs create mode 100644 MisDataFunction/MesServer.Function/Function1059/OpcServer/MesRead.cs create mode 100644 MisDataFunction/MesServer.Function/Function1059/OpcServer/MesReadOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1059/OpcServer/MesSaveNowData.cs create mode 100644 MisDataFunction/MesServer.Function/Function1059/OpcServer/PartLoad.cs create mode 100644 MisDataFunction/MesServer.Function/Function1059/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/MesServer.Function/Function1059/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/MesServer.Function/Function1059/OpcServer/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1059/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1059/app.config create mode 100644 MisDataFunction/MesServer.Function/Function1059/mssccprj.scc create mode 100644 MisDataFunction/MesServer.Function/Function1059/packages.config create mode 100644 MisDataFunction/MesServer.Function/Function1060/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/MesServer.Function/Function1060/DataAccess/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1060/Db.cs create mode 100644 MisDataFunction/MesServer.Function/Function1060/Function1060.csproj create mode 100644 MisDataFunction/MesServer.Function/Function1060/MesServerFunction/Fun_1060.cs create mode 100644 MisDataFunction/MesServer.Function/Function1060/MesServerFunction/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1060/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/MesServer.Function/Function1060/Methods/SubmitToMisweb.cs create mode 100644 MisDataFunction/MesServer.Function/Function1060/Methods/UDP.Send.cs create mode 100644 MisDataFunction/MesServer.Function/Function1060/Methods/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1060/OpcServer/Barcode.cs create mode 100644 MisDataFunction/MesServer.Function/Function1060/OpcServer/ConfirmOkGo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1060/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1060/OpcServer/FalseGO.cs create mode 100644 MisDataFunction/MesServer.Function/Function1060/OpcServer/HeartBeat.cs create mode 100644 MisDataFunction/MesServer.Function/Function1060/OpcServer/MesRead.cs create mode 100644 MisDataFunction/MesServer.Function/Function1060/OpcServer/MesReadOver.cs create mode 100644 MisDataFunction/MesServer.Function/Function1060/OpcServer/MesSaveNowData.cs create mode 100644 MisDataFunction/MesServer.Function/Function1060/OpcServer/PartLoad.cs create mode 100644 MisDataFunction/MesServer.Function/Function1060/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/MesServer.Function/Function1060/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/MesServer.Function/Function1060/OpcServer/vssver2.scc create mode 100644 MisDataFunction/MesServer.Function/Function1060/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/MesServer.Function/Function1060/app.config create mode 100644 MisDataFunction/MesServer.Function/Function1060/packages.config create mode 100644 MisDataFunction/MisDataFunction.sln create mode 100644 MisDataPlcTagID/MisDataPlcTagID.sln create mode 100644 MisDataPlcTagID/MisDataPlcTagID/20-12MisDataPlcTagID.csproj create mode 100644 MisDataPlcTagID/MisDataPlcTagID/Class1.cs create mode 100644 MisDataPlcTagID/MisDataPlcTagID/ListViewNF .cs create mode 100644 MisDataPlcTagID/MisDataPlcTagID/ManualSimulateSignal.cs create mode 100644 MisDataPlcTagID/MisDataPlcTagID/ManualSimulateSignalSim.cs create mode 100644 MisDataPlcTagID/MisDataPlcTagID/MisDataWebFun.Designer.cs create mode 100644 MisDataPlcTagID/MisDataPlcTagID/MisDataWebFun.cs create mode 100644 MisDataPlcTagID/MisDataPlcTagID/MisDataWebFun.resx create mode 100644 MisDataPlcTagID/MisDataPlcTagID/MisDataWebFunSim.Designer.cs create mode 100644 MisDataPlcTagID/MisDataPlcTagID/MisDataWebFunSim.cs create mode 100644 MisDataPlcTagID/MisDataPlcTagID/MisDataWebFunSim.resx create mode 100644 MisDataPlcTagID/MisDataPlcTagID/Properties/AssemblyInfo.cs create mode 100644 MisDataPlcTagID/MisDataPlcTagID/ReadThisStationProductInfo.cs create mode 100644 MisDataPlcTagID/MisDataPlcTagID/ReadThisStationProductInfoSim.cs create mode 100644 MisDataPlcTagID/MisDataPlcTagID/WriteQualityValueForm.Designer.cs create mode 100644 MisDataPlcTagID/MisDataPlcTagID/WriteQualityValueForm.cs create mode 100644 MisDataPlcTagID/MisDataPlcTagID/WriteQualityValueForm.resx create mode 100644 MisDataPlcTagID/MisDataPlcTagID/WriteQualityValueFormSim.Designer.cs create mode 100644 MisDataPlcTagID/MisDataPlcTagID/WriteQualityValueFormSim.cs create mode 100644 MisDataPlcTagID/MisDataPlcTagID/WriteQualityValueFormSim.resx create mode 100644 MisDataPlcTagID/Properties/AssemblyInfo.cs create mode 100644 MisDataSaveDate/MisDataSaveDate.sln create mode 100644 MisDataSaveDate/MisDataSaveDate/App.config create mode 100644 MisDataSaveDate/MisDataSaveDate/Funtion .Mqtt.cs create mode 100644 MisDataSaveDate/MisDataSaveDate/Funtion.Alarm.cs create mode 100644 MisDataSaveDate/MisDataSaveDate/Funtion.EngTypeGetOver.cs create mode 100644 MisDataSaveDate/MisDataSaveDate/Funtion.MesRead.cs create mode 100644 MisDataSaveDate/MisDataSaveDate/Funtion.WorkStart.cs create mode 100644 MisDataSaveDate/MisDataSaveDate/Funtion.cs create mode 100644 MisDataSaveDate/MisDataSaveDate/MisDataSaveDate.csproj create mode 100644 MisDataSaveDate/MisDataSaveDate/Program.cs create mode 100644 MisDataSaveDate/MisDataSaveDate/Properties/AssemblyInfo.cs create mode 100644 MisDataSaveDate/MisDataSaveDate/Properties/Resources.Designer.cs create mode 100644 MisDataSaveDate/MisDataSaveDate/Properties/Resources.resx create mode 100644 MisDataSaveDate/MisDataSaveDate/Properties/Settings.Designer.cs create mode 100644 MisDataSaveDate/MisDataSaveDate/Properties/Settings.settings create mode 100644 MisDataSaveDate/MisDataSaveDate/SaveData.Designer.cs create mode 100644 MisDataSaveDate/MisDataSaveDate/SaveData.cs create mode 100644 MisDataSaveDate/MisDataSaveDate/SaveData.resx create mode 100644 MisDataSaveDate/MisDataSaveDate/packages.config create mode 100644 MisDataSaveDate/dll/00MesWorkMqtt.dll create mode 100644 MisDataSaveDate/dll/00MesWorkMqtt.pdb create mode 100644 MisDataSaveDate/dll/01DoWhatPlc.dll create mode 100644 MisDataSaveDate/dll/01DoWhatPlc.pdb create mode 100644 MisDataSaveDate/dll/02WebApiCall.dll create mode 100644 MisDataSaveDate/dll/02WebApiCall.dll.config create mode 100644 MisDataSaveDate/dll/02WebApiCall.pdb create mode 100644 MisDataSaveDate/dll/04DataBaseAccess.dll create mode 100644 MisDataSaveDate/dll/04DataBaseAccess.pdb create mode 100644 MisDataSaveDate/dll/07BusinessFacade.dll create mode 100644 MisDataSaveDate/dll/07BusinessFacade.pdb create mode 100644 MisDataSaveDate/dll/08WebFun_base.dll create mode 100644 MisDataSaveDate/dll/08WebFun_base.pdb create mode 100644 MisDataSaveDate/dll/09MesDataFunction.dll create mode 100644 MisDataSaveDate/dll/09MesDataFunction.pdb create mode 100644 MisDataSaveDate/dll/BusinessFacade.pdb create mode 100644 MisDataSaveDate/dll/MQTTnet.Extensions.ManagedClient.dll create mode 100644 MisDataSaveDate/dll/MQTTnet.dll create mode 100644 MisDataSaveDate/dll/Newtonsoft.Json.dll create mode 100644 MisDataSaveDateDll/MisDataSaveDate.sln create mode 100644 MisDataSaveDateDll/MisDataSaveDate/App.config create mode 100644 MisDataSaveDateDll/MisDataSaveDate/Funtion.Alarm.cs create mode 100644 MisDataSaveDateDll/MisDataSaveDate/Funtion.EngTypeGetOver.cs create mode 100644 MisDataSaveDateDll/MisDataSaveDate/Funtion.MesRead.cs create mode 100644 MisDataSaveDateDll/MisDataSaveDate/Funtion.WorkStart.cs create mode 100644 MisDataSaveDateDll/MisDataSaveDate/Funtion.cs create mode 100644 MisDataSaveDateDll/MisDataSaveDate/MisDataSaveDateDll.csproj create mode 100644 MisDataSaveDateDll/MisDataSaveDate/Program.cs create mode 100644 MisDataSaveDateDll/MisDataSaveDate/Properties/AssemblyInfo.cs create mode 100644 MisDataSaveDateDll/MisDataSaveDate/Properties/Resources.Designer.cs create mode 100644 MisDataSaveDateDll/MisDataSaveDate/Properties/Resources.resx create mode 100644 MisDataSaveDateDll/MisDataSaveDate/Properties/Settings.Designer.cs create mode 100644 MisDataSaveDateDll/MisDataSaveDate/Properties/Settings.settings create mode 100644 MisDataSaveDateDll/MisDataSaveDate/SaveData.Designer.cs create mode 100644 MisDataSaveDateDll/MisDataSaveDate/SaveData.cs create mode 100644 MisDataSaveDateDll/MisDataSaveDate/SaveData.resx create mode 100644 MisDataSaveDateDll/MisDataSaveDate/packages.config create mode 100644 MisDataSaveDateDll/dll/00MesWorkMqtt.dll create mode 100644 MisDataSaveDateDll/dll/00MesWorkMqtt.pdb create mode 100644 MisDataSaveDateDll/dll/01DoWhatPlc.dll create mode 100644 MisDataSaveDateDll/dll/01DoWhatPlc.pdb create mode 100644 MisDataSaveDateDll/dll/02WebApiCall.dll create mode 100644 MisDataSaveDateDll/dll/02WebApiCall.dll.config create mode 100644 MisDataSaveDateDll/dll/02WebApiCall.pdb create mode 100644 MisDataSaveDateDll/dll/04DataBaseAccess.dll create mode 100644 MisDataSaveDateDll/dll/04DataBaseAccess.pdb create mode 100644 MisDataSaveDateDll/dll/07BusinessFacade.dll create mode 100644 MisDataSaveDateDll/dll/07BusinessFacade.pdb create mode 100644 MisDataSaveDateDll/dll/08WebFun_base.dll create mode 100644 MisDataSaveDateDll/dll/08WebFun_base.pdb create mode 100644 MisDataSaveDateDll/dll/09MesDataFunction.dll create mode 100644 MisDataSaveDateDll/dll/09MesDataFunction.pdb create mode 100644 MisDataSaveDateDll/dll/BusinessFacade.pdb create mode 100644 MisDataSaveDateDll/dll/MQTTnet.Extensions.ManagedClient.dll create mode 100644 MisDataSaveDateDll/dll/MQTTnet.dll create mode 100644 MisDataSaveDateDll/dll/Newtonsoft.Json.dll create mode 100644 PrintBarCode/21PrintBarCode.csproj create mode 100644 PrintBarCode/App.config create mode 100644 PrintBarCode/DB.cs create mode 100644 PrintBarCode/PrintBarCodeForm.Designer.cs create mode 100644 PrintBarCode/PrintBarCodeForm.cs create mode 100644 PrintBarCode/PrintBarCodeForm.resx create mode 100644 PrintBarCode/Program.cs create mode 100644 PrintBarCode/Properties/AssemblyInfo.cs create mode 100644 PrintBarCode/Properties/Resources.Designer.cs create mode 100644 PrintBarCode/Properties/Resources.resx create mode 100644 PrintBarCode/Properties/Settings.Designer.cs create mode 100644 PrintBarCode/Properties/Settings.settings create mode 100644 SyUpLoad/SyUpLoad.sln create mode 100644 SyUpLoad/SyUpLoad/App.config create mode 100644 SyUpLoad/SyUpLoad/BarCode/MESPC.BarCode.Read.cs create mode 100644 SyUpLoad/SyUpLoad/BarCode/MESPC.BarCode.cs create mode 100644 SyUpLoad/SyUpLoad/BarCode/_system~.ini create mode 100644 SyUpLoad/SyUpLoad/Fun1.EngineTypeGetOverPLC.cs create mode 100644 SyUpLoad/SyUpLoad/Fun2.cs create mode 100644 SyUpLoad/SyUpLoad/Fun3.EngineTypeGetOverPLC.cs create mode 100644 SyUpLoad/SyUpLoad/Methods/EngineGetOverBaseWork.cs create mode 100644 SyUpLoad/SyUpLoad/Methods/SubmitToMisweb.cs create mode 100644 SyUpLoad/SyUpLoad/Methods/UDP.Send.cs create mode 100644 SyUpLoad/SyUpLoad/Methods/vssver2.scc create mode 100644 SyUpLoad/SyUpLoad/PartLoad.CreateEngineID.cs create mode 100644 SyUpLoad/SyUpLoad/PartLoad.Designer.cs create mode 100644 SyUpLoad/SyUpLoad/PartLoad.Fun1.BarCode.cs create mode 100644 SyUpLoad/SyUpLoad/PartLoad.Fun1.PartLoad.cs create mode 100644 SyUpLoad/SyUpLoad/PartLoad.Fun1.cs create mode 100644 SyUpLoad/SyUpLoad/PartLoad.SetControl.cs create mode 100644 SyUpLoad/SyUpLoad/PartLoad.cs create mode 100644 SyUpLoad/SyUpLoad/PartLoad.resx create mode 100644 SyUpLoad/SyUpLoad/Program.cs create mode 100644 SyUpLoad/SyUpLoad/Properties/AssemblyInfo.cs create mode 100644 SyUpLoad/SyUpLoad/Properties/Resources.Designer.cs create mode 100644 SyUpLoad/SyUpLoad/Properties/Resources.resx create mode 100644 SyUpLoad/SyUpLoad/Properties/Settings.Designer.cs create mode 100644 SyUpLoad/SyUpLoad/Properties/Settings.settings create mode 100644 SyUpLoad/SyUpLoad/SyUpLoad.csproj create mode 100644 SyUpLoad/SyUpLoad/packages.config create mode 100644 SyUpLoad/dll/00.1Newtonsoft.Json.dll create mode 100644 SyUpLoad/dll/00.1Newtonsoft.Json.pdb create mode 100644 SyUpLoad/dll/00MesWorkMqtt.dll create mode 100644 SyUpLoad/dll/00MesWorkMqtt.pdb create mode 100644 SyUpLoad/dll/01DoWhatPlc.dll create mode 100644 SyUpLoad/dll/01DoWhatPlc.pdb create mode 100644 SyUpLoad/dll/02WebApiCall.dll create mode 100644 SyUpLoad/dll/02WebApiCall.dll.config create mode 100644 SyUpLoad/dll/02WebApiCall.pdb create mode 100644 SyUpLoad/dll/04DataBaseAccess.dll create mode 100644 SyUpLoad/dll/04DataBaseAccess.pdb create mode 100644 SyUpLoad/dll/07BusinessFacade.dll create mode 100644 SyUpLoad/dll/07BusinessFacade.pdb create mode 100644 SyUpLoad/dll/08WebFun_base.dll create mode 100644 SyUpLoad/dll/08WebFun_base.pdb create mode 100644 SyUpLoad/dll/09MesDataFunction.dll create mode 100644 SyUpLoad/dll/09MesDataFunction.pdb create mode 100644 SyUpLoad/dll/BusinessFacade.pdb create mode 100644 SyUpLoad/dll/MQTTnet.Extensions.ManagedClient.dll create mode 100644 SyUpLoad/dll/MQTTnet.dll create mode 100644 SyUpLoadBak/SyUpLoad.sln create mode 100644 SyUpLoadBak/SyUpLoad/App.config create mode 100644 SyUpLoadBak/SyUpLoad/BarCode/MESPC.BarCode.Read.cs create mode 100644 SyUpLoadBak/SyUpLoad/BarCode/MESPC.BarCode.cs create mode 100644 SyUpLoadBak/SyUpLoad/BarCode/_system~.ini create mode 100644 SyUpLoadBak/SyUpLoad/Methods/EngineGetOverBaseWork.cs create mode 100644 SyUpLoadBak/SyUpLoad/Methods/SubmitToMisweb.cs create mode 100644 SyUpLoadBak/SyUpLoad/Methods/UDP.Send.cs create mode 100644 SyUpLoadBak/SyUpLoad/Methods/vssver2.scc create mode 100644 SyUpLoadBak/SyUpLoad/PartLoad.CreateEngineID.cs create mode 100644 SyUpLoadBak/SyUpLoad/PartLoad.Designer.cs create mode 100644 SyUpLoadBak/SyUpLoad/PartLoad.Fun0.BarCode.cs create mode 100644 SyUpLoadBak/SyUpLoad/PartLoad.Fun1.PartLoad.cs create mode 100644 SyUpLoadBak/SyUpLoad/PartLoad.Fun1.cs create mode 100644 SyUpLoadBak/SyUpLoad/PartLoad.Fun2.cs create mode 100644 SyUpLoadBak/SyUpLoad/PartLoad.Fun3.cs create mode 100644 SyUpLoadBak/SyUpLoad/PartLoad.SetControl.cs create mode 100644 SyUpLoadBak/SyUpLoad/PartLoad.cs create mode 100644 SyUpLoadBak/SyUpLoad/PartLoad.resx create mode 100644 SyUpLoadBak/SyUpLoad/Program.cs create mode 100644 SyUpLoadBak/SyUpLoad/Properties/AssemblyInfo.cs create mode 100644 SyUpLoadBak/SyUpLoad/Properties/Resources.Designer.cs create mode 100644 SyUpLoadBak/SyUpLoad/Properties/Resources.resx create mode 100644 SyUpLoadBak/SyUpLoad/Properties/Settings.Designer.cs create mode 100644 SyUpLoadBak/SyUpLoad/Properties/Settings.settings create mode 100644 SyUpLoadBak/SyUpLoad/SyUpLoad.csproj create mode 100644 SyUpLoadBak/SyUpLoad/packages.config create mode 100644 SyUpLoadBak/dll/00.1Newtonsoft.Json.dll create mode 100644 SyUpLoadBak/dll/00.1Newtonsoft.Json.pdb create mode 100644 SyUpLoadBak/dll/00MesWorkMqtt.dll create mode 100644 SyUpLoadBak/dll/00MesWorkMqtt.pdb create mode 100644 SyUpLoadBak/dll/01DoWhatPlc.dll create mode 100644 SyUpLoadBak/dll/01DoWhatPlc.pdb create mode 100644 SyUpLoadBak/dll/02WebApiCall.dll create mode 100644 SyUpLoadBak/dll/02WebApiCall.dll.config create mode 100644 SyUpLoadBak/dll/02WebApiCall.pdb create mode 100644 SyUpLoadBak/dll/04DataBaseAccess.dll create mode 100644 SyUpLoadBak/dll/04DataBaseAccess.pdb create mode 100644 SyUpLoadBak/dll/07BusinessFacade.dll create mode 100644 SyUpLoadBak/dll/07BusinessFacade.pdb create mode 100644 SyUpLoadBak/dll/08WebFun_base.dll create mode 100644 SyUpLoadBak/dll/08WebFun_base.pdb create mode 100644 SyUpLoadBak/dll/09MesDataFunction.dll create mode 100644 SyUpLoadBak/dll/09MesDataFunction.pdb create mode 100644 SyUpLoadBak/dll/BusinessFacade.pdb create mode 100644 SyUpLoadBak/dll/MQTTnet.Extensions.ManagedClient.dll create mode 100644 SyUpLoadBak/dll/MQTTnet.dll create mode 100644 SystemConfig.xml create mode 100644 TagTypeCodeID/TagTypeCodeID.sln create mode 100644 TagTypeCodeID/TagTypeCodeID/13.2TagTypeCodeID.csproj create mode 100644 TagTypeCodeID/TagTypeCodeID/InitMqtt2TagTypeCodeID.cs create mode 100644 TagTypeCodeID/TagTypeCodeID/Properties/AssemblyInfo.cs create mode 100644 Test/ManualSimulateSignal.cs create mode 100644 Test/MisDataWebFun.Designer.cs create mode 100644 Test/MisDataWebFun.cs create mode 100644 Test/MisDataWebFun.resx create mode 100644 Test/ReadThisStationProductInfo.cs create mode 100644 Test/WriteQualityValueForm.Designer.cs create mode 100644 Test/WriteQualityValueForm.cs create mode 100644 Test/WriteQualityValueForm.resx create mode 100644 dll_common/AsyncIO.dll create mode 100644 dll_common/BasicData.dll create mode 100644 dll_common/BasicData.pdb create mode 100644 dll_common/BouncyCastle.Crypto.dll create mode 100644 dll_common/ConLink.dll create mode 100644 dll_common/DataLinkMesWork.dll create mode 100644 dll_common/ICSharpCode.SharpZipLib.dll create mode 100644 dll_common/MQTT.dll create mode 100644 dll_common/MQTTnet.Extensions.ManagedClient.dll create mode 100644 dll_common/MQTTnet.dll create mode 100644 dll_common/MesControl.dll create mode 100644 dll_common/MesControl.pdb create mode 100644 dll_common/MesWork.DeviceDriver.dll create mode 100644 dll_common/MesWork.DeviceDriver.pdb create mode 100644 dll_common/MesWork.PLC.dll create mode 100644 dll_common/MesWork.PLC.pdb create mode 100644 dll_common/MesWork.exe.config create mode 100644 dll_common/MesWork.pdb create mode 100644 dll_common/Monitor.MesWork.dll create mode 100644 dll_common/Monitor.MesWork.pdb create mode 100644 dll_common/Monitor.MesWork.xml create mode 100644 dll_common/NPOI.OOXML.dll create mode 100644 dll_common/NPOI.OpenXml4Net.dll create mode 100644 dll_common/NPOI.OpenXmlFormats.dll create mode 100644 dll_common/NPOI.dll create mode 100644 dll_common/NetMQ.dll create mode 100644 dll_common/Newtonsoft.Json.7z create mode 100644 dll_common/Newtonsoft.Json.dll create mode 100644 dll_common/Opc.Ua.Client.dll create mode 100644 dll_common/Opc.Ua.Configuration.dll create mode 100644 dll_common/Opc.Ua.Core.dll create mode 100644 dll_common/OpcUaHelper.dll create mode 100644 dll_common/OpcUaHelper.pdb create mode 100644 dll_common/OpcUaHelper.xml create mode 100644 dll_common/SqlCmd.dll create mode 100644 dll_common/System.Net.Http.Formatting.dll create mode 100644 dll_common/System.Net.Http.dll create mode 100644 dll_common/System.Web.Cors.dll create mode 100644 dll_common/System.Web.Http.Cors.dll create mode 100644 dll_common/System.Web.Http.SelfHost.dll create mode 100644 dll_common/System.Web.Http.dll create mode 100644 dll_common/WC.xlsx create mode 100644 dll_fun/00.1Newtonsoft.Json.dll create mode 100644 dll_fun/00.1Newtonsoft.Json.pdb create mode 100644 dll_fun/00MesWorkMqtt.dll create mode 100644 dll_fun/00MesWorkMqtt.pdb create mode 100644 dll_fun/02WebApiCall.dll create mode 100644 dll_fun/02WebApiCall.dll.config create mode 100644 dll_fun/02WebApiCall.pdb create mode 100644 dll_fun/04DataBaseAccess.dll create mode 100644 dll_fun/04DataBaseAccess.pdb create mode 100644 dll_fun/07BusinessFacade.dll create mode 100644 dll_fun/07BusinessFacade.pdb create mode 100644 dll_fun/08WebFun_base.dll create mode 100644 dll_fun/08WebFun_base.pdb create mode 100644 dll_fun/09MesDataFunction.dll create mode 100644 dll_fun/09MesDataFunction.pdb create mode 100644 dll_fun/BasicData.dll create mode 100644 dll_fun/BasicData.pdb create mode 100644 dll_fun/DoWhatPlc.dll create mode 100644 dll_fun/DoWhatPlc.pdb create mode 100644 dll_fun/Function1051.dll create mode 100644 dll_fun/Function1051.dll.config create mode 100644 dll_fun/Function1051.pdb create mode 100644 dll_fun/Function1052.dll create mode 100644 dll_fun/Function1052.dll.config create mode 100644 dll_fun/Function1052.pdb create mode 100644 dll_fun/Function1053.dll create mode 100644 dll_fun/Function1053.dll.config create mode 100644 dll_fun/Function1053.pdb create mode 100644 dll_fun/Function1054.dll create mode 100644 dll_fun/Function1054.dll.config create mode 100644 dll_fun/Function1054.pdb create mode 100644 dll_fun/Function1055.dll create mode 100644 dll_fun/Function1055.dll.config create mode 100644 dll_fun/Function1055.pdb create mode 100644 dll_fun/Function1056.dll create mode 100644 dll_fun/Function1056.dll.config create mode 100644 dll_fun/Function1056.pdb create mode 100644 dll_fun/Function1057.dll create mode 100644 dll_fun/Function1057.dll.config create mode 100644 dll_fun/Function1057.pdb create mode 100644 dll_fun/Function1058.dll create mode 100644 dll_fun/Function1058.dll.config create mode 100644 dll_fun/Function1058.pdb create mode 100644 dll_fun/Function1059.dll create mode 100644 dll_fun/Function1059.dll.config create mode 100644 dll_fun/Function1059.pdb create mode 100644 dll_fun/Function1060.dll create mode 100644 dll_fun/Function1060.dll.config create mode 100644 dll_fun/Function1060.pdb create mode 100644 dll_fun/Function1061.dll create mode 100644 dll_fun/Function1061.dll.config create mode 100644 dll_fun/Function1061.pdb create mode 100644 dll_fun/MIS_FuntionSaveData.dll create mode 100644 dll_fun/MIS_FuntionSaveData.pdb create mode 100644 dll_fun/MQTTnet.Extensions.ManagedClient.dll create mode 100644 dll_fun/MQTTnet.dll create mode 100644 dll_fun/MesWork.DeviceDriver.dll create mode 100644 dll_fun/MesWork.DeviceDriver.pdb create mode 100644 dll_fun/MesWork.PLC.dll create mode 100644 dll_fun/MesWork.PLC.pdb create mode 100644 dll_fun/MyLog4Net.dll create mode 100644 dll_fun/MyLog4Net.pdb create mode 100644 dll_fun/Newtonsoft.Json.dll create mode 100644 dll_fun/SendMessageToWebMqtt.dll create mode 100644 dll_fun/SendMessageToWebMqtt.pdb create mode 100644 dll_fun/log4net.config create mode 100644 dll_fun/log4net.dll create mode 100644 基本变量.xlsx create mode 100644 数据库结构.xlsx diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..760cc32 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +bin/ +obj/ +.vs/ +packages/ +TestResults/ + +# Build outputs +Debug/ +Release/ +x64/ +x86/ + +# User-specific files +*.user +*.suo +*.rsuser +*.userosscache +*.sln.docstates + +# Logs and temporary files +*.log +*.tmp +*.cache +*.pidb +*.svclog + +# OS / editor files +.DS_Store +.idea/ +.vscode/ +Thumbs.db diff --git a/AllProject/AllProject.sln b/AllProject/AllProject.sln new file mode 100644 index 0000000..0c5c084 --- /dev/null +++ b/AllProject/AllProject.sln @@ -0,0 +1,91 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32901.82 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AllProject", "AllProject\AllProject.csproj", "{B1BE81E0-92C2-4917-A371-3B5FEBB9130A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "00-0Json8.3.1", "..\Common\00-1Json8.3\Json8.3\00-0Json8.3.1.csproj", "{1A10FDB2-1A6A-44A8-AB4D-33387563247E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "00MesWorkMqtt", "..\Common\00MesWorkMqtt\MesWorkMqtt\00MesWorkMqtt.csproj", "{F55DA1A0-A982-4479-8C47-0D9A5AAF3E18}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "01_01DoWhatPlc", "..\Common\01DoWhatPlc\01_01DoWhatPlc.csproj", "{0D1AF432-439A-4920-8692-43AE139F5530}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "02_02WebApiCallPLC", "..\Common\02WebApiCall\02_02WebApiCallPLC.csproj", "{3E6D1DD5-01C9-435F-9941-61F906CE35BB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "04-DataBaseAccess", "..\Common\04DataBaseAccess\DataBaseAccess\04-DataBaseAccess.csproj", "{F434E066-4C59-47C8-AA82-6F48CC84501A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "07BusinessFacade", "..\Common\07WebBusinessFacade\BusinessFacade\07BusinessFacade.csproj", "{F0A0C525-03FD-428A-9B17-7F54AA0E4475}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "08-WebFun_base", "..\Common\08WebFun_base\WebFun_base\08-WebFun_base.csproj", "{D98BE764-ADEB-488D-9714-61E308AA8201}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "09-MesDataFunction", "..\Common\09MesDataFunction\MesDataFunction\09-MesDataFunction.csproj", "{90E76FB4-646D-45E2-95DB-0B8AB4E465D6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{9B678E8D-8B21-4F41-9A5D-DD3FF4E304D0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyUpLoad", "..\SyUpLoad\SyUpLoad\SyUpLoad.csproj", "{81604748-73C5-43FA-8E27-BE0AB28618C3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B1BE81E0-92C2-4917-A371-3B5FEBB9130A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B1BE81E0-92C2-4917-A371-3B5FEBB9130A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B1BE81E0-92C2-4917-A371-3B5FEBB9130A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B1BE81E0-92C2-4917-A371-3B5FEBB9130A}.Release|Any CPU.Build.0 = Release|Any CPU + {1A10FDB2-1A6A-44A8-AB4D-33387563247E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1A10FDB2-1A6A-44A8-AB4D-33387563247E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1A10FDB2-1A6A-44A8-AB4D-33387563247E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1A10FDB2-1A6A-44A8-AB4D-33387563247E}.Release|Any CPU.Build.0 = Release|Any CPU + {F55DA1A0-A982-4479-8C47-0D9A5AAF3E18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F55DA1A0-A982-4479-8C47-0D9A5AAF3E18}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F55DA1A0-A982-4479-8C47-0D9A5AAF3E18}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F55DA1A0-A982-4479-8C47-0D9A5AAF3E18}.Release|Any CPU.Build.0 = Release|Any CPU + {0D1AF432-439A-4920-8692-43AE139F5530}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0D1AF432-439A-4920-8692-43AE139F5530}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D1AF432-439A-4920-8692-43AE139F5530}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0D1AF432-439A-4920-8692-43AE139F5530}.Release|Any CPU.Build.0 = Release|Any CPU + {3E6D1DD5-01C9-435F-9941-61F906CE35BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3E6D1DD5-01C9-435F-9941-61F906CE35BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3E6D1DD5-01C9-435F-9941-61F906CE35BB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3E6D1DD5-01C9-435F-9941-61F906CE35BB}.Release|Any CPU.Build.0 = Release|Any CPU + {F434E066-4C59-47C8-AA82-6F48CC84501A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F434E066-4C59-47C8-AA82-6F48CC84501A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F434E066-4C59-47C8-AA82-6F48CC84501A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F434E066-4C59-47C8-AA82-6F48CC84501A}.Release|Any CPU.Build.0 = Release|Any CPU + {F0A0C525-03FD-428A-9B17-7F54AA0E4475}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F0A0C525-03FD-428A-9B17-7F54AA0E4475}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F0A0C525-03FD-428A-9B17-7F54AA0E4475}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F0A0C525-03FD-428A-9B17-7F54AA0E4475}.Release|Any CPU.Build.0 = Release|Any CPU + {D98BE764-ADEB-488D-9714-61E308AA8201}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D98BE764-ADEB-488D-9714-61E308AA8201}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D98BE764-ADEB-488D-9714-61E308AA8201}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D98BE764-ADEB-488D-9714-61E308AA8201}.Release|Any CPU.Build.0 = Release|Any CPU + {90E76FB4-646D-45E2-95DB-0B8AB4E465D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90E76FB4-646D-45E2-95DB-0B8AB4E465D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90E76FB4-646D-45E2-95DB-0B8AB4E465D6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90E76FB4-646D-45E2-95DB-0B8AB4E465D6}.Release|Any CPU.Build.0 = Release|Any CPU + {81604748-73C5-43FA-8E27-BE0AB28618C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {81604748-73C5-43FA-8E27-BE0AB28618C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {81604748-73C5-43FA-8E27-BE0AB28618C3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {81604748-73C5-43FA-8E27-BE0AB28618C3}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {1A10FDB2-1A6A-44A8-AB4D-33387563247E} = {9B678E8D-8B21-4F41-9A5D-DD3FF4E304D0} + {F55DA1A0-A982-4479-8C47-0D9A5AAF3E18} = {9B678E8D-8B21-4F41-9A5D-DD3FF4E304D0} + {0D1AF432-439A-4920-8692-43AE139F5530} = {9B678E8D-8B21-4F41-9A5D-DD3FF4E304D0} + {3E6D1DD5-01C9-435F-9941-61F906CE35BB} = {9B678E8D-8B21-4F41-9A5D-DD3FF4E304D0} + {F434E066-4C59-47C8-AA82-6F48CC84501A} = {9B678E8D-8B21-4F41-9A5D-DD3FF4E304D0} + {F0A0C525-03FD-428A-9B17-7F54AA0E4475} = {9B678E8D-8B21-4F41-9A5D-DD3FF4E304D0} + {D98BE764-ADEB-488D-9714-61E308AA8201} = {9B678E8D-8B21-4F41-9A5D-DD3FF4E304D0} + {90E76FB4-646D-45E2-95DB-0B8AB4E465D6} = {9B678E8D-8B21-4F41-9A5D-DD3FF4E304D0} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1E934AE4-5695-475E-9380-9EE6DDD95304} + EndGlobalSection +EndGlobal diff --git a/AllProject/AllProject/AllProject.csproj b/AllProject/AllProject/AllProject.csproj new file mode 100644 index 0000000..aacd931 --- /dev/null +++ b/AllProject/AllProject/AllProject.csproj @@ -0,0 +1,80 @@ + + + + + Debug + AnyCPU + {B1BE81E0-92C2-4917-A371-3B5FEBB9130A} + WinExe + AllProject + AllProject + v4.6.1 + 512 + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + Form + + + Form1.cs + + + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + \ No newline at end of file diff --git a/AllProject/AllProject/App.config b/AllProject/AllProject/App.config new file mode 100644 index 0000000..731f6de --- /dev/null +++ b/AllProject/AllProject/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/AllProject/AllProject/Form1.Designer.cs b/AllProject/AllProject/Form1.Designer.cs new file mode 100644 index 0000000..80eb14f --- /dev/null +++ b/AllProject/AllProject/Form1.Designer.cs @@ -0,0 +1,41 @@ + +namespace AllProject +{ + partial class Form1 + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Text = "Form1"; + } + + #endregion + } +} + diff --git a/AllProject/AllProject/Form1.cs b/AllProject/AllProject/Form1.cs new file mode 100644 index 0000000..bf97e02 --- /dev/null +++ b/AllProject/AllProject/Form1.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace AllProject +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + } +} diff --git a/AllProject/AllProject/Program.cs b/AllProject/AllProject/Program.cs new file mode 100644 index 0000000..fa7ceeb --- /dev/null +++ b/AllProject/AllProject/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace AllProject +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} diff --git a/AllProject/AllProject/Properties/AssemblyInfo.cs b/AllProject/AllProject/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..58df017 --- /dev/null +++ b/AllProject/AllProject/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("AllProject")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AllProject")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("b1be81e0-92c2-4917-a371-3b5febb9130a")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/AllProject/AllProject/Properties/Resources.Designer.cs b/AllProject/AllProject/Properties/Resources.Designer.cs new file mode 100644 index 0000000..f11efeb --- /dev/null +++ b/AllProject/AllProject/Properties/Resources.Designer.cs @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本: 4.0.30319.42000 +// +// 对此文件的更改可能导致不正确的行为,如果 +// 重新生成代码,则所做更改将丢失。 +// +//------------------------------------------------------------------------------ + + +namespace AllProject.Properties +{ + /// + /// 强类型资源类,用于查找本地化字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或删除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// 返回此类使用的缓存 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AllProject.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/AllProject/AllProject/Properties/Resources.resx b/AllProject/AllProject/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/AllProject/AllProject/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/AllProject/AllProject/Properties/Settings.Designer.cs b/AllProject/AllProject/Properties/Settings.Designer.cs new file mode 100644 index 0000000..cf88263 --- /dev/null +++ b/AllProject/AllProject/Properties/Settings.Designer.cs @@ -0,0 +1,29 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + + +namespace AllProject.Properties +{ + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/AllProject/AllProject/Properties/Settings.settings b/AllProject/AllProject/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/AllProject/AllProject/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/AllProject/输出-调试.txt b/AllProject/输出-调试.txt new file mode 100644 index 0000000..825c63a --- /dev/null +++ b/AllProject/输出-调试.txt @@ -0,0 +1,289 @@ +“MisDataSaveDate.exe”(CLR v4.0.30319: DefaultDomain): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 +“MisDataSaveDate.exe”(CLR v4.0.30319: DefaultDomain): 已加载“C:\project\siYuan\新项目20220927\新项目\MisDataSaveDate\MisDataSaveDate\bin\Debug\MisDataSaveDate.exe”。已加载符号。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\project\siYuan\新项目20220927\新项目\MisDataSaveDate\MisDataSaveDate\bin\Debug\00MesWorkMqtt.dll”。已加载符号。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\project\siYuan\新项目20220927\新项目\MisDataSaveDate\MisDataSaveDate\bin\Debug\MQTTnet.Extensions.ManagedClient.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\project\siYuan\新项目20220927\新项目\MisDataSaveDate\MisDataSaveDate\bin\Debug\MQTTnet.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\project\siYuan\新项目20220927\新项目\MisDataSaveDate\MisDataSaveDate\bin\Debug\09MesDataFunction.dll”。已加载符号。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_zh-Hans_b77a5c561934e089\mscorlib.resources.dll”。模块已生成,不包含符号。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\project\siYuan\新项目20220927\新项目\MisDataSaveDate\MisDataSaveDate\bin\Debug\08WebFun_base.dll”。已加载符号。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\project\siYuan\新项目20220927\新项目\MisDataSaveDate\MisDataSaveDate\bin\Debug\02WebApiCall.dll”。已加载符号。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\project\siYuan\新项目20220927\新项目\MisDataSaveDate\MisDataSaveDate\bin\Debug\DoWhatPlc.dll”。已加载符号。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\project\siYuan\新项目20220927\新项目\MisDataSaveDate\MisDataSaveDate\bin\Debug\00.1Newtonsoft.Json.dll”。已加载符号。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Net.Http\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Net.Http.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c561934e089\System.Numerics.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Runtime.Serialization\v4.0_4.0.0.0__b77a5c561934e089\System.Runtime.Serialization.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Xml.Linq\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.Linq.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 +引发的异常:“System.ArgumentException”(位于 00.1Newtonsoft.Json.dll 中) +引发的异常:“Newtonsoft.Json.JsonSerializationException”(位于 00.1Newtonsoft.Json.dll 中) +引发的异常:“Newtonsoft.Json.JsonSerializationException”(位于 00.1Newtonsoft.Json.dll 中) +线程 0x522c 已退出,返回值为 0 (0x0)。 +线程 0x3ee4 已退出,返回值为 0 (0x0)。 +线程 0x490c 已退出,返回值为 0 (0x0)。 +线程 0x480c 已退出,返回值为 0 (0x0)。 +线程 0xe00 已退出,返回值为 0 (0x0)。 +线程 0x6394 已退出,返回值为 0 (0x0)。 +线程 0x55dc 已退出,返回值为 0 (0x0)。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\project\siYuan\新项目20220927\新项目\MisDataSaveDate\MisDataSaveDate\bin\Debug\04DataBaseAccess.dll”。已加载符号。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Data.resources\v4.0_4.0.0.0_zh-Hans_b77a5c561934e089\System.Data.resources.dll”。模块已生成,不包含符号。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.Transactions\v4.0_4.0.0.0__b77a5c561934e089\System.Transactions.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.Wrapper.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Runtime.Caching\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Runtime.Caching.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。 +“MisDataSaveDate.exe”(CLR v4.0.30319: MisDataSaveDate.exe): 已加载“C:\project\siYuan\新项目20220927\新项目\MisDataSaveDate\MisDataSaveDate\bin\Debug\07BusinessFacade.dll”。已加载符号。 +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +线程 0x5ea4 已退出,返回值为 0 (0x0)。 +线程 0x59f0 已退出,返回值为 0 (0x0)。 +线程 0x6e68 已退出,返回值为 0 (0x0)。 +线程 0x4f0c 已退出,返回值为 0 (0x0)。 +线程 0x3bac 已退出,返回值为 0 (0x0)。 +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +线程 0x49a4 已退出,返回值为 0 (0x0)。 +线程 0x22e4 已退出,返回值为 0 (0x0)。 +线程 0x3060 已退出,返回值为 0 (0x0)。 +线程 0x4734 已退出,返回值为 0 (0x0)。 +线程 0x596c 已退出,返回值为 0 (0x0)。 +线程 0x5a28 已退出,返回值为 0 (0x0)。 +线程 0x5ecc 已退出,返回值为 0 (0x0)。 +线程 0x3108 已退出,返回值为 0 (0x0)。 +线程 0x4ad0 已退出,返回值为 0 (0x0)。 +线程 0x78a0 已退出,返回值为 0 (0x0)。 +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +线程 0x31dc 已退出,返回值为 0 (0x0)。 +线程 0x8098 已退出,返回值为 0 (0x0)。 +线程 0x698c 已退出,返回值为 0 (0x0)。 +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +引发的异常:“System.IndexOutOfRangeException”(位于 MisDataSaveDate.exe 中) +线程 0x7f34 已退出,返回值为 0 (0x0)。 +线程 0x1f0 已退出,返回值为 0 (0x0)。 +线程 0x6c3c 已退出,返回值为 0 (0x0)。 +线程 0x3408 已退出,返回值为 0 (0x0)。 +线程 0x6100 已退出,返回值为 0 (0x0)。 +线程 0x4d58 已退出,返回值为 0 (0x0)。 +线程 0x86e0 已退出,返回值为 0 (0x0)。 +线程 0x5278 已退出,返回值为 0 (0x0)。 +线程 0x7fc0 已退出,返回值为 0 (0x0)。 +线程 0x7ab8 已退出,返回值为 0 (0x0)。 +线程 0x6ca8 已退出,返回值为 0 (0x0)。 +线程 0x10c 已退出,返回值为 0 (0x0)。 +线程 0x6da8 已退出,返回值为 0 (0x0)。 +线程 0x1b78 已退出,返回值为 0 (0x0)。 +线程 0x5d00 已退出,返回值为 0 (0x0)。 +线程 0x73ec 已退出,返回值为 0 (0x0)。 +线程 0x5200 已退出,返回值为 0 (0x0)。 +线程 0x6e24 已退出,返回值为 0 (0x0)。 +线程 0x6f1c 已退出,返回值为 0 (0x0)。 +程序“[0x8004] MisDataSaveDate.exe”已退出,返回值为 -1 (0xffffffff)。 diff --git a/Common/00-1Json8.3/Json8.3.1.sln b/Common/00-1Json8.3/Json8.3.1.sln new file mode 100644 index 0000000..66b32b1 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3.1.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32901.82 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Json8.3.1", "Json8.3\Json8.3.1.csproj", "{1A10FDB2-1A6A-44A8-AB4D-33387563247E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1A10FDB2-1A6A-44A8-AB4D-33387563247E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1A10FDB2-1A6A-44A8-AB4D-33387563247E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1A10FDB2-1A6A-44A8-AB4D-33387563247E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1A10FDB2-1A6A-44A8-AB4D-33387563247E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {D9ACD33B-2F73-4386-803A-D240435BDD0C} + EndGlobalSection +EndGlobal diff --git a/Common/00-1Json8.3/Json8.3/00-0Json8.3.1.csproj b/Common/00-1Json8.3/Json8.3/00-0Json8.3.1.csproj new file mode 100644 index 0000000..42dada8 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/00-0Json8.3.1.csproj @@ -0,0 +1,244 @@ + + + + + Debug + AnyCPU + {1A10FDB2-1A6A-44A8-AB4D-33387563247E} + Library + Properties + Newtonsoft.Json + 00.1Newtonsoft.Json + v4.8 + 512 + true + + + + true + full + false + ..\..\dll\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Bson/BsonBinaryType.cs b/Common/00-1Json8.3/Json8.3/Bson/BsonBinaryType.cs new file mode 100644 index 0000000..638039f --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Bson/BsonBinaryType.cs @@ -0,0 +1,44 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json.Bson +{ + internal enum BsonBinaryType : byte + { + Binary = 0x00, + Function = 0x01, + + [Obsolete("This type has been deprecated in the BSON specification. Use Binary instead.")] + BinaryOld = 0x02, + + [Obsolete("This type has been deprecated in the BSON specification. Use Uuid instead.")] + UuidOld = 0x03, + Uuid = 0x04, + Md5 = 0x05, + UserDefined = 0x80 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Bson/BsonBinaryWriter.cs b/Common/00-1Json8.3/Json8.3/Bson/BsonBinaryWriter.cs new file mode 100644 index 0000000..5cd2bbf --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Bson/BsonBinaryWriter.cs @@ -0,0 +1,331 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Globalization; +using System.IO; +using System.Text; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Bson +{ + internal class BsonBinaryWriter + { + private static readonly Encoding Encoding = new UTF8Encoding(false); + + private readonly BinaryWriter _writer; + + private byte[] _largeByteBuffer; + + public DateTimeKind DateTimeKindHandling { get; set; } + + public BsonBinaryWriter(BinaryWriter writer) + { + DateTimeKindHandling = DateTimeKind.Utc; + _writer = writer; + } + + public void Flush() + { + _writer.Flush(); + } + + public void Close() + { +#if !(DOTNET || PORTABLE40 || PORTABLE) + _writer.Close(); +#else + _writer.Dispose(); +#endif + } + + public void WriteToken(BsonToken t) + { + CalculateSize(t); + WriteTokenInternal(t); + } + + private void WriteTokenInternal(BsonToken t) + { + switch (t.Type) + { + case BsonType.Object: + { + BsonObject value = (BsonObject)t; + _writer.Write(value.CalculatedSize); + foreach (BsonProperty property in value) + { + _writer.Write((sbyte)property.Value.Type); + WriteString((string)property.Name.Value, property.Name.ByteCount, null); + WriteTokenInternal(property.Value); + } + _writer.Write((byte)0); + } + break; + case BsonType.Array: + { + BsonArray value = (BsonArray)t; + _writer.Write(value.CalculatedSize); + ulong index = 0; + foreach (BsonToken c in value) + { + _writer.Write((sbyte)c.Type); + WriteString(index.ToString(CultureInfo.InvariantCulture), MathUtils.IntLength(index), null); + WriteTokenInternal(c); + index++; + } + _writer.Write((byte)0); + } + break; + case BsonType.Integer: + { + BsonValue value = (BsonValue)t; + _writer.Write(Convert.ToInt32(value.Value, CultureInfo.InvariantCulture)); + } + break; + case BsonType.Long: + { + BsonValue value = (BsonValue)t; + _writer.Write(Convert.ToInt64(value.Value, CultureInfo.InvariantCulture)); + } + break; + case BsonType.Number: + { + BsonValue value = (BsonValue)t; + _writer.Write(Convert.ToDouble(value.Value, CultureInfo.InvariantCulture)); + } + break; + case BsonType.String: + { + BsonString value = (BsonString)t; + WriteString((string)value.Value, value.ByteCount, value.CalculatedSize - 4); + } + break; + case BsonType.Boolean: + { + BsonValue value = (BsonValue)t; + _writer.Write((bool)value.Value); + } + break; + case BsonType.Null: + case BsonType.Undefined: + break; + case BsonType.Date: + { + BsonValue value = (BsonValue)t; + + long ticks = 0; + + if (value.Value is DateTime) + { + DateTime dateTime = (DateTime)value.Value; + if (DateTimeKindHandling == DateTimeKind.Utc) + { + dateTime = dateTime.ToUniversalTime(); + } + else if (DateTimeKindHandling == DateTimeKind.Local) + { + dateTime = dateTime.ToLocalTime(); + } + + ticks = DateTimeUtils.ConvertDateTimeToJavaScriptTicks(dateTime, false); + } +#if !NET20 + else + { + DateTimeOffset dateTimeOffset = (DateTimeOffset)value.Value; + ticks = DateTimeUtils.ConvertDateTimeToJavaScriptTicks(dateTimeOffset.UtcDateTime, dateTimeOffset.Offset); + } +#endif + + _writer.Write(ticks); + } + break; + case BsonType.Binary: + { + BsonBinary value = (BsonBinary)t; + + byte[] data = (byte[])value.Value; + _writer.Write(data.Length); + _writer.Write((byte)value.BinaryType); + _writer.Write(data); + } + break; + case BsonType.Oid: + { + BsonValue value = (BsonValue)t; + + byte[] data = (byte[])value.Value; + _writer.Write(data); + } + break; + case BsonType.Regex: + { + BsonRegex value = (BsonRegex)t; + + WriteString((string)value.Pattern.Value, value.Pattern.ByteCount, null); + WriteString((string)value.Options.Value, value.Options.ByteCount, null); + } + break; + default: + throw new ArgumentOutOfRangeException(nameof(t), "Unexpected token when writing BSON: {0}".FormatWith(CultureInfo.InvariantCulture, t.Type)); + } + } + + private void WriteString(string s, int byteCount, int? calculatedlengthPrefix) + { + if (calculatedlengthPrefix != null) + { + _writer.Write(calculatedlengthPrefix.GetValueOrDefault()); + } + + WriteUtf8Bytes(s, byteCount); + + _writer.Write((byte)0); + } + + public void WriteUtf8Bytes(string s, int byteCount) + { + if (s != null) + { + if (_largeByteBuffer == null) + { + _largeByteBuffer = new byte[256]; + } + if (byteCount <= 256) + { + Encoding.GetBytes(s, 0, s.Length, _largeByteBuffer, 0); + _writer.Write(_largeByteBuffer, 0, byteCount); + } + else + { + byte[] bytes = Encoding.GetBytes(s); + _writer.Write(bytes); + } + } + } + + private int CalculateSize(int stringByteCount) + { + return stringByteCount + 1; + } + + private int CalculateSizeWithLength(int stringByteCount, bool includeSize) + { + int baseSize = (includeSize) + ? 5 // size bytes + terminator + : 1; // terminator + + return baseSize + stringByteCount; + } + + private int CalculateSize(BsonToken t) + { + switch (t.Type) + { + case BsonType.Object: + { + BsonObject value = (BsonObject)t; + + int bases = 4; + foreach (BsonProperty p in value) + { + int size = 1; + size += CalculateSize(p.Name); + size += CalculateSize(p.Value); + + bases += size; + } + bases += 1; + value.CalculatedSize = bases; + return bases; + } + case BsonType.Array: + { + BsonArray value = (BsonArray)t; + + int size = 4; + ulong index = 0; + foreach (BsonToken c in value) + { + size += 1; + size += CalculateSize(MathUtils.IntLength(index)); + size += CalculateSize(c); + index++; + } + size += 1; + value.CalculatedSize = size; + + return value.CalculatedSize; + } + case BsonType.Integer: + return 4; + case BsonType.Long: + return 8; + case BsonType.Number: + return 8; + case BsonType.String: + { + BsonString value = (BsonString)t; + string s = (string)value.Value; + value.ByteCount = (s != null) ? Encoding.GetByteCount(s) : 0; + value.CalculatedSize = CalculateSizeWithLength(value.ByteCount, value.IncludeLength); + + return value.CalculatedSize; + } + case BsonType.Boolean: + return 1; + case BsonType.Null: + case BsonType.Undefined: + return 0; + case BsonType.Date: + return 8; + case BsonType.Binary: + { + BsonBinary value = (BsonBinary)t; + + byte[] data = (byte[])value.Value; + value.CalculatedSize = 4 + 1 + data.Length; + + return value.CalculatedSize; + } + case BsonType.Oid: + return 12; + case BsonType.Regex: + { + BsonRegex value = (BsonRegex)t; + int size = 0; + size += CalculateSize(value.Pattern); + size += CalculateSize(value.Options); + value.CalculatedSize = size; + + return value.CalculatedSize; + } + default: + throw new ArgumentOutOfRangeException(nameof(t), "Unexpected token when writing BSON: {0}".FormatWith(CultureInfo.InvariantCulture, t.Type)); + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Bson/BsonObjectId.cs b/Common/00-1Json8.3/Json8.3/Bson/BsonObjectId.cs new file mode 100644 index 0000000..0bb603e --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Bson/BsonObjectId.cs @@ -0,0 +1,57 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Bson +{ + /// + /// Represents a BSON Oid (object id). + /// + public class BsonObjectId + { + /// + /// Gets or sets the value of the Oid. + /// + /// The value of the Oid. + public byte[] Value { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + /// The Oid value. + public BsonObjectId(byte[] value) + { + ValidationUtils.ArgumentNotNull(value, nameof(value)); + if (value.Length != 12) + { + throw new ArgumentException("An ObjectId must be 12 bytes", nameof(value)); + } + + Value = value; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Bson/BsonReader.cs b/Common/00-1Json8.3/Json8.3/Bson/BsonReader.cs new file mode 100644 index 0000000..0ea895a --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Bson/BsonReader.cs @@ -0,0 +1,827 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.IO; +using Newtonsoft.Json.Serialization; +using Newtonsoft.Json.Utilities; +using Newtonsoft.Json.Linq; + +namespace Newtonsoft.Json.Bson +{ + /// + /// Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + /// + public class BsonReader : JsonReader + { + private const int MaxCharBytesSize = 128; + private static readonly byte[] SeqRange1 = new byte[] { 0, 127 }; // range of 1-byte sequence + private static readonly byte[] SeqRange2 = new byte[] { 194, 223 }; // range of 2-byte sequence + private static readonly byte[] SeqRange3 = new byte[] { 224, 239 }; // range of 3-byte sequence + private static readonly byte[] SeqRange4 = new byte[] { 240, 244 }; // range of 4-byte sequence + + private readonly BinaryReader _reader; + private readonly List _stack; + + private byte[] _byteBuffer; + private char[] _charBuffer; + + private BsonType _currentElementType; + private BsonReaderState _bsonReaderState; + private ContainerContext _currentContext; + + private bool _readRootValueAsArray; + private bool _jsonNet35BinaryCompatibility; + private DateTimeKind _dateTimeKindHandling; + + private enum BsonReaderState + { + Normal = 0, + ReferenceStart = 1, + ReferenceRef = 2, + ReferenceId = 3, + CodeWScopeStart = 4, + CodeWScopeCode = 5, + CodeWScopeScope = 6, + CodeWScopeScopeObject = 7, + CodeWScopeScopeEnd = 8 + } + + private class ContainerContext + { + public readonly BsonType Type; + public int Length; + public int Position; + + public ContainerContext(BsonType type) + { + Type = type; + } + } + + /// + /// Gets or sets a value indicating whether binary data reading should compatible with incorrect Json.NET 3.5 written binary. + /// + /// + /// true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + /// + [Obsolete("JsonNet35BinaryCompatibility will be removed in a future version of Json.NET.")] + public bool JsonNet35BinaryCompatibility + { + get { return _jsonNet35BinaryCompatibility; } + set { _jsonNet35BinaryCompatibility = value; } + } + + /// + /// Gets or sets a value indicating whether the root object will be read as a JSON array. + /// + /// + /// true if the root object will be read as a JSON array; otherwise, false. + /// + public bool ReadRootValueAsArray + { + get { return _readRootValueAsArray; } + set { _readRootValueAsArray = value; } + } + + /// + /// Gets or sets the used when reading values from BSON. + /// + /// The used when reading values from BSON. + public DateTimeKind DateTimeKindHandling + { + get { return _dateTimeKindHandling; } + set { _dateTimeKindHandling = value; } + } + + /// + /// Initializes a new instance of the class. + /// + /// The stream. + public BsonReader(Stream stream) + : this(stream, false, DateTimeKind.Local) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The reader. + public BsonReader(BinaryReader reader) + : this(reader, false, DateTimeKind.Local) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The stream. + /// if set to true the root object will be read as a JSON array. + /// The used when reading values from BSON. + public BsonReader(Stream stream, bool readRootValueAsArray, DateTimeKind dateTimeKindHandling) + { + ValidationUtils.ArgumentNotNull(stream, nameof(stream)); + _reader = new BinaryReader(stream); + _stack = new List(); + _readRootValueAsArray = readRootValueAsArray; + _dateTimeKindHandling = dateTimeKindHandling; + } + + /// + /// Initializes a new instance of the class. + /// + /// The reader. + /// if set to true the root object will be read as a JSON array. + /// The used when reading values from BSON. + public BsonReader(BinaryReader reader, bool readRootValueAsArray, DateTimeKind dateTimeKindHandling) + { + ValidationUtils.ArgumentNotNull(reader, nameof(reader)); + _reader = reader; + _stack = new List(); + _readRootValueAsArray = readRootValueAsArray; + _dateTimeKindHandling = dateTimeKindHandling; + } + + private string ReadElement() + { + _currentElementType = ReadType(); + string elementName = ReadString(); + return elementName; + } + + /// + /// Reads the next JSON token from the stream. + /// + /// + /// true if the next token was read successfully; false if there are no more tokens to read. + /// + public override bool Read() + { + try + { + bool success; + + switch (_bsonReaderState) + { + case BsonReaderState.Normal: + success = ReadNormal(); + break; + case BsonReaderState.ReferenceStart: + case BsonReaderState.ReferenceRef: + case BsonReaderState.ReferenceId: + success = ReadReference(); + break; + case BsonReaderState.CodeWScopeStart: + case BsonReaderState.CodeWScopeCode: + case BsonReaderState.CodeWScopeScope: + case BsonReaderState.CodeWScopeScopeObject: + case BsonReaderState.CodeWScopeScopeEnd: + success = ReadCodeWScope(); + break; + default: + throw JsonReaderException.Create(this, "Unexpected state: {0}".FormatWith(CultureInfo.InvariantCulture, _bsonReaderState)); + } + + if (!success) + { + SetToken(JsonToken.None); + return false; + } + + return true; + } + catch (EndOfStreamException) + { + SetToken(JsonToken.None); + return false; + } + } + + /// + /// Changes the to Closed. + /// + public override void Close() + { + base.Close(); + + if (CloseInput && _reader != null) + { +#if !(DOTNET || PORTABLE40 || PORTABLE) + _reader.Close(); +#else + _reader.Dispose(); +#endif + } + } + + private bool ReadCodeWScope() + { + switch (_bsonReaderState) + { + case BsonReaderState.CodeWScopeStart: + SetToken(JsonToken.PropertyName, "$code"); + _bsonReaderState = BsonReaderState.CodeWScopeCode; + return true; + case BsonReaderState.CodeWScopeCode: + // total CodeWScope size - not used + ReadInt32(); + + SetToken(JsonToken.String, ReadLengthString()); + _bsonReaderState = BsonReaderState.CodeWScopeScope; + return true; + case BsonReaderState.CodeWScopeScope: + if (CurrentState == State.PostValue) + { + SetToken(JsonToken.PropertyName, "$scope"); + return true; + } + else + { + SetToken(JsonToken.StartObject); + _bsonReaderState = BsonReaderState.CodeWScopeScopeObject; + + ContainerContext newContext = new ContainerContext(BsonType.Object); + PushContext(newContext); + newContext.Length = ReadInt32(); + + return true; + } + case BsonReaderState.CodeWScopeScopeObject: + bool result = ReadNormal(); + if (result && TokenType == JsonToken.EndObject) + { + _bsonReaderState = BsonReaderState.CodeWScopeScopeEnd; + } + + return result; + case BsonReaderState.CodeWScopeScopeEnd: + SetToken(JsonToken.EndObject); + _bsonReaderState = BsonReaderState.Normal; + return true; + default: + throw new ArgumentOutOfRangeException(); + } + } + + private bool ReadReference() + { + switch (CurrentState) + { + case State.ObjectStart: + { + SetToken(JsonToken.PropertyName, JsonTypeReflector.RefPropertyName); + _bsonReaderState = BsonReaderState.ReferenceRef; + return true; + } + case State.Property: + { + if (_bsonReaderState == BsonReaderState.ReferenceRef) + { + SetToken(JsonToken.String, ReadLengthString()); + return true; + } + else if (_bsonReaderState == BsonReaderState.ReferenceId) + { + SetToken(JsonToken.Bytes, ReadBytes(12)); + return true; + } + else + { + throw JsonReaderException.Create(this, "Unexpected state when reading BSON reference: " + _bsonReaderState); + } + } + case State.PostValue: + { + if (_bsonReaderState == BsonReaderState.ReferenceRef) + { + SetToken(JsonToken.PropertyName, JsonTypeReflector.IdPropertyName); + _bsonReaderState = BsonReaderState.ReferenceId; + return true; + } + else if (_bsonReaderState == BsonReaderState.ReferenceId) + { + SetToken(JsonToken.EndObject); + _bsonReaderState = BsonReaderState.Normal; + return true; + } + else + { + throw JsonReaderException.Create(this, "Unexpected state when reading BSON reference: " + _bsonReaderState); + } + } + default: + throw JsonReaderException.Create(this, "Unexpected state when reading BSON reference: " + CurrentState); + } + } + + private bool ReadNormal() + { + switch (CurrentState) + { + case State.Start: + { + JsonToken token = (!_readRootValueAsArray) ? JsonToken.StartObject : JsonToken.StartArray; + BsonType type = (!_readRootValueAsArray) ? BsonType.Object : BsonType.Array; + + SetToken(token); + ContainerContext newContext = new ContainerContext(type); + PushContext(newContext); + newContext.Length = ReadInt32(); + return true; + } + case State.Complete: + case State.Closed: + return false; + case State.Property: + { + ReadType(_currentElementType); + return true; + } + case State.ObjectStart: + case State.ArrayStart: + case State.PostValue: + ContainerContext context = _currentContext; + if (context == null) + { + return false; + } + + int lengthMinusEnd = context.Length - 1; + + if (context.Position < lengthMinusEnd) + { + if (context.Type == BsonType.Array) + { + ReadElement(); + ReadType(_currentElementType); + return true; + } + else + { + SetToken(JsonToken.PropertyName, ReadElement()); + return true; + } + } + else if (context.Position == lengthMinusEnd) + { + if (ReadByte() != 0) + { + throw JsonReaderException.Create(this, "Unexpected end of object byte value."); + } + + PopContext(); + if (_currentContext != null) + { + MovePosition(context.Length); + } + + JsonToken endToken = (context.Type == BsonType.Object) ? JsonToken.EndObject : JsonToken.EndArray; + SetToken(endToken); + return true; + } + else + { + throw JsonReaderException.Create(this, "Read past end of current container context."); + } + case State.ConstructorStart: + break; + case State.Constructor: + break; + case State.Error: + break; + case State.Finished: + break; + default: + throw new ArgumentOutOfRangeException(); + } + + return false; + } + + private void PopContext() + { + _stack.RemoveAt(_stack.Count - 1); + if (_stack.Count == 0) + { + _currentContext = null; + } + else + { + _currentContext = _stack[_stack.Count - 1]; + } + } + + private void PushContext(ContainerContext newContext) + { + _stack.Add(newContext); + _currentContext = newContext; + } + + private byte ReadByte() + { + MovePosition(1); + return _reader.ReadByte(); + } + + private void ReadType(BsonType type) + { + switch (type) + { + case BsonType.Number: + double d = ReadDouble(); + + if (_floatParseHandling == FloatParseHandling.Decimal) + { + SetToken(JsonToken.Float, Convert.ToDecimal(d, CultureInfo.InvariantCulture)); + } + else + { + SetToken(JsonToken.Float, d); + } + break; + case BsonType.String: + case BsonType.Symbol: + SetToken(JsonToken.String, ReadLengthString()); + break; + case BsonType.Object: + { + SetToken(JsonToken.StartObject); + + ContainerContext newContext = new ContainerContext(BsonType.Object); + PushContext(newContext); + newContext.Length = ReadInt32(); + break; + } + case BsonType.Array: + { + SetToken(JsonToken.StartArray); + + ContainerContext newContext = new ContainerContext(BsonType.Array); + PushContext(newContext); + newContext.Length = ReadInt32(); + break; + } + case BsonType.Binary: + BsonBinaryType binaryType; + byte[] data = ReadBinary(out binaryType); + + object value = (binaryType != BsonBinaryType.Uuid) + ? data + : (object)new Guid(data); + + SetToken(JsonToken.Bytes, value); + break; + case BsonType.Undefined: + SetToken(JsonToken.Undefined); + break; + case BsonType.Oid: + byte[] oid = ReadBytes(12); + SetToken(JsonToken.Bytes, oid); + break; + case BsonType.Boolean: + bool b = Convert.ToBoolean(ReadByte()); + SetToken(JsonToken.Boolean, b); + break; + case BsonType.Date: + long ticks = ReadInt64(); + DateTime utcDateTime = DateTimeUtils.ConvertJavaScriptTicksToDateTime(ticks); + + DateTime dateTime; + switch (DateTimeKindHandling) + { + case DateTimeKind.Unspecified: + dateTime = DateTime.SpecifyKind(utcDateTime, DateTimeKind.Unspecified); + break; + case DateTimeKind.Local: + dateTime = utcDateTime.ToLocalTime(); + break; + default: + dateTime = utcDateTime; + break; + } + + SetToken(JsonToken.Date, dateTime); + break; + case BsonType.Null: + SetToken(JsonToken.Null); + break; + case BsonType.Regex: + string expression = ReadString(); + string modifiers = ReadString(); + + string regex = @"/" + expression + @"/" + modifiers; + SetToken(JsonToken.String, regex); + break; + case BsonType.Reference: + SetToken(JsonToken.StartObject); + _bsonReaderState = BsonReaderState.ReferenceStart; + break; + case BsonType.Code: + SetToken(JsonToken.String, ReadLengthString()); + break; + case BsonType.CodeWScope: + SetToken(JsonToken.StartObject); + _bsonReaderState = BsonReaderState.CodeWScopeStart; + break; + case BsonType.Integer: + SetToken(JsonToken.Integer, (long)ReadInt32()); + break; + case BsonType.TimeStamp: + case BsonType.Long: + SetToken(JsonToken.Integer, ReadInt64()); + break; + default: + throw new ArgumentOutOfRangeException(nameof(type), "Unexpected BsonType value: " + type); + } + } + + private byte[] ReadBinary(out BsonBinaryType binaryType) + { + int dataLength = ReadInt32(); + + binaryType = (BsonBinaryType)ReadByte(); + +#pragma warning disable 612,618 + // the old binary type has the data length repeated in the data for some reason + if (binaryType == BsonBinaryType.BinaryOld && !_jsonNet35BinaryCompatibility) + { + dataLength = ReadInt32(); + } +#pragma warning restore 612,618 + + return ReadBytes(dataLength); + } + + private string ReadString() + { + EnsureBuffers(); + + StringBuilder builder = null; + + int totalBytesRead = 0; + // used in case of left over multibyte characters in the buffer + int offset = 0; + while (true) + { + int count = offset; + byte b; + while (count < MaxCharBytesSize && (b = _reader.ReadByte()) > 0) + { + _byteBuffer[count++] = b; + } + int byteCount = count - offset; + totalBytesRead += byteCount; + + if (count < MaxCharBytesSize && builder == null) + { + // pref optimization to avoid reading into a string builder + // if string is smaller than the buffer then return it directly + int length = Encoding.UTF8.GetChars(_byteBuffer, 0, byteCount, _charBuffer, 0); + + MovePosition(totalBytesRead + 1); + return new string(_charBuffer, 0, length); + } + else + { + // calculate the index of the end of the last full character in the buffer + int lastFullCharStop = GetLastFullCharStop(count - 1); + + int charCount = Encoding.UTF8.GetChars(_byteBuffer, 0, lastFullCharStop + 1, _charBuffer, 0); + + if (builder == null) + { + builder = new StringBuilder(MaxCharBytesSize * 2); + } + + builder.Append(_charBuffer, 0, charCount); + + if (lastFullCharStop < byteCount - 1) + { + offset = byteCount - lastFullCharStop - 1; + // copy left over multi byte characters to beginning of buffer for next iteration + Array.Copy(_byteBuffer, lastFullCharStop + 1, _byteBuffer, 0, offset); + } + else + { + // reached end of string + if (count < MaxCharBytesSize) + { + MovePosition(totalBytesRead + 1); + return builder.ToString(); + } + + offset = 0; + } + } + } + } + + private string ReadLengthString() + { + int length = ReadInt32(); + + MovePosition(length); + + string s = GetString(length - 1); + _reader.ReadByte(); + + return s; + } + + private string GetString(int length) + { + if (length == 0) + { + return string.Empty; + } + + EnsureBuffers(); + + StringBuilder builder = null; + + int totalBytesRead = 0; + + // used in case of left over multibyte characters in the buffer + int offset = 0; + do + { + int count = ((length - totalBytesRead) > MaxCharBytesSize - offset) + ? MaxCharBytesSize - offset + : length - totalBytesRead; + + int byteCount = _reader.Read(_byteBuffer, offset, count); + + if (byteCount == 0) + { + throw new EndOfStreamException("Unable to read beyond the end of the stream."); + } + + totalBytesRead += byteCount; + + // Above, byteCount is how many bytes we read this time. + // Below, byteCount is how many bytes are in the _byteBuffer. + byteCount += offset; + + if (byteCount == length) + { + // pref optimization to avoid reading into a string builder + // first iteration and all bytes read then return string directly + int charCount = Encoding.UTF8.GetChars(_byteBuffer, 0, byteCount, _charBuffer, 0); + return new string(_charBuffer, 0, charCount); + } + else + { + int lastFullCharStop = GetLastFullCharStop(byteCount - 1); + + if (builder == null) + { + builder = new StringBuilder(length); + } + + int charCount = Encoding.UTF8.GetChars(_byteBuffer, 0, lastFullCharStop + 1, _charBuffer, 0); + builder.Append(_charBuffer, 0, charCount); + + if (lastFullCharStop < byteCount - 1) + { + offset = byteCount - lastFullCharStop - 1; + // copy left over multi byte characters to beginning of buffer for next iteration + Array.Copy(_byteBuffer, lastFullCharStop + 1, _byteBuffer, 0, offset); + } + else + { + offset = 0; + } + } + } while (totalBytesRead < length); + + return builder.ToString(); + } + + private int GetLastFullCharStop(int start) + { + int lookbackPos = start; + int bis = 0; + while (lookbackPos >= 0) + { + bis = BytesInSequence(_byteBuffer[lookbackPos]); + if (bis == 0) + { + lookbackPos--; + continue; + } + else if (bis == 1) + { + break; + } + else + { + lookbackPos--; + break; + } + } + if (bis == start - lookbackPos) + { + //Full character. + return start; + } + else + { + return lookbackPos; + } + } + + private int BytesInSequence(byte b) + { + if (b <= SeqRange1[1]) + { + return 1; + } + if (b >= SeqRange2[0] && b <= SeqRange2[1]) + { + return 2; + } + if (b >= SeqRange3[0] && b <= SeqRange3[1]) + { + return 3; + } + if (b >= SeqRange4[0] && b <= SeqRange4[1]) + { + return 4; + } + return 0; + } + + private void EnsureBuffers() + { + if (_byteBuffer == null) + { + _byteBuffer = new byte[MaxCharBytesSize]; + } + if (_charBuffer == null) + { + int charBufferSize = Encoding.UTF8.GetMaxCharCount(MaxCharBytesSize); + _charBuffer = new char[charBufferSize]; + } + } + + private double ReadDouble() + { + MovePosition(8); + return _reader.ReadDouble(); + } + + private int ReadInt32() + { + MovePosition(4); + return _reader.ReadInt32(); + } + + private long ReadInt64() + { + MovePosition(8); + return _reader.ReadInt64(); + } + + private BsonType ReadType() + { + MovePosition(1); + return (BsonType)_reader.ReadSByte(); + } + + private void MovePosition(int count) + { + _currentContext.Position += count; + } + + private byte[] ReadBytes(int count) + { + MovePosition(count); + return _reader.ReadBytes(count); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Bson/BsonToken.cs b/Common/00-1Json8.3/Json8.3/Bson/BsonToken.cs new file mode 100644 index 0000000..06927a4 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Bson/BsonToken.cs @@ -0,0 +1,157 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System.Collections; +using System.Collections.Generic; + +namespace Newtonsoft.Json.Bson +{ + internal abstract class BsonToken + { + public abstract BsonType Type { get; } + public BsonToken Parent { get; set; } + public int CalculatedSize { get; set; } + } + + internal class BsonObject : BsonToken, IEnumerable + { + private readonly List _children = new List(); + + public void Add(string name, BsonToken token) + { + _children.Add(new BsonProperty { Name = new BsonString(name, false), Value = token }); + token.Parent = this; + } + + public override BsonType Type + { + get { return BsonType.Object; } + } + + public IEnumerator GetEnumerator() + { + return _children.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } + + internal class BsonArray : BsonToken, IEnumerable + { + private readonly List _children = new List(); + + public void Add(BsonToken token) + { + _children.Add(token); + token.Parent = this; + } + + public override BsonType Type + { + get { return BsonType.Array; } + } + + public IEnumerator GetEnumerator() + { + return _children.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } + + internal class BsonValue : BsonToken + { + private readonly object _value; + private readonly BsonType _type; + + public BsonValue(object value, BsonType type) + { + _value = value; + _type = type; + } + + public object Value + { + get { return _value; } + } + + public override BsonType Type + { + get { return _type; } + } + } + + internal class BsonString : BsonValue + { + public int ByteCount { get; set; } + public bool IncludeLength { get; set; } + + public BsonString(object value, bool includeLength) + : base(value, BsonType.String) + { + IncludeLength = includeLength; + } + } + + internal class BsonBinary : BsonValue + { + public BsonBinaryType BinaryType { get; set; } + + public BsonBinary(byte[] value, BsonBinaryType binaryType) + : base(value, BsonType.Binary) + { + BinaryType = binaryType; + } + } + + internal class BsonRegex : BsonToken + { + public BsonString Pattern { get; set; } + public BsonString Options { get; set; } + + public BsonRegex(string pattern, string options) + { + Pattern = new BsonString(pattern, false); + Options = new BsonString(options, false); + } + + public override BsonType Type + { + get { return BsonType.Regex; } + } + } + + internal class BsonProperty + { + public BsonString Name { get; set; } + public BsonToken Value { get; set; } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Bson/BsonType.cs b/Common/00-1Json8.3/Json8.3/Bson/BsonType.cs new file mode 100644 index 0000000..e119298 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Bson/BsonType.cs @@ -0,0 +1,51 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +namespace Newtonsoft.Json.Bson +{ + internal enum BsonType : sbyte + { + Number = 1, + String = 2, + Object = 3, + Array = 4, + Binary = 5, + Undefined = 6, + Oid = 7, + Boolean = 8, + Date = 9, + Null = 10, + Regex = 11, + Reference = 12, + Code = 13, + Symbol = 14, + CodeWScope = 15, + Integer = 16, + TimeStamp = 17, + Long = 18, + MinKey = -1, + MaxKey = 127 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Bson/BsonWriter.cs b/Common/00-1Json8.3/Json8.3/Bson/BsonWriter.cs new file mode 100644 index 0000000..2c0c2ff --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Bson/BsonWriter.cs @@ -0,0 +1,531 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) +using System.Numerics; +#endif +using System.Text; +using Newtonsoft.Json.Utilities; +using Newtonsoft.Json.Linq; +using System.Globalization; + +namespace Newtonsoft.Json.Bson +{ + /// + /// Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + /// + public class BsonWriter : JsonWriter + { + private readonly BsonBinaryWriter _writer; + + private BsonToken _root; + private BsonToken _parent; + private string _propertyName; + + /// + /// Gets or sets the used when writing values to BSON. + /// When set to no conversion will occur. + /// + /// The used when writing values to BSON. + public DateTimeKind DateTimeKindHandling + { + get { return _writer.DateTimeKindHandling; } + set { _writer.DateTimeKindHandling = value; } + } + + /// + /// Initializes a new instance of the class. + /// + /// The stream. + public BsonWriter(Stream stream) + { + ValidationUtils.ArgumentNotNull(stream, nameof(stream)); + _writer = new BsonBinaryWriter(new BinaryWriter(stream)); + } + + /// + /// Initializes a new instance of the class. + /// + /// The writer. + public BsonWriter(BinaryWriter writer) + { + ValidationUtils.ArgumentNotNull(writer, nameof(writer)); + _writer = new BsonBinaryWriter(writer); + } + + /// + /// Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + /// + public override void Flush() + { + _writer.Flush(); + } + + /// + /// Writes the end. + /// + /// The token. + protected override void WriteEnd(JsonToken token) + { + base.WriteEnd(token); + RemoveParent(); + + if (Top == 0) + { + _writer.WriteToken(_root); + } + } + + /// + /// Writes out a comment /*...*/ containing the specified text. + /// + /// Text to place inside the comment. + public override void WriteComment(string text) + { + throw JsonWriterException.Create(this, "Cannot write JSON comment as BSON.", null); + } + + /// + /// Writes the start of a constructor with the given name. + /// + /// The name of the constructor. + public override void WriteStartConstructor(string name) + { + throw JsonWriterException.Create(this, "Cannot write JSON constructor as BSON.", null); + } + + /// + /// Writes raw JSON. + /// + /// The raw JSON to write. + public override void WriteRaw(string json) + { + throw JsonWriterException.Create(this, "Cannot write raw JSON as BSON.", null); + } + + /// + /// Writes raw JSON where a value is expected and updates the writer's state. + /// + /// The raw JSON to write. + public override void WriteRawValue(string json) + { + throw JsonWriterException.Create(this, "Cannot write raw JSON as BSON.", null); + } + + /// + /// Writes the beginning of a JSON array. + /// + public override void WriteStartArray() + { + base.WriteStartArray(); + + AddParent(new BsonArray()); + } + + /// + /// Writes the beginning of a JSON object. + /// + public override void WriteStartObject() + { + base.WriteStartObject(); + + AddParent(new BsonObject()); + } + + /// + /// Writes the property name of a name/value pair on a JSON object. + /// + /// The name of the property. + public override void WritePropertyName(string name) + { + base.WritePropertyName(name); + + _propertyName = name; + } + + /// + /// Closes this stream and the underlying stream. + /// + public override void Close() + { + base.Close(); + + if (CloseOutput && _writer != null) + { + _writer.Close(); + } + } + + private void AddParent(BsonToken container) + { + AddToken(container); + _parent = container; + } + + private void RemoveParent() + { + _parent = _parent.Parent; + } + + private void AddValue(object value, BsonType type) + { + AddToken(new BsonValue(value, type)); + } + + internal void AddToken(BsonToken token) + { + if (_parent != null) + { + if (_parent is BsonObject) + { + ((BsonObject)_parent).Add(_propertyName, token); + _propertyName = null; + } + else + { + ((BsonArray)_parent).Add(token); + } + } + else + { + if (token.Type != BsonType.Object && token.Type != BsonType.Array) + { + throw JsonWriterException.Create(this, "Error writing {0} value. BSON must start with an Object or Array.".FormatWith(CultureInfo.InvariantCulture, token.Type), null); + } + + _parent = token; + _root = token; + } + } + + #region WriteValue methods + /// + /// Writes a value. + /// An error will raised if the value cannot be written as a single JSON token. + /// + /// The value to write. + public override void WriteValue(object value) + { +#if !(NET20 || NET35 || PORTABLE || PORTABLE40) + if (value is BigInteger) + { + InternalWriteValue(JsonToken.Integer); + AddToken(new BsonBinary(((BigInteger)value).ToByteArray(), BsonBinaryType.Binary)); + } + else +#endif + { + base.WriteValue(value); + } + } + + /// + /// Writes a null value. + /// + public override void WriteNull() + { + base.WriteNull(); + AddValue(null, BsonType.Null); + } + + /// + /// Writes an undefined value. + /// + public override void WriteUndefined() + { + base.WriteUndefined(); + AddValue(null, BsonType.Undefined); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(string value) + { + base.WriteValue(value); + if (value == null) + { + AddValue(null, BsonType.Null); + } + else + { + AddToken(new BsonString(value, true)); + } + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(int value) + { + base.WriteValue(value); + AddValue(value, BsonType.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public override void WriteValue(uint value) + { + if (value > int.MaxValue) + { + throw JsonWriterException.Create(this, "Value is too large to fit in a signed 32 bit integer. BSON does not support unsigned values.", null); + } + + base.WriteValue(value); + AddValue(value, BsonType.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(long value) + { + base.WriteValue(value); + AddValue(value, BsonType.Long); + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public override void WriteValue(ulong value) + { + if (value > long.MaxValue) + { + throw JsonWriterException.Create(this, "Value is too large to fit in a signed 64 bit integer. BSON does not support unsigned values.", null); + } + + base.WriteValue(value); + AddValue(value, BsonType.Long); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(float value) + { + base.WriteValue(value); + AddValue(value, BsonType.Number); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(double value) + { + base.WriteValue(value); + AddValue(value, BsonType.Number); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(bool value) + { + base.WriteValue(value); + AddValue(value, BsonType.Boolean); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(short value) + { + base.WriteValue(value); + AddValue(value, BsonType.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public override void WriteValue(ushort value) + { + base.WriteValue(value); + AddValue(value, BsonType.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(char value) + { + base.WriteValue(value); + string s = null; +#if !(DOTNET || PORTABLE40 || PORTABLE) + s = value.ToString(CultureInfo.InvariantCulture); +#else + s = value.ToString(); +#endif + AddToken(new BsonString(s, true)); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(byte value) + { + base.WriteValue(value); + AddValue(value, BsonType.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public override void WriteValue(sbyte value) + { + base.WriteValue(value); + AddValue(value, BsonType.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(decimal value) + { + base.WriteValue(value); + AddValue(value, BsonType.Number); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(DateTime value) + { + base.WriteValue(value); + value = DateTimeUtils.EnsureDateTime(value, DateTimeZoneHandling); + AddValue(value, BsonType.Date); + } + +#if !NET20 + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(DateTimeOffset value) + { + base.WriteValue(value); + AddValue(value, BsonType.Date); + } +#endif + + /// + /// Writes a [] value. + /// + /// The [] value to write. + public override void WriteValue(byte[] value) + { + base.WriteValue(value); + AddToken(new BsonBinary(value, BsonBinaryType.Binary)); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(Guid value) + { + base.WriteValue(value); + AddToken(new BsonBinary(value.ToByteArray(), BsonBinaryType.Uuid)); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(TimeSpan value) + { + base.WriteValue(value); + AddToken(new BsonString(value.ToString(), true)); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(Uri value) + { + base.WriteValue(value); + AddToken(new BsonString(value.ToString(), true)); + } + #endregion + + /// + /// Writes a [] value that represents a BSON object id. + /// + /// The Object ID value to write. + public void WriteObjectId(byte[] value) + { + ValidationUtils.ArgumentNotNull(value, nameof(value)); + + if (value.Length != 12) + { + throw JsonWriterException.Create(this, "An object id must be 12 bytes", null); + } + + // hack to update the writer state + UpdateScopeWithFinishedValue(); + AutoComplete(JsonToken.Undefined); + AddValue(value, BsonType.Oid); + } + + /// + /// Writes a BSON regex. + /// + /// The regex pattern. + /// The regex options. + public void WriteRegex(string pattern, string options) + { + ValidationUtils.ArgumentNotNull(pattern, nameof(pattern)); + + // hack to update the writer state + UpdateScopeWithFinishedValue(); + AutoComplete(JsonToken.Undefined); + AddToken(new BsonRegex(pattern, options)); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Class1.cs b/Common/00-1Json8.3/Json8.3/Class1.cs new file mode 100644 index 0000000..52cef5f --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Class1.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Json8._3 +{ + public class Class1 + { + } +} diff --git a/Common/00-1Json8.3/Json8.3/ConstructorHandling.cs b/Common/00-1Json8.3/Json8.3/ConstructorHandling.cs new file mode 100644 index 0000000..e403f1e --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/ConstructorHandling.cs @@ -0,0 +1,43 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +namespace Newtonsoft.Json +{ + /// + /// Specifies how constructors are used when initializing objects during deserialization by the . + /// + public enum ConstructorHandling + { + /// + /// First attempt to use the public default constructor, then fall back to single paramatized constructor, then the non-public default constructor. + /// + Default = 0, + + /// + /// Json.NET will use a non-public default constructor before falling back to a paramatized constructor. + /// + AllowNonPublicDefaultConstructor = 1 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Converters/BinaryConverter.cs b/Common/00-1Json8.3/Json8.3/Converters/BinaryConverter.cs new file mode 100644 index 0000000..34b878b --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Converters/BinaryConverter.cs @@ -0,0 +1,201 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(DOTNET || PORTABLE40 || PORTABLE) +using System; +using System.Data.SqlTypes; +using System.Globalization; +using Newtonsoft.Json.Utilities; +using System.Collections.Generic; + +namespace Newtonsoft.Json.Converters +{ + /// + /// Converts a binary value to and from a base 64 string value. + /// + public class BinaryConverter : JsonConverter + { +#if !NET20 + private const string BinaryTypeName = "System.Data.Linq.Binary"; + private const string BinaryToArrayName = "ToArray"; + private ReflectionObject _reflectionObject; +#endif + + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The value. + /// The calling serializer. + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + if (value == null) + { + writer.WriteNull(); + return; + } + + byte[] data = GetByteArray(value); + + writer.WriteValue(data); + } + + private byte[] GetByteArray(object value) + { +#if !(NET20) + if (value.GetType().AssignableToTypeName(BinaryTypeName)) + { + EnsureReflectionObject(value.GetType()); + return (byte[])_reflectionObject.GetValue(value, BinaryToArrayName); + } +#endif + if (value is SqlBinary) + { + return ((SqlBinary)value).Value; + } + + throw new JsonSerializationException("Unexpected value type when writing binary: {0}".FormatWith(CultureInfo.InvariantCulture, value.GetType())); + } + +#if !NET20 + private void EnsureReflectionObject(Type t) + { + if (_reflectionObject == null) + { + _reflectionObject = ReflectionObject.Create(t, t.GetConstructor(new[] { typeof(byte[]) }), BinaryToArrayName); + } + } +#endif + + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing value of object being read. + /// The calling serializer. + /// The object value. + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + if (!ReflectionUtils.IsNullable(objectType)) + { + throw JsonSerializationException.Create(reader, "Cannot convert null value to {0}.".FormatWith(CultureInfo.InvariantCulture, objectType)); + } + + return null; + } + + byte[] data; + + if (reader.TokenType == JsonToken.StartArray) + { + data = ReadByteArray(reader); + } + else if (reader.TokenType == JsonToken.String) + { + // current token is already at base64 string + // unable to call ReadAsBytes so do it the old fashion way + string encodedData = reader.Value.ToString(); + data = Convert.FromBase64String(encodedData); + } + else + { + throw JsonSerializationException.Create(reader, "Unexpected token parsing binary. Expected String or StartArray, got {0}.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + } + + Type t = (ReflectionUtils.IsNullableType(objectType)) + ? Nullable.GetUnderlyingType(objectType) + : objectType; + +#if !NET20 + if (t.AssignableToTypeName(BinaryTypeName)) + { + EnsureReflectionObject(t); + + return _reflectionObject.Creator(data); + } +#endif + + if (t == typeof(SqlBinary)) + { + return new SqlBinary(data); + } + + throw JsonSerializationException.Create(reader, "Unexpected object type when writing binary: {0}".FormatWith(CultureInfo.InvariantCulture, objectType)); + } + + private byte[] ReadByteArray(JsonReader reader) + { + List byteList = new List(); + + while (reader.Read()) + { + switch (reader.TokenType) + { + case JsonToken.Integer: + byteList.Add(Convert.ToByte(reader.Value, CultureInfo.InvariantCulture)); + break; + case JsonToken.EndArray: + return byteList.ToArray(); + case JsonToken.Comment: + // skip + break; + default: + throw JsonSerializationException.Create(reader, "Unexpected token when reading bytes: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + } + } + + throw JsonSerializationException.Create(reader, "Unexpected end when reading bytes."); + } + + /// + /// Determines whether this instance can convert the specified object type. + /// + /// Type of the object. + /// + /// true if this instance can convert the specified object type; otherwise, false. + /// + public override bool CanConvert(Type objectType) + { +#if !NET20 + if (objectType.AssignableToTypeName(BinaryTypeName)) + { + return true; + } +#endif + + if (objectType == typeof(SqlBinary) || objectType == typeof(SqlBinary?)) + { + return true; + } + + return false; + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Converters/BsonObjectIdConverter.cs b/Common/00-1Json8.3/Json8.3/Converters/BsonObjectIdConverter.cs new file mode 100644 index 0000000..c0a30ba --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Converters/BsonObjectIdConverter.cs @@ -0,0 +1,91 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using Newtonsoft.Json.Bson; +using System.Globalization; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Converters +{ + /// + /// Converts a to and from JSON and BSON. + /// + public class BsonObjectIdConverter : JsonConverter + { + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The value. + /// The calling serializer. + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + BsonObjectId objectId = (BsonObjectId)value; + + BsonWriter bsonWriter = writer as BsonWriter; + if (bsonWriter != null) + { + bsonWriter.WriteObjectId(objectId.Value); + } + else + { + writer.WriteValue(objectId.Value); + } + } + + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing value of object being read. + /// The calling serializer. + /// The object value. + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType != JsonToken.Bytes) + { + throw new JsonSerializationException("Expected Bytes but got {0}.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + } + + byte[] value = (byte[])reader.Value; + + return new BsonObjectId(value); + } + + /// + /// Determines whether this instance can convert the specified object type. + /// + /// Type of the object. + /// + /// true if this instance can convert the specified object type; otherwise, false. + /// + public override bool CanConvert(Type objectType) + { + return (objectType == typeof(BsonObjectId)); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Converters/CustomCreationConverter.cs b/Common/00-1Json8.3/Json8.3/Converters/CustomCreationConverter.cs new file mode 100644 index 0000000..c373b0c --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Converters/CustomCreationConverter.cs @@ -0,0 +1,104 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Reflection; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Converters +{ + /// + /// Create a custom object + /// + /// The object type to convert. + public abstract class CustomCreationConverter : JsonConverter + { + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The value. + /// The calling serializer. + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + throw new NotSupportedException("CustomCreationConverter should only be used while deserializing."); + } + + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing value of object being read. + /// The calling serializer. + /// The object value. + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return null; + } + + T value = Create(objectType); + if (value == null) + { + throw new JsonSerializationException("No object created."); + } + + serializer.Populate(reader, value); + return value; + } + + /// + /// Creates an object which will then be populated by the serializer. + /// + /// Type of the object. + /// The created object. + public abstract T Create(Type objectType); + + /// + /// Determines whether this instance can convert the specified object type. + /// + /// Type of the object. + /// + /// true if this instance can convert the specified object type; otherwise, false. + /// + public override bool CanConvert(Type objectType) + { + return typeof(T).IsAssignableFrom(objectType); + } + + /// + /// Gets a value indicating whether this can write JSON. + /// + /// + /// true if this can write JSON; otherwise, false. + /// + public override bool CanWrite + { + get { return false; } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Converters/DataSetConverter.cs b/Common/00-1Json8.3/Json8.3/Converters/DataSetConverter.cs new file mode 100644 index 0000000..5c86e82 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Converters/DataSetConverter.cs @@ -0,0 +1,119 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(DOTNET || PORTABLE40 || PORTABLE) +using System; +using System.Data; +using Newtonsoft.Json.Serialization; + +namespace Newtonsoft.Json.Converters +{ + /// + /// Converts a to and from JSON. + /// + public class DataSetConverter : JsonConverter + { + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The value. + /// The calling serializer. + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + DataSet dataSet = (DataSet)value; + DefaultContractResolver resolver = serializer.ContractResolver as DefaultContractResolver; + + DataTableConverter converter = new DataTableConverter(); + + writer.WriteStartObject(); + + foreach (DataTable table in dataSet.Tables) + { + writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(table.TableName) : table.TableName); + + converter.WriteJson(writer, table, serializer); + } + + writer.WriteEndObject(); + } + + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing value of object being read. + /// The calling serializer. + /// The object value. + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return null; + } + + // handle typed datasets + DataSet ds = (objectType == typeof(DataSet)) + ? new DataSet() + : (DataSet)Activator.CreateInstance(objectType); + + DataTableConverter converter = new DataTableConverter(); + + reader.ReadAndAssert(); + + while (reader.TokenType == JsonToken.PropertyName) + { + DataTable dt = ds.Tables[(string)reader.Value]; + bool exists = (dt != null); + + dt = (DataTable)converter.ReadJson(reader, typeof(DataTable), dt, serializer); + + if (!exists) + { + ds.Tables.Add(dt); + } + + reader.ReadAndAssert(); + } + + return ds; + } + + /// + /// Determines whether this instance can convert the specified value type. + /// + /// Type of the value. + /// + /// true if this instance can convert the specified value type; otherwise, false. + /// + public override bool CanConvert(Type valueType) + { + return typeof(DataSet).IsAssignableFrom(valueType); + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Converters/DataTableConverter.cs b/Common/00-1Json8.3/Json8.3/Converters/DataTableConverter.cs new file mode 100644 index 0000000..b2f775a --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Converters/DataTableConverter.cs @@ -0,0 +1,244 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(DOTNET || PORTABLE40 || PORTABLE) +using System.Collections.Generic; +using System.Globalization; +using Newtonsoft.Json.Utilities; +using System; +using System.Data; +using Newtonsoft.Json.Serialization; + +namespace Newtonsoft.Json.Converters +{ + /// + /// Converts a to and from JSON. + /// + public class DataTableConverter : JsonConverter + { + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The value. + /// The calling serializer. + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + DataTable table = (DataTable)value; + DefaultContractResolver resolver = serializer.ContractResolver as DefaultContractResolver; + + writer.WriteStartArray(); + + foreach (DataRow row in table.Rows) + { + writer.WriteStartObject(); + foreach (DataColumn column in row.Table.Columns) + { + object columnValue = row[column]; + + if (serializer.NullValueHandling == NullValueHandling.Ignore && (columnValue == null || columnValue == DBNull.Value)) + { + continue; + } + + writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(column.ColumnName) : column.ColumnName); + serializer.Serialize(writer, columnValue); + } + writer.WriteEndObject(); + } + + writer.WriteEndArray(); + } + + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing value of object being read. + /// The calling serializer. + /// The object value. + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return null; + } + + DataTable dt = existingValue as DataTable; + + if (dt == null) + { + // handle typed datasets + dt = (objectType == typeof(DataTable)) + ? new DataTable() + : (DataTable)Activator.CreateInstance(objectType); + } + + // DataTable is inside a DataSet + // populate the name from the property name + if (reader.TokenType == JsonToken.PropertyName) + { + dt.TableName = (string)reader.Value; + + reader.ReadAndAssert(); + + if (reader.TokenType == JsonToken.Null) + { + return dt; + } + } + + if (reader.TokenType != JsonToken.StartArray) + { + throw JsonSerializationException.Create(reader, "Unexpected JSON token when reading DataTable. Expected StartArray, got {0}.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + } + + reader.ReadAndAssert(); + + while (reader.TokenType != JsonToken.EndArray) + { + CreateRow(reader, dt, serializer); + + reader.ReadAndAssert(); + } + + return dt; + } + + private static void CreateRow(JsonReader reader, DataTable dt, JsonSerializer serializer) + { + DataRow dr = dt.NewRow(); + reader.ReadAndAssert(); + + while (reader.TokenType == JsonToken.PropertyName) + { + string columnName = (string)reader.Value; + + reader.ReadAndAssert(); + + DataColumn column = dt.Columns[columnName]; + if (column == null) + { + Type columnType = GetColumnDataType(reader); + column = new DataColumn(columnName, columnType); + dt.Columns.Add(column); + } + + if (column.DataType == typeof(DataTable)) + { + if (reader.TokenType == JsonToken.StartArray) + { + reader.ReadAndAssert(); + } + + DataTable nestedDt = new DataTable(); + + while (reader.TokenType != JsonToken.EndArray) + { + CreateRow(reader, nestedDt, serializer); + + reader.ReadAndAssert(); + } + + dr[columnName] = nestedDt; + } + else if (column.DataType.IsArray && column.DataType != typeof(byte[])) + { + if (reader.TokenType == JsonToken.StartArray) + { + reader.ReadAndAssert(); + } + + List o = new List(); + + while (reader.TokenType != JsonToken.EndArray) + { + o.Add(reader.Value); + reader.ReadAndAssert(); + } + + Array destinationArray = Array.CreateInstance(column.DataType.GetElementType(), o.Count); + Array.Copy(o.ToArray(), destinationArray, o.Count); + + dr[columnName] = destinationArray; + } + else + { + dr[columnName] = (reader.Value != null) ? serializer.Deserialize(reader, column.DataType) : DBNull.Value; + } + + reader.ReadAndAssert(); + } + + dr.EndEdit(); + dt.Rows.Add(dr); + } + + private static Type GetColumnDataType(JsonReader reader) + { + JsonToken tokenType = reader.TokenType; + + switch (tokenType) + { + case JsonToken.Integer: + case JsonToken.Boolean: + case JsonToken.Float: + case JsonToken.String: + case JsonToken.Date: + case JsonToken.Bytes: + return reader.ValueType; + case JsonToken.Null: + case JsonToken.Undefined: + return typeof(string); + case JsonToken.StartArray: + reader.ReadAndAssert(); + if (reader.TokenType == JsonToken.StartObject) + { + return typeof(DataTable); // nested datatable + } + + Type arrayType = GetColumnDataType(reader); + return arrayType.MakeArrayType(); + default: + throw JsonSerializationException.Create(reader, "Unexpected JSON token when reading DataTable: {0}".FormatWith(CultureInfo.InvariantCulture, tokenType)); + } + } + + /// + /// Determines whether this instance can convert the specified value type. + /// + /// Type of the value. + /// + /// true if this instance can convert the specified value type; otherwise, false. + /// + public override bool CanConvert(Type valueType) + { + return typeof(DataTable).IsAssignableFrom(valueType); + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Converters/DateTimeConverterBase.cs b/Common/00-1Json8.3/Json8.3/Converters/DateTimeConverterBase.cs new file mode 100644 index 0000000..5e0ed29 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Converters/DateTimeConverterBase.cs @@ -0,0 +1,58 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json.Converters +{ + /// + /// Provides a base class for converting a to and from JSON. + /// + public abstract class DateTimeConverterBase : JsonConverter + { + /// + /// Determines whether this instance can convert the specified object type. + /// + /// Type of the object. + /// + /// true if this instance can convert the specified object type; otherwise, false. + /// + public override bool CanConvert(Type objectType) + { + if (objectType == typeof(DateTime) || objectType == typeof(DateTime?)) + { + return true; + } +#if !NET20 + if (objectType == typeof(DateTimeOffset) || objectType == typeof(DateTimeOffset?)) + { + return true; + } +#endif + + return false; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Converters/DiscriminatedUnionConverter.cs b/Common/00-1Json8.3/Json8.3/Converters/DiscriminatedUnionConverter.cs new file mode 100644 index 0000000..679a832 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Converters/DiscriminatedUnionConverter.cs @@ -0,0 +1,280 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(NET35 || NET20) +using Newtonsoft.Json.Linq; +using System; +using System.Collections; +using System.Collections.Generic; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; +#endif +using System.Reflection; +using Newtonsoft.Json.Serialization; +using System.Globalization; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Converters +{ + /// + /// Converts a F# discriminated union type to and from JSON. + /// + public class DiscriminatedUnionConverter : JsonConverter + { + #region UnionDefinition + internal class Union + { + public List Cases; + public FSharpFunction TagReader { get; set; } + } + + internal class UnionCase + { + public int Tag; + public string Name; + public PropertyInfo[] Fields; + public FSharpFunction FieldReader; + public FSharpFunction Constructor; + } + #endregion + + private const string CasePropertyName = "Case"; + private const string FieldsPropertyName = "Fields"; + + private static readonly ThreadSafeStore UnionCache = new ThreadSafeStore(CreateUnion); + private static readonly ThreadSafeStore UnionTypeLookupCache = new ThreadSafeStore(CreateUnionTypeLookup); + + private static Type CreateUnionTypeLookup(Type t) + { + // this lookup is because cases with fields are derived from union type + // need to get declaring type to avoid duplicate Unions in cache + + // hacky but I can't find an API to get the declaring type without GetUnionCases + object[] cases = (object[])FSharpUtils.GetUnionCases(null, t, null); + + object caseInfo = cases.First(); + + Type unionType = (Type)FSharpUtils.GetUnionCaseInfoDeclaringType(caseInfo); + return unionType; + } + + private static Union CreateUnion(Type t) + { + Union u = new Union(); + + u.TagReader = (FSharpFunction)FSharpUtils.PreComputeUnionTagReader(null, t, null); + u.Cases = new List(); + + object[] cases = (object[])FSharpUtils.GetUnionCases(null, t, null); + + foreach (object unionCaseInfo in cases) + { + UnionCase unionCase = new UnionCase(); + unionCase.Tag = (int)FSharpUtils.GetUnionCaseInfoTag(unionCaseInfo); + unionCase.Name = (string)FSharpUtils.GetUnionCaseInfoName(unionCaseInfo); + unionCase.Fields = (PropertyInfo[])FSharpUtils.GetUnionCaseInfoFields(unionCaseInfo); + unionCase.FieldReader = (FSharpFunction)FSharpUtils.PreComputeUnionReader(null, unionCaseInfo, null); + unionCase.Constructor = (FSharpFunction)FSharpUtils.PreComputeUnionConstructor(null, unionCaseInfo, null); + + u.Cases.Add(unionCase); + } + + return u; + } + + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The value. + /// The calling serializer. + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + DefaultContractResolver resolver = serializer.ContractResolver as DefaultContractResolver; + + Type unionType = UnionTypeLookupCache.Get(value.GetType()); + Union union = UnionCache.Get(unionType); + + int tag = (int)union.TagReader.Invoke(value); + UnionCase caseInfo = union.Cases.Single(c => c.Tag == tag); + + writer.WriteStartObject(); + writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(CasePropertyName) : CasePropertyName); + writer.WriteValue(caseInfo.Name); + if (caseInfo.Fields != null && caseInfo.Fields.Length > 0) + { + object[] fields = (object[])caseInfo.FieldReader.Invoke(value); + + writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(FieldsPropertyName) : FieldsPropertyName); + writer.WriteStartArray(); + foreach (object field in fields) + { + serializer.Serialize(writer, field); + } + writer.WriteEndArray(); + } + writer.WriteEndObject(); + } + + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing value of object being read. + /// The calling serializer. + /// The object value. + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return null; + } + + UnionCase caseInfo = null; + string caseName = null; + JArray fields = null; + + // start object + reader.ReadAndAssert(); + + while (reader.TokenType == JsonToken.PropertyName) + { + string propertyName = reader.Value.ToString(); + if (string.Equals(propertyName, CasePropertyName, StringComparison.OrdinalIgnoreCase)) + { + reader.ReadAndAssert(); + + Union union = UnionCache.Get(objectType); + + caseName = reader.Value.ToString(); + + caseInfo = union.Cases.SingleOrDefault(c => c.Name == caseName); + + if (caseInfo == null) + { + throw JsonSerializationException.Create(reader, "No union type found with the name '{0}'.".FormatWith(CultureInfo.InvariantCulture, caseName)); + } + } + else if (string.Equals(propertyName, FieldsPropertyName, StringComparison.OrdinalIgnoreCase)) + { + reader.ReadAndAssert(); + if (reader.TokenType != JsonToken.StartArray) + { + throw JsonSerializationException.Create(reader, "Union fields must been an array."); + } + + fields = (JArray)JToken.ReadFrom(reader); + } + else + { + throw JsonSerializationException.Create(reader, "Unexpected property '{0}' found when reading union.".FormatWith(CultureInfo.InvariantCulture, propertyName)); + } + + reader.ReadAndAssert(); + } + + if (caseInfo == null) + { + throw JsonSerializationException.Create(reader, "No '{0}' property with union name found.".FormatWith(CultureInfo.InvariantCulture, CasePropertyName)); + } + + object[] typedFieldValues = new object[caseInfo.Fields.Length]; + + if (caseInfo.Fields.Length > 0 && fields == null) + { + throw JsonSerializationException.Create(reader, "No '{0}' property with union fields found.".FormatWith(CultureInfo.InvariantCulture, FieldsPropertyName)); + } + + if (fields != null) + { + if (caseInfo.Fields.Length != fields.Count) + { + throw JsonSerializationException.Create(reader, "The number of field values does not match the number of properties defined by union '{0}'.".FormatWith(CultureInfo.InvariantCulture, caseName)); + } + + for (int i = 0; i < fields.Count; i++) + { + JToken t = fields[i]; + PropertyInfo fieldProperty = caseInfo.Fields[i]; + + typedFieldValues[i] = t.ToObject(fieldProperty.PropertyType, serializer); + } + } + + object[] args = { typedFieldValues }; + + return caseInfo.Constructor.Invoke(args); + } + + /// + /// Determines whether this instance can convert the specified object type. + /// + /// Type of the object. + /// + /// true if this instance can convert the specified object type; otherwise, false. + /// + public override bool CanConvert(Type objectType) + { + if (typeof(IEnumerable).IsAssignableFrom(objectType)) + { + return false; + } + + // all fsharp objects have CompilationMappingAttribute + // get the fsharp assembly from the attribute and initialize latebound methods + object[] attributes; +#if !(DOTNET || PORTABLE) + attributes = objectType.GetCustomAttributes(true); +#else + attributes = objectType.GetTypeInfo().GetCustomAttributes(true).ToArray(); +#endif + + bool isFSharpType = false; + foreach (object attribute in attributes) + { + Type attributeType = attribute.GetType(); + if (attributeType.FullName == "Microsoft.FSharp.Core.CompilationMappingAttribute") + { + FSharpUtils.EnsureInitialized(attributeType.Assembly()); + + isFSharpType = true; + break; + } + } + + if (!isFSharpType) + { + return false; + } + + return (bool)FSharpUtils.IsUnion(null, objectType, null); + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Converters/EntityKeyMemberConverter.cs b/Common/00-1Json8.3/Json8.3/Converters/EntityKeyMemberConverter.cs new file mode 100644 index 0000000..87250d8 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Converters/EntityKeyMemberConverter.cs @@ -0,0 +1,157 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(NET20 || DOTNET || PORTABLE40 || PORTABLE) +using System; +using Newtonsoft.Json.Serialization; +using System.Globalization; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Converters +{ + /// + /// Converts an Entity Framework EntityKey to and from JSON. + /// + public class EntityKeyMemberConverter : JsonConverter + { + private const string EntityKeyMemberFullTypeName = "System.Data.EntityKeyMember"; + + private const string KeyPropertyName = "Key"; + private const string TypePropertyName = "Type"; + private const string ValuePropertyName = "Value"; + + private static ReflectionObject _reflectionObject; + + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The value. + /// The calling serializer. + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + EnsureReflectionObject(value.GetType()); + + DefaultContractResolver resolver = serializer.ContractResolver as DefaultContractResolver; + + string keyName = (string)_reflectionObject.GetValue(value, KeyPropertyName); + object keyValue = _reflectionObject.GetValue(value, ValuePropertyName); + + Type keyValueType = (keyValue != null) ? keyValue.GetType() : null; + + writer.WriteStartObject(); + writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(KeyPropertyName) : KeyPropertyName); + writer.WriteValue(keyName); + writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(TypePropertyName) : TypePropertyName); + writer.WriteValue((keyValueType != null) ? keyValueType.FullName : null); + + writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(ValuePropertyName) : ValuePropertyName); + + if (keyValueType != null) + { + string valueJson; + if (JsonSerializerInternalWriter.TryConvertToString(keyValue, keyValueType, out valueJson)) + { + writer.WriteValue(valueJson); + } + else + { + writer.WriteValue(keyValue); + } + } + else + { + writer.WriteNull(); + } + + writer.WriteEndObject(); + } + + private static void ReadAndAssertProperty(JsonReader reader, string propertyName) + { + reader.ReadAndAssert(); + + if (reader.TokenType != JsonToken.PropertyName || !string.Equals(reader.Value.ToString(), propertyName, StringComparison.OrdinalIgnoreCase)) + { + throw new JsonSerializationException("Expected JSON property '{0}'.".FormatWith(CultureInfo.InvariantCulture, propertyName)); + } + } + + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing value of object being read. + /// The calling serializer. + /// The object value. + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + EnsureReflectionObject(objectType); + + object entityKeyMember = _reflectionObject.Creator(); + + ReadAndAssertProperty(reader, KeyPropertyName); + reader.ReadAndAssert(); + _reflectionObject.SetValue(entityKeyMember, KeyPropertyName, reader.Value.ToString()); + + ReadAndAssertProperty(reader, TypePropertyName); + reader.ReadAndAssert(); + string type = reader.Value.ToString(); + + Type t = Type.GetType(type); + + ReadAndAssertProperty(reader, ValuePropertyName); + reader.ReadAndAssert(); + _reflectionObject.SetValue(entityKeyMember, ValuePropertyName, serializer.Deserialize(reader, t)); + + reader.ReadAndAssert(); + + return entityKeyMember; + } + + private static void EnsureReflectionObject(Type objectType) + { + if (_reflectionObject == null) + { + _reflectionObject = ReflectionObject.Create(objectType, KeyPropertyName, ValuePropertyName); + } + } + + /// + /// Determines whether this instance can convert the specified object type. + /// + /// Type of the object. + /// + /// true if this instance can convert the specified object type; otherwise, false. + /// + public override bool CanConvert(Type objectType) + { + return objectType.AssignableToTypeName(EntityKeyMemberFullTypeName); + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Converters/ExpandoObjectConverter.cs b/Common/00-1Json8.3/Json8.3/Converters/ExpandoObjectConverter.cs new file mode 100644 index 0000000..4ca6a61 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Converters/ExpandoObjectConverter.cs @@ -0,0 +1,168 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(NET35 || NET20 || PORTABLE40) + +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Globalization; +using System.Linq; +using System.Text; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Converters +{ + /// + /// Converts an ExpandoObject to and from JSON. + /// + public class ExpandoObjectConverter : JsonConverter + { + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The value. + /// The calling serializer. + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + // can write is set to false + } + + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing value of object being read. + /// The calling serializer. + /// The object value. + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + return ReadValue(reader); + } + + private object ReadValue(JsonReader reader) + { + if (!reader.MoveToContent()) + { + throw JsonSerializationException.Create(reader, "Unexpected end when reading ExpandoObject."); + } + + switch (reader.TokenType) + { + case JsonToken.StartObject: + return ReadObject(reader); + case JsonToken.StartArray: + return ReadList(reader); + default: + if (JsonTokenUtils.IsPrimitiveToken(reader.TokenType)) + { + return reader.Value; + } + + throw JsonSerializationException.Create(reader, "Unexpected token when converting ExpandoObject: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + } + } + + private object ReadList(JsonReader reader) + { + IList list = new List(); + + while (reader.Read()) + { + switch (reader.TokenType) + { + case JsonToken.Comment: + break; + default: + object v = ReadValue(reader); + + list.Add(v); + break; + case JsonToken.EndArray: + return list; + } + } + + throw JsonSerializationException.Create(reader, "Unexpected end when reading ExpandoObject."); + } + + private object ReadObject(JsonReader reader) + { + IDictionary expandoObject = new ExpandoObject(); + + while (reader.Read()) + { + switch (reader.TokenType) + { + case JsonToken.PropertyName: + string propertyName = reader.Value.ToString(); + + if (!reader.Read()) + { + throw JsonSerializationException.Create(reader, "Unexpected end when reading ExpandoObject."); + } + + object v = ReadValue(reader); + + expandoObject[propertyName] = v; + break; + case JsonToken.Comment: + break; + case JsonToken.EndObject: + return expandoObject; + } + } + + throw JsonSerializationException.Create(reader, "Unexpected end when reading ExpandoObject."); + } + + /// + /// Determines whether this instance can convert the specified object type. + /// + /// Type of the object. + /// + /// true if this instance can convert the specified object type; otherwise, false. + /// + public override bool CanConvert(Type objectType) + { + return (objectType == typeof(ExpandoObject)); + } + + /// + /// Gets a value indicating whether this can write JSON. + /// + /// + /// true if this can write JSON; otherwise, false. + /// + public override bool CanWrite + { + get { return false; } + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Converters/IsoDateTimeConverter.cs b/Common/00-1Json8.3/Json8.3/Converters/IsoDateTimeConverter.cs new file mode 100644 index 0000000..9d2f822 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Converters/IsoDateTimeConverter.cs @@ -0,0 +1,197 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Globalization; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Converters +{ + /// + /// Converts a to and from the ISO 8601 date format (e.g. 2008-04-12T12:53Z). + /// + public class IsoDateTimeConverter : DateTimeConverterBase + { + private const string DefaultDateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; + + private DateTimeStyles _dateTimeStyles = DateTimeStyles.RoundtripKind; + private string _dateTimeFormat; + private CultureInfo _culture; + + /// + /// Gets or sets the date time styles used when converting a date to and from JSON. + /// + /// The date time styles used when converting a date to and from JSON. + public DateTimeStyles DateTimeStyles + { + get { return _dateTimeStyles; } + set { _dateTimeStyles = value; } + } + + /// + /// Gets or sets the date time format used when converting a date to and from JSON. + /// + /// The date time format used when converting a date to and from JSON. + public string DateTimeFormat + { + get { return _dateTimeFormat ?? string.Empty; } + set { _dateTimeFormat = StringUtils.NullEmptyString(value); } + } + + /// + /// Gets or sets the culture used when converting a date to and from JSON. + /// + /// The culture used when converting a date to and from JSON. + public CultureInfo Culture + { + get { return _culture ?? CultureInfo.CurrentCulture; } + set { _culture = value; } + } + + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The value. + /// The calling serializer. + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + string text; + + if (value is DateTime) + { + DateTime dateTime = (DateTime)value; + + if ((_dateTimeStyles & DateTimeStyles.AdjustToUniversal) == DateTimeStyles.AdjustToUniversal + || (_dateTimeStyles & DateTimeStyles.AssumeUniversal) == DateTimeStyles.AssumeUniversal) + { + dateTime = dateTime.ToUniversalTime(); + } + + text = dateTime.ToString(_dateTimeFormat ?? DefaultDateTimeFormat, Culture); + } +#if !NET20 + else if (value is DateTimeOffset) + { + DateTimeOffset dateTimeOffset = (DateTimeOffset)value; + if ((_dateTimeStyles & DateTimeStyles.AdjustToUniversal) == DateTimeStyles.AdjustToUniversal + || (_dateTimeStyles & DateTimeStyles.AssumeUniversal) == DateTimeStyles.AssumeUniversal) + { + dateTimeOffset = dateTimeOffset.ToUniversalTime(); + } + + text = dateTimeOffset.ToString(_dateTimeFormat ?? DefaultDateTimeFormat, Culture); + } +#endif + else + { + throw new JsonSerializationException("Unexpected value when converting date. Expected DateTime or DateTimeOffset, got {0}.".FormatWith(CultureInfo.InvariantCulture, ReflectionUtils.GetObjectType(value))); + } + + writer.WriteValue(text); + } + + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing value of object being read. + /// The calling serializer. + /// The object value. + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + bool nullable = ReflectionUtils.IsNullableType(objectType); +#if !NET20 + Type t = (nullable) + ? Nullable.GetUnderlyingType(objectType) + : objectType; +#endif + + if (reader.TokenType == JsonToken.Null) + { + if (!ReflectionUtils.IsNullableType(objectType)) + { + throw JsonSerializationException.Create(reader, "Cannot convert null value to {0}.".FormatWith(CultureInfo.InvariantCulture, objectType)); + } + + return null; + } + + if (reader.TokenType == JsonToken.Date) + { +#if !NET20 + if (t == typeof(DateTimeOffset)) + { + return (reader.Value is DateTimeOffset) ? reader.Value : new DateTimeOffset((DateTime)reader.Value); + } + + // converter is expected to return a DateTime + if (reader.Value is DateTimeOffset) + { + return ((DateTimeOffset)reader.Value).DateTime; + } +#endif + + return reader.Value; + } + + if (reader.TokenType != JsonToken.String) + { + throw JsonSerializationException.Create(reader, "Unexpected token parsing date. Expected String, got {0}.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + } + + string dateText = reader.Value.ToString(); + + if (string.IsNullOrEmpty(dateText) && nullable) + { + return null; + } + +#if !NET20 + if (t == typeof(DateTimeOffset)) + { + if (!string.IsNullOrEmpty(_dateTimeFormat)) + { + return DateTimeOffset.ParseExact(dateText, _dateTimeFormat, Culture, _dateTimeStyles); + } + else + { + return DateTimeOffset.Parse(dateText, Culture, _dateTimeStyles); + } + } +#endif + + if (!string.IsNullOrEmpty(_dateTimeFormat)) + { + return DateTime.ParseExact(dateText, _dateTimeFormat, Culture, _dateTimeStyles); + } + else + { + return DateTime.Parse(dateText, Culture, _dateTimeStyles); + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Converters/JavaScriptDateTimeConverter.cs b/Common/00-1Json8.3/Json8.3/Converters/JavaScriptDateTimeConverter.cs new file mode 100644 index 0000000..0f0e7ff --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Converters/JavaScriptDateTimeConverter.cs @@ -0,0 +1,127 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Globalization; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Converters +{ + /// + /// Converts a to and from a JavaScript date constructor (e.g. new Date(52231943)). + /// + public class JavaScriptDateTimeConverter : DateTimeConverterBase + { + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The value. + /// The calling serializer. + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + long ticks; + + if (value is DateTime) + { + DateTime dateTime = (DateTime)value; + DateTime utcDateTime = dateTime.ToUniversalTime(); + ticks = DateTimeUtils.ConvertDateTimeToJavaScriptTicks(utcDateTime); + } +#if !NET20 + else if (value is DateTimeOffset) + { + DateTimeOffset dateTimeOffset = (DateTimeOffset)value; + DateTimeOffset utcDateTimeOffset = dateTimeOffset.ToUniversalTime(); + ticks = DateTimeUtils.ConvertDateTimeToJavaScriptTicks(utcDateTimeOffset.UtcDateTime); + } +#endif + else + { + throw new JsonSerializationException("Expected date object value."); + } + + writer.WriteStartConstructor("Date"); + writer.WriteValue(ticks); + writer.WriteEndConstructor(); + } + + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing property value of the JSON that is being converted. + /// The calling serializer. + /// The object value. + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + if (!ReflectionUtils.IsNullable(objectType)) + { + throw JsonSerializationException.Create(reader, "Cannot convert null value to {0}.".FormatWith(CultureInfo.InvariantCulture, objectType)); + } + + return null; + } + + if (reader.TokenType != JsonToken.StartConstructor || !string.Equals(reader.Value.ToString(), "Date", StringComparison.Ordinal)) + { + throw JsonSerializationException.Create(reader, "Unexpected token or value when parsing date. Token: {0}, Value: {1}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType, reader.Value)); + } + + reader.Read(); + + if (reader.TokenType != JsonToken.Integer) + { + throw JsonSerializationException.Create(reader, "Unexpected token parsing date. Expected Integer, got {0}.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + } + + long ticks = (long)reader.Value; + + DateTime d = DateTimeUtils.ConvertJavaScriptTicksToDateTime(ticks); + + reader.Read(); + + if (reader.TokenType != JsonToken.EndConstructor) + { + throw JsonSerializationException.Create(reader, "Unexpected token parsing date. Expected EndConstructor, got {0}.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + } + +#if !NET20 + Type t = (ReflectionUtils.IsNullableType(objectType)) + ? Nullable.GetUnderlyingType(objectType) + : objectType; + if (t == typeof(DateTimeOffset)) + { + return new DateTimeOffset(d); + } +#endif + + return d; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Converters/JsonValueConverter.cs b/Common/00-1Json8.3/Json8.3/Converters/JsonValueConverter.cs new file mode 100644 index 0000000..25f979f --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Converters/JsonValueConverter.cs @@ -0,0 +1,225 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + + +#if NETFX_CORE +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Security; +using Newtonsoft.Json.Utilities; +using Windows.Data.Json; + +namespace Newtonsoft.Json.Converters +{ + /// + /// Converts a to and from JSON. + /// + public class JsonValueConverter : JsonConverter + { + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The value. + /// The calling serializer. + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + WriteJsonValue(writer, (IJsonValue)value); + } + + private void WriteJsonValue(JsonWriter writer, IJsonValue value) + { + switch (value.ValueType) + { + case JsonValueType.Array: + { + JsonArray a = value.GetArray(); + writer.WriteStartArray(); + for (int i = 0; i < a.Count; i++) + { + WriteJsonValue(writer, a[i]); + } + writer.WriteEndArray(); + } + break; + case JsonValueType.Boolean: + { + writer.WriteValue(value.GetBoolean()); + } + break; + case JsonValueType.Null: + { + writer.WriteNull(); + } + break; + case JsonValueType.Number: + { + // JsonValue doesn't support integers + // serialize whole numbers without a decimal point + double d = value.GetNumber(); + bool isInteger = (d % 1 == 0); + if (isInteger && d <= long.MaxValue && d >= long.MinValue) + writer.WriteValue(Convert.ToInt64(d)); + else + writer.WriteValue(d); + } + break; + case JsonValueType.Object: + { + JsonObject o = value.GetObject(); + writer.WriteStartObject(); + foreach (KeyValuePair v in o) + { + writer.WritePropertyName(v.Key); + WriteJsonValue(writer, v.Value); + } + writer.WriteEndObject(); + } + break; + case JsonValueType.String: + { + writer.WriteValue(value.GetString()); + } + break; + default: + throw new ArgumentOutOfRangeException("ValueType"); + } + } + + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing value of object being read. + /// The calling serializer. + /// The object value. + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.None) + reader.Read(); + + IJsonValue value = CreateJsonValue(reader); + + if (!objectType.IsAssignableFrom(value.GetType())) + throw JsonSerializationException.Create(reader, "Could not convert '{0}' to '{1}'.".FormatWith(CultureInfo.InvariantCulture, value.GetType(), objectType)); + + return value; + } + + private IJsonValue CreateJsonValue(JsonReader reader) + { + while (reader.TokenType == JsonToken.Comment) + { + if (!reader.Read()) + throw JsonSerializationException.Create(reader, "Unexpected end."); + } + + switch (reader.TokenType) + { + case JsonToken.StartObject: + { + return CreateJsonObject(reader); + } + case JsonToken.StartArray: + { + JsonArray a = new JsonArray(); + + while (reader.Read()) + { + switch (reader.TokenType) + { + case JsonToken.EndArray: + return a; + default: + IJsonValue value = CreateJsonValue(reader); + a.Add(value); + break; + } + } + } + break; + case JsonToken.Integer: + case JsonToken.Float: + return JsonValue.CreateNumberValue(Convert.ToDouble(reader.Value, CultureInfo.InvariantCulture)); + case JsonToken.String: + return JsonValue.CreateStringValue(reader.Value.ToString()); + case JsonToken.Boolean: + return JsonValue.CreateBooleanValue(Convert.ToBoolean(reader.Value, CultureInfo.InvariantCulture)); + case JsonToken.Null: + // surely there is a better way to create a null value than this? + return JsonValue.Parse("null"); + case JsonToken.Date: + return JsonValue.CreateStringValue(reader.Value.ToString()); + case JsonToken.Bytes: + return JsonValue.CreateStringValue(reader.Value.ToString()); + default: + throw JsonSerializationException.Create(reader, "Unexpected or unsupported token: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + } + + throw JsonSerializationException.Create(reader, "Unexpected end."); + } + + private JsonObject CreateJsonObject(JsonReader reader) + { + JsonObject o = new JsonObject(); + string propertyName = null; + + while (reader.Read()) + { + switch (reader.TokenType) + { + case JsonToken.PropertyName: + propertyName = (string)reader.Value; + break; + case JsonToken.EndObject: + return o; + case JsonToken.Comment: + break; + default: + IJsonValue propertyValue = CreateJsonValue(reader); + o.Add(propertyName, propertyValue); + break; + } + } + + throw JsonSerializationException.Create(reader, "Unexpected end."); + } + + /// + /// Determines whether this instance can convert the specified object type. + /// + /// Type of the object. + /// + /// true if this instance can convert the specified object type; otherwise, false. + /// + public override bool CanConvert(Type objectType) + { + return typeof(IJsonValue).IsAssignableFrom(objectType); + } + } +} +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Converters/KeyValuePairConverter.cs b/Common/00-1Json8.3/Json8.3/Converters/KeyValuePairConverter.cs new file mode 100644 index 0000000..71f5fbb --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Converters/KeyValuePairConverter.cs @@ -0,0 +1,149 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using Newtonsoft.Json.Serialization; +using Newtonsoft.Json.Utilities; +using System.Reflection; + +namespace Newtonsoft.Json.Converters +{ + /// + /// Converts a to and from JSON. + /// + public class KeyValuePairConverter : JsonConverter + { + private const string KeyName = "Key"; + private const string ValueName = "Value"; + + private static readonly ThreadSafeStore ReflectionObjectPerType = new ThreadSafeStore(InitializeReflectionObject); + + private static ReflectionObject InitializeReflectionObject(Type t) + { + IList genericArguments = t.GetGenericArguments(); + Type keyType = genericArguments[0]; + Type valueType = genericArguments[1]; + + return ReflectionObject.Create(t, t.GetConstructor(new[] { keyType, valueType }), KeyName, ValueName); + } + + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The value. + /// The calling serializer. + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + ReflectionObject reflectionObject = ReflectionObjectPerType.Get(value.GetType()); + + DefaultContractResolver resolver = serializer.ContractResolver as DefaultContractResolver; + + writer.WriteStartObject(); + writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(KeyName) : KeyName); + serializer.Serialize(writer, reflectionObject.GetValue(value, KeyName), reflectionObject.GetType(KeyName)); + writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(ValueName) : ValueName); + serializer.Serialize(writer, reflectionObject.GetValue(value, ValueName), reflectionObject.GetType(ValueName)); + writer.WriteEndObject(); + } + + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing value of object being read. + /// The calling serializer. + /// The object value. + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + if (!ReflectionUtils.IsNullableType(objectType)) + { + throw JsonSerializationException.Create(reader, "Cannot convert null value to KeyValuePair."); + } + + return null; + } + + object key = null; + object value = null; + + reader.ReadAndAssert(); + + Type t = ReflectionUtils.IsNullableType(objectType) + ? Nullable.GetUnderlyingType(objectType) + : objectType; + + ReflectionObject reflectionObject = ReflectionObjectPerType.Get(t); + + while (reader.TokenType == JsonToken.PropertyName) + { + string propertyName = reader.Value.ToString(); + if (string.Equals(propertyName, KeyName, StringComparison.OrdinalIgnoreCase)) + { + reader.ReadAndAssert(); + key = serializer.Deserialize(reader, reflectionObject.GetType(KeyName)); + } + else if (string.Equals(propertyName, ValueName, StringComparison.OrdinalIgnoreCase)) + { + reader.ReadAndAssert(); + value = serializer.Deserialize(reader, reflectionObject.GetType(ValueName)); + } + else + { + reader.Skip(); + } + + reader.ReadAndAssert(); + } + + return reflectionObject.Creator(key, value); + } + + /// + /// Determines whether this instance can convert the specified object type. + /// + /// Type of the object. + /// + /// true if this instance can convert the specified object type; otherwise, false. + /// + public override bool CanConvert(Type objectType) + { + Type t = (ReflectionUtils.IsNullableType(objectType)) + ? Nullable.GetUnderlyingType(objectType) + : objectType; + + if (t.IsValueType() && t.IsGenericType()) + { + return (t.GetGenericTypeDefinition() == typeof(KeyValuePair<,>)); + } + + return false; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Converters/RegexConverter.cs b/Common/00-1Json8.3/Json8.3/Converters/RegexConverter.cs new file mode 100644 index 0000000..1d6de62 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Converters/RegexConverter.cs @@ -0,0 +1,227 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Text.RegularExpressions; +using Newtonsoft.Json.Bson; +using System.Globalization; +using Newtonsoft.Json.Serialization; + +namespace Newtonsoft.Json.Converters +{ + /// + /// Converts a to and from JSON and BSON. + /// + public class RegexConverter : JsonConverter + { + private const string PatternName = "Pattern"; + private const string OptionsName = "Options"; + + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The value. + /// The calling serializer. + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + Regex regex = (Regex)value; + + BsonWriter bsonWriter = writer as BsonWriter; + if (bsonWriter != null) + { + WriteBson(bsonWriter, regex); + } + else + { + WriteJson(writer, regex, serializer); + } + } + + private bool HasFlag(RegexOptions options, RegexOptions flag) + { + return ((options & flag) == flag); + } + + private void WriteBson(BsonWriter writer, Regex regex) + { + // Regular expression - The first cstring is the regex pattern, the second + // is the regex options string. Options are identified by characters, which + // must be stored in alphabetical order. Valid options are 'i' for case + // insensitive matching, 'm' for multiline matching, 'x' for verbose mode, + // 'l' to make \w, \W, etc. locale dependent, 's' for dotall mode + // ('.' matches everything), and 'u' to make \w, \W, etc. match unicode. + + string options = null; + + if (HasFlag(regex.Options, RegexOptions.IgnoreCase)) + { + options += "i"; + } + + if (HasFlag(regex.Options, RegexOptions.Multiline)) + { + options += "m"; + } + + if (HasFlag(regex.Options, RegexOptions.Singleline)) + { + options += "s"; + } + + options += "u"; + + if (HasFlag(regex.Options, RegexOptions.ExplicitCapture)) + { + options += "x"; + } + + writer.WriteRegex(regex.ToString(), options); + } + + private void WriteJson(JsonWriter writer, Regex regex, JsonSerializer serializer) + { + DefaultContractResolver resolver = serializer.ContractResolver as DefaultContractResolver; + + writer.WriteStartObject(); + writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(PatternName) : PatternName); + writer.WriteValue(regex.ToString()); + writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(OptionsName) : OptionsName); + serializer.Serialize(writer, regex.Options); + writer.WriteEndObject(); + } + + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing value of object being read. + /// The calling serializer. + /// The object value. + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.StartObject) + { + return ReadRegexObject(reader, serializer); + } + + if (reader.TokenType == JsonToken.String) + { + return ReadRegexString(reader); + } + + throw JsonSerializationException.Create(reader, "Unexpected token when reading Regex."); + } + + private object ReadRegexString(JsonReader reader) + { + string regexText = (string)reader.Value; + int patternOptionDelimiterIndex = regexText.LastIndexOf('/'); + + string patternText = regexText.Substring(1, patternOptionDelimiterIndex - 1); + string optionsText = regexText.Substring(patternOptionDelimiterIndex + 1); + + RegexOptions options = RegexOptions.None; + foreach (char c in optionsText) + { + switch (c) + { + case 'i': + options |= RegexOptions.IgnoreCase; + break; + case 'm': + options |= RegexOptions.Multiline; + break; + case 's': + options |= RegexOptions.Singleline; + break; + case 'x': + options |= RegexOptions.ExplicitCapture; + break; + } + } + + return new Regex(patternText, options); + } + + private Regex ReadRegexObject(JsonReader reader, JsonSerializer serializer) + { + string pattern = null; + RegexOptions? options = null; + + while (reader.Read()) + { + switch (reader.TokenType) + { + case JsonToken.PropertyName: + string propertyName = reader.Value.ToString(); + + if (!reader.Read()) + { + throw JsonSerializationException.Create(reader, "Unexpected end when reading Regex."); + } + + if (string.Equals(propertyName, PatternName, StringComparison.OrdinalIgnoreCase)) + { + pattern = (string)reader.Value; + } + else if (string.Equals(propertyName, OptionsName, StringComparison.OrdinalIgnoreCase)) + { + options = serializer.Deserialize(reader); + } + else + { + reader.Skip(); + } + break; + case JsonToken.Comment: + break; + case JsonToken.EndObject: + if (pattern == null) + { + throw JsonSerializationException.Create(reader, "Error deserializing Regex. No pattern found."); + } + + return new Regex(pattern, options ?? RegexOptions.None); + } + } + + throw JsonSerializationException.Create(reader, "Unexpected end when reading Regex."); + } + + /// + /// Determines whether this instance can convert the specified object type. + /// + /// Type of the object. + /// + /// true if this instance can convert the specified object type; otherwise, false. + /// + public override bool CanConvert(Type objectType) + { + return (objectType == typeof(Regex)); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Converters/StringEnumConverter.cs b/Common/00-1Json8.3/Json8.3/Converters/StringEnumConverter.cs new file mode 100644 index 0000000..cb97ea9 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Converters/StringEnumConverter.cs @@ -0,0 +1,175 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Reflection; +using System.Runtime.Serialization; +using Newtonsoft.Json.Utilities; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Converters +{ + /// + /// Converts an to and from its name string value. + /// + public class StringEnumConverter : JsonConverter + { + /// + /// Gets or sets a value indicating whether the written enum text should be camel case. + /// + /// true if the written enum text will be camel case; otherwise, false. + public bool CamelCaseText { get; set; } + + /// + /// Gets or sets a value indicating whether integer values are allowed. + /// + /// true if integers are allowed; otherwise, false. + public bool AllowIntegerValues { get; set; } + + /// + /// Initializes a new instance of the class. + /// + public StringEnumConverter() + { + AllowIntegerValues = true; + } + + /// + /// Initializes a new instance of the class. + /// + /// true if the written enum text will be camel case; otherwise, false. + public StringEnumConverter(bool camelCaseText) + : this() + { + CamelCaseText = camelCaseText; + } + + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The value. + /// The calling serializer. + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + if (value == null) + { + writer.WriteNull(); + return; + } + + Enum e = (Enum)value; + + string enumName = e.ToString("G"); + + if (char.IsNumber(enumName[0]) || enumName[0] == '-') + { + // enum value has no name so write number + writer.WriteValue(value); + } + else + { + Type enumType = e.GetType(); + + string finalName = EnumUtils.ToEnumName(enumType, enumName, CamelCaseText); + + writer.WriteValue(finalName); + } + } + + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing value of object being read. + /// The calling serializer. + /// The object value. + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + if (!ReflectionUtils.IsNullableType(objectType)) + { + throw JsonSerializationException.Create(reader, "Cannot convert null value to {0}.".FormatWith(CultureInfo.InvariantCulture, objectType)); + } + + return null; + } + + bool isNullable = ReflectionUtils.IsNullableType(objectType); + Type t = isNullable ? Nullable.GetUnderlyingType(objectType) : objectType; + + try + { + if (reader.TokenType == JsonToken.String) + { + string enumText = reader.Value.ToString(); + return EnumUtils.ParseEnumName(enumText, isNullable, t); + } + + if (reader.TokenType == JsonToken.Integer) + { + if (!AllowIntegerValues) + { + throw JsonSerializationException.Create(reader, "Integer value {0} is not allowed.".FormatWith(CultureInfo.InvariantCulture, reader.Value)); + } + + return ConvertUtils.ConvertOrCast(reader.Value, CultureInfo.InvariantCulture, t); + } + } + catch (Exception ex) + { + throw JsonSerializationException.Create(reader, "Error converting value {0} to type '{1}'.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.FormatValueForPrint(reader.Value), objectType), ex); + } + + // we don't actually expect to get here. + throw JsonSerializationException.Create(reader, "Unexpected token {0} when parsing enum.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + } + + /// + /// Determines whether this instance can convert the specified object type. + /// + /// Type of the object. + /// + /// true if this instance can convert the specified object type; otherwise, false. + /// + public override bool CanConvert(Type objectType) + { + Type t = (ReflectionUtils.IsNullableType(objectType)) + ? Nullable.GetUnderlyingType(objectType) + : objectType; + + return t.IsEnum(); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Converters/VersionConverter.cs b/Common/00-1Json8.3/Json8.3/Converters/VersionConverter.cs new file mode 100644 index 0000000..3f512e4 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Converters/VersionConverter.cs @@ -0,0 +1,106 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Globalization; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Converters +{ + /// + /// Converts a to and from a string (e.g. "1.2.3.4"). + /// + public class VersionConverter : JsonConverter + { + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The value. + /// The calling serializer. + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + if (value == null) + { + writer.WriteNull(); + } + else if (value is Version) + { + writer.WriteValue(value.ToString()); + } + else + { + throw new JsonSerializationException("Expected Version object value"); + } + } + + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing property value of the JSON that is being converted. + /// The calling serializer. + /// The object value. + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return null; + } + else + { + if (reader.TokenType == JsonToken.String) + { + try + { + Version v = new Version((string)reader.Value); + return v; + } + catch (Exception ex) + { + throw JsonSerializationException.Create(reader, "Error parsing version string: {0}".FormatWith(CultureInfo.InvariantCulture, reader.Value), ex); + } + } + else + { + throw JsonSerializationException.Create(reader, "Unexpected token or value when parsing version. Token: {0}, Value: {1}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType, reader.Value)); + } + } + } + + /// + /// Determines whether this instance can convert the specified object type. + /// + /// Type of the object. + /// + /// true if this instance can convert the specified object type; otherwise, false. + /// + public override bool CanConvert(Type objectType) + { + return objectType == typeof(Version); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Converters/XmlNodeConverter.cs b/Common/00-1Json8.3/Json8.3/Converters/XmlNodeConverter.cs new file mode 100644 index 0000000..051f676 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Converters/XmlNodeConverter.cs @@ -0,0 +1,1949 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !PORTABLE40 +#if !(PORTABLE || NET20 || NET35) +using System.Numerics; +#endif +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Xml; +using System.Reflection; +using Newtonsoft.Json.Serialization; +#if !(NET20 || PORTABLE40) +using System.Xml.Linq; +#endif +using Newtonsoft.Json.Utilities; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Converters +{ + + #region XmlNodeWrappers +#if !DOTNET && !PORTABLE && !PORTABLE40 + internal class XmlDocumentWrapper : XmlNodeWrapper, IXmlDocument + { + private readonly XmlDocument _document; + + public XmlDocumentWrapper(XmlDocument document) + : base(document) + { + _document = document; + } + + public IXmlNode CreateComment(string data) + { + return new XmlNodeWrapper(_document.CreateComment(data)); + } + + public IXmlNode CreateTextNode(string text) + { + return new XmlNodeWrapper(_document.CreateTextNode(text)); + } + + public IXmlNode CreateCDataSection(string data) + { + return new XmlNodeWrapper(_document.CreateCDataSection(data)); + } + + public IXmlNode CreateWhitespace(string text) + { + return new XmlNodeWrapper(_document.CreateWhitespace(text)); + } + + public IXmlNode CreateSignificantWhitespace(string text) + { + return new XmlNodeWrapper(_document.CreateSignificantWhitespace(text)); + } + + public IXmlNode CreateXmlDeclaration(string version, string encoding, string standalone) + { + return new XmlDeclarationWrapper(_document.CreateXmlDeclaration(version, encoding, standalone)); + } + + public IXmlNode CreateXmlDocumentType(string name, string publicId, string systemId, string internalSubset) + { + return new XmlDocumentTypeWrapper(_document.CreateDocumentType(name, publicId, systemId, null)); + } + + public IXmlNode CreateProcessingInstruction(string target, string data) + { + return new XmlNodeWrapper(_document.CreateProcessingInstruction(target, data)); + } + + public IXmlElement CreateElement(string elementName) + { + return new XmlElementWrapper(_document.CreateElement(elementName)); + } + + public IXmlElement CreateElement(string qualifiedName, string namespaceUri) + { + return new XmlElementWrapper(_document.CreateElement(qualifiedName, namespaceUri)); + } + + public IXmlNode CreateAttribute(string name, string value) + { + XmlNodeWrapper attribute = new XmlNodeWrapper(_document.CreateAttribute(name)); + attribute.Value = value; + + return attribute; + } + + public IXmlNode CreateAttribute(string qualifiedName, string namespaceUri, string value) + { + XmlNodeWrapper attribute = new XmlNodeWrapper(_document.CreateAttribute(qualifiedName, namespaceUri)); + attribute.Value = value; + + return attribute; + } + + public IXmlElement DocumentElement + { + get + { + if (_document.DocumentElement == null) + { + return null; + } + + return new XmlElementWrapper(_document.DocumentElement); + } + } + } + + internal class XmlElementWrapper : XmlNodeWrapper, IXmlElement + { + private readonly XmlElement _element; + + public XmlElementWrapper(XmlElement element) + : base(element) + { + _element = element; + } + + public void SetAttributeNode(IXmlNode attribute) + { + XmlNodeWrapper xmlAttributeWrapper = (XmlNodeWrapper)attribute; + + _element.SetAttributeNode((XmlAttribute)xmlAttributeWrapper.WrappedNode); + } + + public string GetPrefixOfNamespace(string namespaceUri) + { + return _element.GetPrefixOfNamespace(namespaceUri); + } + + public bool IsEmpty + { + get { return _element.IsEmpty; } + } + } + + internal class XmlDeclarationWrapper : XmlNodeWrapper, IXmlDeclaration + { + private readonly XmlDeclaration _declaration; + + public XmlDeclarationWrapper(XmlDeclaration declaration) + : base(declaration) + { + _declaration = declaration; + } + + public string Version + { + get { return _declaration.Version; } + } + + public string Encoding + { + get { return _declaration.Encoding; } + set { _declaration.Encoding = value; } + } + + public string Standalone + { + get { return _declaration.Standalone; } + set { _declaration.Standalone = value; } + } + } + + internal class XmlDocumentTypeWrapper : XmlNodeWrapper, IXmlDocumentType + { + private readonly XmlDocumentType _documentType; + + public XmlDocumentTypeWrapper(XmlDocumentType documentType) + : base(documentType) + { + _documentType = documentType; + } + + public string Name + { + get { return _documentType.Name; } + } + + public string System + { + get { return _documentType.SystemId; } + } + + public string Public + { + get { return _documentType.PublicId; } + } + + public string InternalSubset + { + get { return _documentType.InternalSubset; } + } + + public override string LocalName + { + get { return "DOCTYPE"; } + } + } + + internal class XmlNodeWrapper : IXmlNode + { + private readonly XmlNode _node; + private IList _childNodes; + + public XmlNodeWrapper(XmlNode node) + { + _node = node; + } + + public object WrappedNode + { + get { return _node; } + } + + public XmlNodeType NodeType + { + get { return _node.NodeType; } + } + + public virtual string LocalName + { + get { return _node.LocalName; } + } + + public IList ChildNodes + { + get + { + // childnodes is read multiple times + // cache results to prevent multiple reads which kills perf in large documents + if (_childNodes == null) + { + _childNodes = _node.ChildNodes.Cast().Select(WrapNode).ToList(); + } + + return _childNodes; + } + } + + internal static IXmlNode WrapNode(XmlNode node) + { + switch (node.NodeType) + { + case XmlNodeType.Element: + return new XmlElementWrapper((XmlElement)node); + case XmlNodeType.XmlDeclaration: + return new XmlDeclarationWrapper((XmlDeclaration)node); + case XmlNodeType.DocumentType: + return new XmlDocumentTypeWrapper((XmlDocumentType)node); + default: + return new XmlNodeWrapper(node); + } + } + + public IList Attributes + { + get + { + if (_node.Attributes == null) + { + return null; + } + + return _node.Attributes.Cast().Select(WrapNode).ToList(); + } + } + + public IXmlNode ParentNode + { + get + { + XmlNode node = (_node is XmlAttribute) + ? ((XmlAttribute)_node).OwnerElement + : _node.ParentNode; + + if (node == null) + { + return null; + } + + return WrapNode(node); + } + } + + public string Value + { + get { return _node.Value; } + set { _node.Value = value; } + } + + public IXmlNode AppendChild(IXmlNode newChild) + { + XmlNodeWrapper xmlNodeWrapper = (XmlNodeWrapper)newChild; + _node.AppendChild(xmlNodeWrapper._node); + _childNodes = null; + + return newChild; + } + + public string NamespaceUri + { + get { return _node.NamespaceURI; } + } + } +#endif + #endregion + + #region Interfaces + internal interface IXmlDocument : IXmlNode + { + IXmlNode CreateComment(string text); + IXmlNode CreateTextNode(string text); + IXmlNode CreateCDataSection(string data); + IXmlNode CreateWhitespace(string text); + IXmlNode CreateSignificantWhitespace(string text); + IXmlNode CreateXmlDeclaration(string version, string encoding, string standalone); + IXmlNode CreateXmlDocumentType(string name, string publicId, string systemId, string internalSubset); + IXmlNode CreateProcessingInstruction(string target, string data); + IXmlElement CreateElement(string elementName); + IXmlElement CreateElement(string qualifiedName, string namespaceUri); + IXmlNode CreateAttribute(string name, string value); + IXmlNode CreateAttribute(string qualifiedName, string namespaceUri, string value); + + IXmlElement DocumentElement { get; } + } + + internal interface IXmlDeclaration : IXmlNode + { + string Version { get; } + string Encoding { get; set; } + string Standalone { get; set; } + } + + internal interface IXmlDocumentType : IXmlNode + { + string Name { get; } + string System { get; } + string Public { get; } + string InternalSubset { get; } + } + + internal interface IXmlElement : IXmlNode + { + void SetAttributeNode(IXmlNode attribute); + string GetPrefixOfNamespace(string namespaceUri); + bool IsEmpty { get; } + } + + internal interface IXmlNode + { + XmlNodeType NodeType { get; } + string LocalName { get; } + IList ChildNodes { get; } + IList Attributes { get; } + IXmlNode ParentNode { get; } + string Value { get; set; } + IXmlNode AppendChild(IXmlNode newChild); + string NamespaceUri { get; } + object WrappedNode { get; } + } + #endregion + + #region XNodeWrappers +#if !NET20 + internal class XDeclarationWrapper : XObjectWrapper, IXmlDeclaration + { + internal XDeclaration Declaration { get; private set; } + + public XDeclarationWrapper(XDeclaration declaration) + : base(null) + { + Declaration = declaration; + } + + public override XmlNodeType NodeType + { + get { return XmlNodeType.XmlDeclaration; } + } + + public string Version + { + get { return Declaration.Version; } + } + + public string Encoding + { + get { return Declaration.Encoding; } + set { Declaration.Encoding = value; } + } + + public string Standalone + { + get { return Declaration.Standalone; } + set { Declaration.Standalone = value; } + } + } + + internal class XDocumentTypeWrapper : XObjectWrapper, IXmlDocumentType + { + private readonly XDocumentType _documentType; + + public XDocumentTypeWrapper(XDocumentType documentType) + : base(documentType) + { + _documentType = documentType; + } + + public string Name + { + get { return _documentType.Name; } + } + + public string System + { + get { return _documentType.SystemId; } + } + + public string Public + { + get { return _documentType.PublicId; } + } + + public string InternalSubset + { + get { return _documentType.InternalSubset; } + } + + public override string LocalName + { + get { return "DOCTYPE"; } + } + } + + internal class XDocumentWrapper : XContainerWrapper, IXmlDocument + { + private XDocument Document + { + get { return (XDocument)WrappedNode; } + } + + public XDocumentWrapper(XDocument document) + : base(document) + { + } + + public override IList ChildNodes + { + get + { + IList childNodes = base.ChildNodes; + + if (Document.Declaration != null && childNodes[0].NodeType != XmlNodeType.XmlDeclaration) + { + childNodes.Insert(0, new XDeclarationWrapper(Document.Declaration)); + } + + return childNodes; + } + } + + public IXmlNode CreateComment(string text) + { + return new XObjectWrapper(new XComment(text)); + } + + public IXmlNode CreateTextNode(string text) + { + return new XObjectWrapper(new XText(text)); + } + + public IXmlNode CreateCDataSection(string data) + { + return new XObjectWrapper(new XCData(data)); + } + + public IXmlNode CreateWhitespace(string text) + { + return new XObjectWrapper(new XText(text)); + } + + public IXmlNode CreateSignificantWhitespace(string text) + { + return new XObjectWrapper(new XText(text)); + } + + public IXmlNode CreateXmlDeclaration(string version, string encoding, string standalone) + { + return new XDeclarationWrapper(new XDeclaration(version, encoding, standalone)); + } + + public IXmlNode CreateXmlDocumentType(string name, string publicId, string systemId, string internalSubset) + { + return new XDocumentTypeWrapper(new XDocumentType(name, publicId, systemId, internalSubset)); + } + + public IXmlNode CreateProcessingInstruction(string target, string data) + { + return new XProcessingInstructionWrapper(new XProcessingInstruction(target, data)); + } + + public IXmlElement CreateElement(string elementName) + { + return new XElementWrapper(new XElement(elementName)); + } + + public IXmlElement CreateElement(string qualifiedName, string namespaceUri) + { + string localName = MiscellaneousUtils.GetLocalName(qualifiedName); + return new XElementWrapper(new XElement(XName.Get(localName, namespaceUri))); + } + + public IXmlNode CreateAttribute(string name, string value) + { + return new XAttributeWrapper(new XAttribute(name, value)); + } + + public IXmlNode CreateAttribute(string qualifiedName, string namespaceUri, string value) + { + string localName = MiscellaneousUtils.GetLocalName(qualifiedName); + return new XAttributeWrapper(new XAttribute(XName.Get(localName, namespaceUri), value)); + } + + public IXmlElement DocumentElement + { + get + { + if (Document.Root == null) + { + return null; + } + + return new XElementWrapper(Document.Root); + } + } + + public override IXmlNode AppendChild(IXmlNode newChild) + { + XDeclarationWrapper declarationWrapper = newChild as XDeclarationWrapper; + if (declarationWrapper != null) + { + Document.Declaration = declarationWrapper.Declaration; + return declarationWrapper; + } + else + { + return base.AppendChild(newChild); + } + } + } + + internal class XTextWrapper : XObjectWrapper + { + private XText Text + { + get { return (XText)WrappedNode; } + } + + public XTextWrapper(XText text) + : base(text) + { + } + + public override string Value + { + get { return Text.Value; } + set { Text.Value = value; } + } + + public override IXmlNode ParentNode + { + get + { + if (Text.Parent == null) + { + return null; + } + + return XContainerWrapper.WrapNode(Text.Parent); + } + } + } + + internal class XCommentWrapper : XObjectWrapper + { + private XComment Text + { + get { return (XComment)WrappedNode; } + } + + public XCommentWrapper(XComment text) + : base(text) + { + } + + public override string Value + { + get { return Text.Value; } + set { Text.Value = value; } + } + + public override IXmlNode ParentNode + { + get + { + if (Text.Parent == null) + { + return null; + } + + return XContainerWrapper.WrapNode(Text.Parent); + } + } + } + + internal class XProcessingInstructionWrapper : XObjectWrapper + { + private XProcessingInstruction ProcessingInstruction + { + get { return (XProcessingInstruction)WrappedNode; } + } + + public XProcessingInstructionWrapper(XProcessingInstruction processingInstruction) + : base(processingInstruction) + { + } + + public override string LocalName + { + get { return ProcessingInstruction.Target; } + } + + public override string Value + { + get { return ProcessingInstruction.Data; } + set { ProcessingInstruction.Data = value; } + } + } + + internal class XContainerWrapper : XObjectWrapper + { + private IList _childNodes; + + private XContainer Container + { + get { return (XContainer)WrappedNode; } + } + + public XContainerWrapper(XContainer container) + : base(container) + { + } + + public override IList ChildNodes + { + get + { + // childnodes is read multiple times + // cache results to prevent multiple reads which kills perf in large documents + if (_childNodes == null) + { + _childNodes = Container.Nodes().Select(WrapNode).ToList(); + } + + return _childNodes; + } + } + + public override IXmlNode ParentNode + { + get + { + if (Container.Parent == null) + { + return null; + } + + return WrapNode(Container.Parent); + } + } + + internal static IXmlNode WrapNode(XObject node) + { + if (node is XDocument) + { + return new XDocumentWrapper((XDocument)node); + } + else if (node is XElement) + { + return new XElementWrapper((XElement)node); + } + else if (node is XContainer) + { + return new XContainerWrapper((XContainer)node); + } + else if (node is XProcessingInstruction) + { + return new XProcessingInstructionWrapper((XProcessingInstruction)node); + } + else if (node is XText) + { + return new XTextWrapper((XText)node); + } + else if (node is XComment) + { + return new XCommentWrapper((XComment)node); + } + else if (node is XAttribute) + { + return new XAttributeWrapper((XAttribute)node); + } + else if (node is XDocumentType) + { + return new XDocumentTypeWrapper((XDocumentType)node); + } + else + { + return new XObjectWrapper(node); + } + } + + public override IXmlNode AppendChild(IXmlNode newChild) + { + Container.Add(newChild.WrappedNode); + _childNodes = null; + + return newChild; + } + } + + internal class XObjectWrapper : IXmlNode + { + private readonly XObject _xmlObject; + + public XObjectWrapper(XObject xmlObject) + { + _xmlObject = xmlObject; + } + + public object WrappedNode + { + get { return _xmlObject; } + } + + public virtual XmlNodeType NodeType + { + get { return _xmlObject.NodeType; } + } + + public virtual string LocalName + { + get { return null; } + } + + public virtual IList ChildNodes + { + get { return new List(); } + } + + public virtual IList Attributes + { + get { return null; } + } + + public virtual IXmlNode ParentNode + { + get { return null; } + } + + public virtual string Value + { + get { return null; } + set { throw new InvalidOperationException(); } + } + + public virtual IXmlNode AppendChild(IXmlNode newChild) + { + throw new InvalidOperationException(); + } + + public virtual string NamespaceUri + { + get { return null; } + } + } + + internal class XAttributeWrapper : XObjectWrapper + { + private XAttribute Attribute + { + get { return (XAttribute)WrappedNode; } + } + + public XAttributeWrapper(XAttribute attribute) + : base(attribute) + { + } + + public override string Value + { + get { return Attribute.Value; } + set { Attribute.Value = value; } + } + + public override string LocalName + { + get { return Attribute.Name.LocalName; } + } + + public override string NamespaceUri + { + get { return Attribute.Name.NamespaceName; } + } + + public override IXmlNode ParentNode + { + get + { + if (Attribute.Parent == null) + { + return null; + } + + return XContainerWrapper.WrapNode(Attribute.Parent); + } + } + } + + internal class XElementWrapper : XContainerWrapper, IXmlElement + { + private XElement Element + { + get { return (XElement)WrappedNode; } + } + + public XElementWrapper(XElement element) + : base(element) + { + } + + public void SetAttributeNode(IXmlNode attribute) + { + XObjectWrapper wrapper = (XObjectWrapper)attribute; + Element.Add(wrapper.WrappedNode); + } + + public override IList Attributes + { + get { return Element.Attributes().Select(a => new XAttributeWrapper(a)).Cast().ToList(); } + } + + public override string Value + { + get { return Element.Value; } + set { Element.Value = value; } + } + + public override string LocalName + { + get { return Element.Name.LocalName; } + } + + public override string NamespaceUri + { + get { return Element.Name.NamespaceName; } + } + + public string GetPrefixOfNamespace(string namespaceUri) + { + return Element.GetPrefixOfNamespace(namespaceUri); + } + + public bool IsEmpty + { + get { return Element.IsEmpty; } + } + } +#endif + #endregion + + /// + /// Converts XML to and from JSON. + /// + public class XmlNodeConverter : JsonConverter + { + private const string TextName = "#text"; + private const string CommentName = "#comment"; + private const string CDataName = "#cdata-section"; + private const string WhitespaceName = "#whitespace"; + private const string SignificantWhitespaceName = "#significant-whitespace"; + private const string DeclarationName = "?xml"; + private const string JsonNamespaceUri = "http://james.newtonking.com/projects/json"; + + /// + /// Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produces multiple root elements. + /// + /// The name of the deserialize root element. + public string DeserializeRootElementName { get; set; } + + /// + /// Gets or sets a flag to indicate whether to write the Json.NET array attribute. + /// This attribute helps preserve arrays when converting the written XML back to JSON. + /// + /// true if the array attibute is written to the XML; otherwise, false. + public bool WriteArrayAttribute { get; set; } + + /// + /// Gets or sets a value indicating whether to write the root JSON object. + /// + /// true if the JSON root object is omitted; otherwise, false. + public bool OmitRootObject { get; set; } + + #region Writing + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The calling serializer. + /// The value. + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + IXmlNode node = WrapXml(value); + + XmlNamespaceManager manager = new XmlNamespaceManager(new NameTable()); + PushParentNamespaces(node, manager); + + if (!OmitRootObject) + { + writer.WriteStartObject(); + } + + SerializeNode(writer, node, manager, !OmitRootObject); + + if (!OmitRootObject) + { + writer.WriteEndObject(); + } + } + + private IXmlNode WrapXml(object value) + { +#if !NET20 + if (value is XObject) + { + return XContainerWrapper.WrapNode((XObject)value); + } +#endif +#if !(DOTNET || PORTABLE) + if (value is XmlNode) + { + return XmlNodeWrapper.WrapNode((XmlNode)value); + } +#endif + + throw new ArgumentException("Value must be an XML object.", nameof(value)); + } + + private void PushParentNamespaces(IXmlNode node, XmlNamespaceManager manager) + { + List parentElements = null; + + IXmlNode parent = node; + while ((parent = parent.ParentNode) != null) + { + if (parent.NodeType == XmlNodeType.Element) + { + if (parentElements == null) + { + parentElements = new List(); + } + + parentElements.Add(parent); + } + } + + if (parentElements != null) + { + parentElements.Reverse(); + + foreach (IXmlNode parentElement in parentElements) + { + manager.PushScope(); + foreach (IXmlNode attribute in parentElement.Attributes) + { + if (attribute.NamespaceUri == "http://www.w3.org/2000/xmlns/" && attribute.LocalName != "xmlns") + { + manager.AddNamespace(attribute.LocalName, attribute.Value); + } + } + } + } + } + + private string ResolveFullName(IXmlNode node, XmlNamespaceManager manager) + { + string prefix = (node.NamespaceUri == null || (node.LocalName == "xmlns" && node.NamespaceUri == "http://www.w3.org/2000/xmlns/")) + ? null + : manager.LookupPrefix(node.NamespaceUri); + + if (!string.IsNullOrEmpty(prefix)) + { + return prefix + ":" + XmlConvert.DecodeName(node.LocalName); + } + else + { + return XmlConvert.DecodeName(node.LocalName); + } + } + + private string GetPropertyName(IXmlNode node, XmlNamespaceManager manager) + { + switch (node.NodeType) + { + case XmlNodeType.Attribute: + if (node.NamespaceUri == JsonNamespaceUri) + { + return "$" + node.LocalName; + } + else + { + return "@" + ResolveFullName(node, manager); + } + case XmlNodeType.CDATA: + return CDataName; + case XmlNodeType.Comment: + return CommentName; + case XmlNodeType.Element: + if (node.NamespaceUri == JsonNamespaceUri) + { + return "$" + node.LocalName; + } + else + { + return ResolveFullName(node, manager); + } + case XmlNodeType.ProcessingInstruction: + return "?" + ResolveFullName(node, manager); + case XmlNodeType.DocumentType: + return "!" + ResolveFullName(node, manager); + case XmlNodeType.XmlDeclaration: + return DeclarationName; + case XmlNodeType.SignificantWhitespace: + return SignificantWhitespaceName; + case XmlNodeType.Text: + return TextName; + case XmlNodeType.Whitespace: + return WhitespaceName; + default: + throw new JsonSerializationException("Unexpected XmlNodeType when getting node name: " + node.NodeType); + } + } + + private bool IsArray(IXmlNode node) + { + IXmlNode jsonArrayAttribute = (node.Attributes != null) + ? node.Attributes.SingleOrDefault(a => a.LocalName == "Array" && a.NamespaceUri == JsonNamespaceUri) + : null; + + return (jsonArrayAttribute != null && XmlConvert.ToBoolean(jsonArrayAttribute.Value)); + } + + private void SerializeGroupedNodes(JsonWriter writer, IXmlNode node, XmlNamespaceManager manager, bool writePropertyName) + { + // group nodes together by name + Dictionary> nodesGroupedByName = new Dictionary>(); + + for (int i = 0; i < node.ChildNodes.Count; i++) + { + IXmlNode childNode = node.ChildNodes[i]; + string nodeName = GetPropertyName(childNode, manager); + + List nodes; + if (!nodesGroupedByName.TryGetValue(nodeName, out nodes)) + { + nodes = new List(); + nodesGroupedByName.Add(nodeName, nodes); + } + + nodes.Add(childNode); + } + + // loop through grouped nodes. write single name instances as normal, + // write multiple names together in an array + foreach (KeyValuePair> nodeNameGroup in nodesGroupedByName) + { + List groupedNodes = nodeNameGroup.Value; + bool writeArray; + + if (groupedNodes.Count == 1) + { + writeArray = IsArray(groupedNodes[0]); + } + else + { + writeArray = true; + } + + if (!writeArray) + { + SerializeNode(writer, groupedNodes[0], manager, writePropertyName); + } + else + { + string elementNames = nodeNameGroup.Key; + + if (writePropertyName) + { + writer.WritePropertyName(elementNames); + } + + writer.WriteStartArray(); + + for (int i = 0; i < groupedNodes.Count; i++) + { + SerializeNode(writer, groupedNodes[i], manager, false); + } + + writer.WriteEndArray(); + } + } + } + + private void SerializeNode(JsonWriter writer, IXmlNode node, XmlNamespaceManager manager, bool writePropertyName) + { + switch (node.NodeType) + { + case XmlNodeType.Document: + case XmlNodeType.DocumentFragment: + SerializeGroupedNodes(writer, node, manager, writePropertyName); + break; + case XmlNodeType.Element: + if (IsArray(node) && node.ChildNodes.All(n => n.LocalName == node.LocalName) && node.ChildNodes.Count > 0) + { + SerializeGroupedNodes(writer, node, manager, false); + } + else + { + manager.PushScope(); + + foreach (IXmlNode attribute in node.Attributes) + { + if (attribute.NamespaceUri == "http://www.w3.org/2000/xmlns/") + { + string namespacePrefix = (attribute.LocalName != "xmlns") + ? XmlConvert.DecodeName(attribute.LocalName) + : string.Empty; + string namespaceUri = attribute.Value; + + manager.AddNamespace(namespacePrefix, namespaceUri); + } + } + + if (writePropertyName) + { + writer.WritePropertyName(GetPropertyName(node, manager)); + } + + if (!ValueAttributes(node.Attributes).Any() && node.ChildNodes.Count == 1 + && node.ChildNodes[0].NodeType == XmlNodeType.Text) + { + // write elements with a single text child as a name value pair + writer.WriteValue(node.ChildNodes[0].Value); + } + else if (node.ChildNodes.Count == 0 && CollectionUtils.IsNullOrEmpty(node.Attributes)) + { + IXmlElement element = (IXmlElement)node; + + // empty element + if (element.IsEmpty) + { + writer.WriteNull(); + } + else + { + writer.WriteValue(string.Empty); + } + } + else + { + writer.WriteStartObject(); + + for (int i = 0; i < node.Attributes.Count; i++) + { + SerializeNode(writer, node.Attributes[i], manager, true); + } + + SerializeGroupedNodes(writer, node, manager, true); + + writer.WriteEndObject(); + } + + manager.PopScope(); + } + + break; + case XmlNodeType.Comment: + if (writePropertyName) + { + writer.WriteComment(node.Value); + } + break; + case XmlNodeType.Attribute: + case XmlNodeType.Text: + case XmlNodeType.CDATA: + case XmlNodeType.ProcessingInstruction: + case XmlNodeType.Whitespace: + case XmlNodeType.SignificantWhitespace: + if (node.NamespaceUri == "http://www.w3.org/2000/xmlns/" && node.Value == JsonNamespaceUri) + { + return; + } + + if (node.NamespaceUri == JsonNamespaceUri) + { + if (node.LocalName == "Array") + { + return; + } + } + + if (writePropertyName) + { + writer.WritePropertyName(GetPropertyName(node, manager)); + } + writer.WriteValue(node.Value); + break; + case XmlNodeType.XmlDeclaration: + IXmlDeclaration declaration = (IXmlDeclaration)node; + writer.WritePropertyName(GetPropertyName(node, manager)); + writer.WriteStartObject(); + + if (!string.IsNullOrEmpty(declaration.Version)) + { + writer.WritePropertyName("@version"); + writer.WriteValue(declaration.Version); + } + if (!string.IsNullOrEmpty(declaration.Encoding)) + { + writer.WritePropertyName("@encoding"); + writer.WriteValue(declaration.Encoding); + } + if (!string.IsNullOrEmpty(declaration.Standalone)) + { + writer.WritePropertyName("@standalone"); + writer.WriteValue(declaration.Standalone); + } + + writer.WriteEndObject(); + break; + case XmlNodeType.DocumentType: + IXmlDocumentType documentType = (IXmlDocumentType)node; + writer.WritePropertyName(GetPropertyName(node, manager)); + writer.WriteStartObject(); + + if (!string.IsNullOrEmpty(documentType.Name)) + { + writer.WritePropertyName("@name"); + writer.WriteValue(documentType.Name); + } + if (!string.IsNullOrEmpty(documentType.Public)) + { + writer.WritePropertyName("@public"); + writer.WriteValue(documentType.Public); + } + if (!string.IsNullOrEmpty(documentType.System)) + { + writer.WritePropertyName("@system"); + writer.WriteValue(documentType.System); + } + if (!string.IsNullOrEmpty(documentType.InternalSubset)) + { + writer.WritePropertyName("@internalSubset"); + writer.WriteValue(documentType.InternalSubset); + } + + writer.WriteEndObject(); + break; + default: + throw new JsonSerializationException("Unexpected XmlNodeType when serializing nodes: " + node.NodeType); + } + } + #endregion + + #region Reading + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing value of object being read. + /// The calling serializer. + /// The object value. + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return null; + } + + XmlNamespaceManager manager = new XmlNamespaceManager(new NameTable()); + IXmlDocument document = null; + IXmlNode rootNode = null; + +#if !NET20 + if (typeof(XObject).IsAssignableFrom(objectType)) + { + if (objectType != typeof(XDocument) && objectType != typeof(XElement)) + { + throw new JsonSerializationException("XmlNodeConverter only supports deserializing XDocument or XElement."); + } + + XDocument d = new XDocument(); + document = new XDocumentWrapper(d); + rootNode = document; + } +#endif +#if !(DOTNET || PORTABLE) + if (typeof(XmlNode).IsAssignableFrom(objectType)) + { + if (objectType != typeof(XmlDocument)) + { + throw new JsonSerializationException("XmlNodeConverter only supports deserializing XmlDocuments"); + } + + XmlDocument d = new XmlDocument(); + // prevent http request when resolving any DTD references + d.XmlResolver = null; + + document = new XmlDocumentWrapper(d); + rootNode = document; + } +#endif + + if (document == null || rootNode == null) + { + throw new JsonSerializationException("Unexpected type when converting XML: " + objectType); + } + + if (reader.TokenType != JsonToken.StartObject) + { + throw new JsonSerializationException("XmlNodeConverter can only convert JSON that begins with an object."); + } + + if (!string.IsNullOrEmpty(DeserializeRootElementName)) + { + //rootNode = document.CreateElement(DeserializeRootElementName); + //document.AppendChild(rootNode); + ReadElement(reader, document, rootNode, DeserializeRootElementName, manager); + } + else + { + reader.Read(); + DeserializeNode(reader, document, manager, rootNode); + } + +#if !NET20 + if (objectType == typeof(XElement)) + { + XElement element = (XElement)document.DocumentElement.WrappedNode; + element.Remove(); + + return element; + } +#endif + + return document.WrappedNode; + } + + private void DeserializeValue(JsonReader reader, IXmlDocument document, XmlNamespaceManager manager, string propertyName, IXmlNode currentNode) + { + switch (propertyName) + { + case TextName: + currentNode.AppendChild(document.CreateTextNode(reader.Value.ToString())); + break; + case CDataName: + currentNode.AppendChild(document.CreateCDataSection(reader.Value.ToString())); + break; + case WhitespaceName: + currentNode.AppendChild(document.CreateWhitespace(reader.Value.ToString())); + break; + case SignificantWhitespaceName: + currentNode.AppendChild(document.CreateSignificantWhitespace(reader.Value.ToString())); + break; + default: + // processing instructions and the xml declaration start with ? + if (!string.IsNullOrEmpty(propertyName) && propertyName[0] == '?') + { + CreateInstruction(reader, document, currentNode, propertyName); + } + else if (string.Equals(propertyName, "!DOCTYPE", StringComparison.OrdinalIgnoreCase)) + { + CreateDocumentType(reader, document, currentNode); + } + else + { + if (reader.TokenType == JsonToken.StartArray) + { + // handle nested arrays + ReadArrayElements(reader, document, propertyName, currentNode, manager); + return; + } + + // have to wait until attributes have been parsed before creating element + // attributes may contain namespace info used by the element + ReadElement(reader, document, currentNode, propertyName, manager); + } + break; + } + } + + private void ReadElement(JsonReader reader, IXmlDocument document, IXmlNode currentNode, string propertyName, XmlNamespaceManager manager) + { + if (string.IsNullOrEmpty(propertyName)) + { + throw JsonSerializationException.Create(reader, "XmlNodeConverter cannot convert JSON with an empty property name to XML."); + } + + Dictionary attributeNameValues = ReadAttributeElements(reader, manager); + + string elementPrefix = MiscellaneousUtils.GetPrefix(propertyName); + + if (propertyName.StartsWith('@')) + { + string attributeName = propertyName.Substring(1); + string attributePrefix = MiscellaneousUtils.GetPrefix(attributeName); + + AddAttribute(reader, document, currentNode, attributeName, manager, attributePrefix); + } + else if (propertyName.StartsWith('$')) + { + if (propertyName == JsonTypeReflector.ArrayValuesPropertyName) + { + propertyName = propertyName.Substring(1); + elementPrefix = manager.LookupPrefix(JsonNamespaceUri); + CreateElement(reader, document, currentNode, propertyName, manager, elementPrefix, attributeNameValues); + } + else + { + string attributeName = propertyName.Substring(1); + string attributePrefix = manager.LookupPrefix(JsonNamespaceUri); + AddAttribute(reader, document, currentNode, attributeName, manager, attributePrefix); + } + } + else + { + CreateElement(reader, document, currentNode, propertyName, manager, elementPrefix, attributeNameValues); + } + } + + private void CreateElement(JsonReader reader, IXmlDocument document, IXmlNode currentNode, string elementName, XmlNamespaceManager manager, string elementPrefix, Dictionary attributeNameValues) + { + IXmlElement element = CreateElement(elementName, document, elementPrefix, manager); + + currentNode.AppendChild(element); + + // add attributes to newly created element + foreach (KeyValuePair nameValue in attributeNameValues) + { + string encodedName = XmlConvert.EncodeName(nameValue.Key); + string attributePrefix = MiscellaneousUtils.GetPrefix(nameValue.Key); + + IXmlNode attribute = (!string.IsNullOrEmpty(attributePrefix)) + ? document.CreateAttribute(encodedName, manager.LookupNamespace(attributePrefix) ?? string.Empty, nameValue.Value) + : document.CreateAttribute(encodedName, nameValue.Value); + + element.SetAttributeNode(attribute); + } + + if (reader.TokenType == JsonToken.String + || reader.TokenType == JsonToken.Integer + || reader.TokenType == JsonToken.Float + || reader.TokenType == JsonToken.Boolean + || reader.TokenType == JsonToken.Date) + { + string text = ConvertTokenToXmlValue(reader); + if (text != null) + { + element.AppendChild(document.CreateTextNode(text)); + } + } + else if (reader.TokenType == JsonToken.Null) + { + // empty element. do nothing + } + else + { + // finished element will have no children to deserialize + if (reader.TokenType != JsonToken.EndObject) + { + manager.PushScope(); + DeserializeNode(reader, document, manager, element); + manager.PopScope(); + } + + manager.RemoveNamespace(string.Empty, manager.DefaultNamespace); + } + } + + private static void AddAttribute(JsonReader reader, IXmlDocument document, IXmlNode currentNode, string attributeName, XmlNamespaceManager manager, string attributePrefix) + { + string encodedName = XmlConvert.EncodeName(attributeName); + string attributeValue = reader.Value.ToString(); + + IXmlNode attribute = (!string.IsNullOrEmpty(attributePrefix)) + ? document.CreateAttribute(encodedName, manager.LookupNamespace(attributePrefix), attributeValue) + : document.CreateAttribute(encodedName, attributeValue); + + ((IXmlElement)currentNode).SetAttributeNode(attribute); + } + + private string ConvertTokenToXmlValue(JsonReader reader) + { + if (reader.TokenType == JsonToken.String) + { + return (reader.Value != null) ? reader.Value.ToString() : null; + } + else if (reader.TokenType == JsonToken.Integer) + { +#if !(NET20 || NET35 || PORTABLE || PORTABLE40) + if (reader.Value is BigInteger) + { + return ((BigInteger)reader.Value).ToString(CultureInfo.InvariantCulture); + } +#endif + + return XmlConvert.ToString(Convert.ToInt64(reader.Value, CultureInfo.InvariantCulture)); + } + else if (reader.TokenType == JsonToken.Float) + { + if (reader.Value is decimal) + { + return XmlConvert.ToString((decimal)reader.Value); + } + if (reader.Value is float) + { + return XmlConvert.ToString((float)reader.Value); + } + + return XmlConvert.ToString(Convert.ToDouble(reader.Value, CultureInfo.InvariantCulture)); + } + else if (reader.TokenType == JsonToken.Boolean) + { + return XmlConvert.ToString(Convert.ToBoolean(reader.Value, CultureInfo.InvariantCulture)); + } + else if (reader.TokenType == JsonToken.Date) + { +#if !NET20 + if (reader.Value is DateTimeOffset) + { + return XmlConvert.ToString((DateTimeOffset)reader.Value); + } +#endif + + DateTime d = Convert.ToDateTime(reader.Value, CultureInfo.InvariantCulture); +#if !PORTABLE + return XmlConvert.ToString(d, DateTimeUtils.ToSerializationMode(d.Kind)); +#else + return XmlConvert.ToString(d); +#endif + } + else if (reader.TokenType == JsonToken.Null) + { + return null; + } + else + { + throw JsonSerializationException.Create(reader, "Cannot get an XML string value from token type '{0}'.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + } + } + + private void ReadArrayElements(JsonReader reader, IXmlDocument document, string propertyName, IXmlNode currentNode, XmlNamespaceManager manager) + { + string elementPrefix = MiscellaneousUtils.GetPrefix(propertyName); + + IXmlElement nestedArrayElement = CreateElement(propertyName, document, elementPrefix, manager); + + currentNode.AppendChild(nestedArrayElement); + + int count = 0; + while (reader.Read() && reader.TokenType != JsonToken.EndArray) + { + DeserializeValue(reader, document, manager, propertyName, nestedArrayElement); + count++; + } + + if (WriteArrayAttribute) + { + AddJsonArrayAttribute(nestedArrayElement, document); + } + + if (count == 1 && WriteArrayAttribute) + { + IXmlElement arrayElement = nestedArrayElement.ChildNodes.OfType().Single(n => n.LocalName == propertyName); + AddJsonArrayAttribute(arrayElement, document); + } + } + + private void AddJsonArrayAttribute(IXmlElement element, IXmlDocument document) + { + element.SetAttributeNode(document.CreateAttribute("json:Array", JsonNamespaceUri, "true")); + +#if !NET20 + // linq to xml doesn't automatically include prefixes via the namespace manager + if (element is XElementWrapper) + { + if (element.GetPrefixOfNamespace(JsonNamespaceUri) == null) + { + element.SetAttributeNode(document.CreateAttribute("xmlns:json", "http://www.w3.org/2000/xmlns/", JsonNamespaceUri)); + } + } +#endif + } + + private Dictionary ReadAttributeElements(JsonReader reader, XmlNamespaceManager manager) + { + Dictionary attributeNameValues = new Dictionary(); + bool finishedAttributes = false; + bool finishedElement = false; + + // a string token means the element only has a single text child + if (reader.TokenType != JsonToken.String + && reader.TokenType != JsonToken.Null + && reader.TokenType != JsonToken.Boolean + && reader.TokenType != JsonToken.Integer + && reader.TokenType != JsonToken.Float + && reader.TokenType != JsonToken.Date + && reader.TokenType != JsonToken.StartConstructor) + { + // read properties until first non-attribute is encountered + while (!finishedAttributes && !finishedElement && reader.Read()) + { + switch (reader.TokenType) + { + case JsonToken.PropertyName: + string attributeName = reader.Value.ToString(); + + if (!string.IsNullOrEmpty(attributeName)) + { + char firstChar = attributeName[0]; + string attributeValue; + + switch (firstChar) + { + case '@': + attributeName = attributeName.Substring(1); + reader.Read(); + attributeValue = ConvertTokenToXmlValue(reader); + attributeNameValues.Add(attributeName, attributeValue); + + string namespacePrefix; + if (IsNamespaceAttribute(attributeName, out namespacePrefix)) + { + manager.AddNamespace(namespacePrefix, attributeValue); + } + break; + case '$': + // check that JsonNamespaceUri is in scope + // if it isn't then add it to document and namespace manager + string jsonPrefix = manager.LookupPrefix(JsonNamespaceUri); + if (jsonPrefix == null) + { + // ensure that the prefix used is free + int? i = null; + while (manager.LookupNamespace("json" + i) != null) + { + i = i.GetValueOrDefault() + 1; + } + jsonPrefix = "json" + i; + + attributeNameValues.Add("xmlns:" + jsonPrefix, JsonNamespaceUri); + manager.AddNamespace(jsonPrefix, JsonNamespaceUri); + } + + // special case $values, it will have a non-primitive value + if (attributeName == JsonTypeReflector.ArrayValuesPropertyName) + { + finishedAttributes = true; + break; + } + + attributeName = attributeName.Substring(1); + reader.Read(); + + if (!JsonTokenUtils.IsPrimitiveToken(reader.TokenType)) + { + throw JsonSerializationException.Create(reader, "Unexpected JsonToken: " + reader.TokenType); + } + + attributeValue = (reader.Value != null) ? reader.Value.ToString() : null; + attributeNameValues.Add(jsonPrefix + ":" + attributeName, attributeValue); + break; + default: + finishedAttributes = true; + break; + } + } + else + { + finishedAttributes = true; + } + + break; + case JsonToken.EndObject: + finishedElement = true; + break; + case JsonToken.Comment: + finishedElement = true; + break; + default: + throw JsonSerializationException.Create(reader, "Unexpected JsonToken: " + reader.TokenType); + } + } + } + + return attributeNameValues; + } + + private void CreateInstruction(JsonReader reader, IXmlDocument document, IXmlNode currentNode, string propertyName) + { + if (propertyName == DeclarationName) + { + string version = null; + string encoding = null; + string standalone = null; + while (reader.Read() && reader.TokenType != JsonToken.EndObject) + { + switch (reader.Value.ToString()) + { + case "@version": + reader.Read(); + version = reader.Value.ToString(); + break; + case "@encoding": + reader.Read(); + encoding = reader.Value.ToString(); + break; + case "@standalone": + reader.Read(); + standalone = reader.Value.ToString(); + break; + default: + throw JsonSerializationException.Create(reader, "Unexpected property name encountered while deserializing XmlDeclaration: " + reader.Value); + } + } + + IXmlNode declaration = document.CreateXmlDeclaration(version, encoding, standalone); + currentNode.AppendChild(declaration); + } + else + { + IXmlNode instruction = document.CreateProcessingInstruction(propertyName.Substring(1), reader.Value.ToString()); + currentNode.AppendChild(instruction); + } + } + + private void CreateDocumentType(JsonReader reader, IXmlDocument document, IXmlNode currentNode) + { + string name = null; + string publicId = null; + string systemId = null; + string internalSubset = null; + while (reader.Read() && reader.TokenType != JsonToken.EndObject) + { + switch (reader.Value.ToString()) + { + case "@name": + reader.Read(); + name = reader.Value.ToString(); + break; + case "@public": + reader.Read(); + publicId = reader.Value.ToString(); + break; + case "@system": + reader.Read(); + systemId = reader.Value.ToString(); + break; + case "@internalSubset": + reader.Read(); + internalSubset = reader.Value.ToString(); + break; + default: + throw JsonSerializationException.Create(reader, "Unexpected property name encountered while deserializing XmlDeclaration: " + reader.Value); + } + } + + IXmlNode documentType = document.CreateXmlDocumentType(name, publicId, systemId, internalSubset); + currentNode.AppendChild(documentType); + } + + private IXmlElement CreateElement(string elementName, IXmlDocument document, string elementPrefix, XmlNamespaceManager manager) + { + string encodeName = XmlConvert.EncodeName(elementName); + string ns = string.IsNullOrEmpty(elementPrefix) ? manager.DefaultNamespace : manager.LookupNamespace(elementPrefix); + + IXmlElement element = (!string.IsNullOrEmpty(ns)) ? document.CreateElement(encodeName, ns) : document.CreateElement(encodeName); + + return element; + } + + private void DeserializeNode(JsonReader reader, IXmlDocument document, XmlNamespaceManager manager, IXmlNode currentNode) + { + do + { + switch (reader.TokenType) + { + case JsonToken.PropertyName: + if (currentNode.NodeType == XmlNodeType.Document && document.DocumentElement != null) + { + throw JsonSerializationException.Create(reader, "JSON root object has multiple properties. The root object must have a single property in order to create a valid XML document. Consider specifing a DeserializeRootElementName."); + } + + string propertyName = reader.Value.ToString(); + reader.Read(); + + if (reader.TokenType == JsonToken.StartArray) + { + int count = 0; + while (reader.Read() && reader.TokenType != JsonToken.EndArray) + { + DeserializeValue(reader, document, manager, propertyName, currentNode); + count++; + } + + if (count == 1 && WriteArrayAttribute) + { + IXmlElement arrayElement = currentNode.ChildNodes.OfType().Single(n => n.LocalName == propertyName); + AddJsonArrayAttribute(arrayElement, document); + } + } + else + { + DeserializeValue(reader, document, manager, propertyName, currentNode); + } + break; + case JsonToken.StartConstructor: + string constructorName = reader.Value.ToString(); + + while (reader.Read() && reader.TokenType != JsonToken.EndConstructor) + { + DeserializeValue(reader, document, manager, constructorName, currentNode); + } + break; + case JsonToken.Comment: + currentNode.AppendChild(document.CreateComment((string)reader.Value)); + break; + case JsonToken.EndObject: + case JsonToken.EndArray: + return; + default: + throw JsonSerializationException.Create(reader, "Unexpected JsonToken when deserializing node: " + reader.TokenType); + } + } while (reader.TokenType == JsonToken.PropertyName || reader.Read()); + // don't read if current token is a property. token was already read when parsing element attributes + } + + /// + /// Checks if the attributeName is a namespace attribute. + /// + /// Attribute name to test. + /// The attribute name prefix if it has one, otherwise an empty string. + /// True if attribute name is for a namespace attribute, otherwise false. + private bool IsNamespaceAttribute(string attributeName, out string prefix) + { + if (attributeName.StartsWith("xmlns", StringComparison.Ordinal)) + { + if (attributeName.Length == 5) + { + prefix = string.Empty; + return true; + } + else if (attributeName[5] == ':') + { + prefix = attributeName.Substring(6, attributeName.Length - 6); + return true; + } + } + prefix = null; + return false; + } + + private IEnumerable ValueAttributes(IEnumerable c) + { + return c.Where(a => a.NamespaceUri != JsonNamespaceUri); + } + #endregion + + /// + /// Determines whether this instance can convert the specified value type. + /// + /// Type of the value. + /// + /// true if this instance can convert the specified value type; otherwise, false. + /// + public override bool CanConvert(Type valueType) + { +#if !NET20 + if (typeof(XObject).IsAssignableFrom(valueType)) + { + return true; + } +#endif +#if !(DOTNET || PORTABLE) + if (typeof(XmlNode).IsAssignableFrom(valueType)) + { + return true; + } +#endif + + return false; + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/DateFormatHandling.cs b/Common/00-1Json8.3/Json8.3/DateFormatHandling.cs new file mode 100644 index 0000000..e26feec --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/DateFormatHandling.cs @@ -0,0 +1,43 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +namespace Newtonsoft.Json +{ + /// + /// Specifies how dates are formatted when writing JSON text. + /// + public enum DateFormatHandling + { + /// + /// Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + /// + IsoDateFormat, + + /// + /// Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + /// + MicrosoftDateFormat + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/DateParseHandling.cs b/Common/00-1Json8.3/Json8.3/DateParseHandling.cs new file mode 100644 index 0000000..359ac35 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/DateParseHandling.cs @@ -0,0 +1,49 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +namespace Newtonsoft.Json +{ + /// + /// Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + /// + public enum DateParseHandling + { + /// + /// Date formatted strings are not parsed to a date type and are read as strings. + /// + None = 0, + + /// + /// Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + /// + DateTime = 1, +#if !NET20 + /// + /// Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + /// + DateTimeOffset = 2 +#endif + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/DateTimeZoneHandling.cs b/Common/00-1Json8.3/Json8.3/DateTimeZoneHandling.cs new file mode 100644 index 0000000..9877d6e --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/DateTimeZoneHandling.cs @@ -0,0 +1,56 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json +{ + /// + /// Specifies how to treat the time value when converting between string and . + /// + public enum DateTimeZoneHandling + { + /// + /// Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + /// + Local = 0, + + /// + /// Treat as a UTC. If the object represents a local time, it is converted to a UTC. + /// + Utc = 1, + + /// + /// Treat as a local time if a is being converted to a string. + /// If a string is being converted to , convert to a local time if a time zone is specified. + /// + Unspecified = 2, + + /// + /// Time zone information should be preserved when converting. + /// + RoundtripKind = 3 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/DefaultValueHandling.cs b/Common/00-1Json8.3/Json8.3/DefaultValueHandling.cs new file mode 100644 index 0000000..a63adf9 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/DefaultValueHandling.cs @@ -0,0 +1,67 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.ComponentModel; + +namespace Newtonsoft.Json +{ + /// + /// Specifies default value handling options for the . + /// + /// + /// + /// + /// + [Flags] + public enum DefaultValueHandling + { + /// + /// Include members where the member value is the same as the member's default value when serializing objects. + /// Included members are written to JSON. Has no effect when deserializing. + /// + Include = 0, + + /// + /// Ignore members where the member value is the same as the member's default value when serializing objects + /// so that is is not written to JSON. + /// This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + /// decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + /// placing the on the property. + /// + Ignore = 1, + + /// + /// Members with a default value but no JSON will be set to their default value when deserializing. + /// + Populate = 2, + + /// + /// Ignore members where the member value is the same as the member's default value when serializing objects + /// and sets members to their default value when deserializing. + /// + IgnoreAndPopulate = Ignore | Populate + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/FloatFormatHandling.cs b/Common/00-1Json8.3/Json8.3/FloatFormatHandling.cs new file mode 100644 index 0000000..1c7f424 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/FloatFormatHandling.cs @@ -0,0 +1,50 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +namespace Newtonsoft.Json +{ + /// + /// Specifies float format handling options when writing special floating point numbers, e.g. , + /// and with . + /// + public enum FloatFormatHandling + { + /// + /// Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + /// + String = 0, + + /// + /// Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + /// Note that this will produce non-valid JSON. + /// + Symbol = 1, + + /// + /// Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a property. + /// + DefaultValue = 2 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/FloatParseHandling.cs b/Common/00-1Json8.3/Json8.3/FloatParseHandling.cs new file mode 100644 index 0000000..3058394 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/FloatParseHandling.cs @@ -0,0 +1,43 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +namespace Newtonsoft.Json +{ + /// + /// Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + /// + public enum FloatParseHandling + { + /// + /// Floating point numbers are parsed to . + /// + Double = 0, + + /// + /// Floating point numbers are parsed to . + /// + Decimal = 1 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Formatting.cs b/Common/00-1Json8.3/Json8.3/Formatting.cs new file mode 100644 index 0000000..9438e63 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Formatting.cs @@ -0,0 +1,43 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +namespace Newtonsoft.Json +{ + /// + /// Specifies formatting options for the . + /// + public enum Formatting + { + /// + /// No special formatting is applied. This is the default. + /// + None = 0, + + /// + /// Causes child objects to be indented according to the and settings. + /// + Indented = 1 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/IArrayPool.cs b/Common/00-1Json8.3/Json8.3/IArrayPool.cs new file mode 100644 index 0000000..3d5037e --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/IArrayPool.cs @@ -0,0 +1,22 @@ +namespace Newtonsoft.Json +{ + /// + /// Provides an interface for using pooled arrays. + /// + /// The array type content. + public interface IArrayPool + { + /// + /// Rent a array from the pool. This array must be returned when it is no longer needed. + /// + /// The minimum required length of the array. The returned array may be longer. + /// The rented array from the pool. This array must be returned when it is no longer needed. + T[] Rent(int minimumLength); + + /// + /// Return an array to the pool. + /// + /// The array that is being returned. + void Return(T[] array); + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/IJsonLineInfo.cs b/Common/00-1Json8.3/Json8.3/IJsonLineInfo.cs new file mode 100644 index 0000000..b71aedf --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/IJsonLineInfo.cs @@ -0,0 +1,53 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +namespace Newtonsoft.Json +{ + /// + /// Provides an interface to enable a class to return line and position information. + /// + public interface IJsonLineInfo + { + /// + /// Gets a value indicating whether the class can return line information. + /// + /// + /// true if LineNumber and LinePosition can be provided; otherwise, false. + /// + bool HasLineInfo(); + + /// + /// Gets the current line number. + /// + /// The current line number or 0 if no line information is available (for example, HasLineInfo returns false). + int LineNumber { get; } + + /// + /// Gets the current line position. + /// + /// The current line position or 0 if no line information is available (for example, HasLineInfo returns false). + int LinePosition { get; } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonArrayAttribute.cs b/Common/00-1Json8.3/Json8.3/JsonArrayAttribute.cs new file mode 100644 index 0000000..bbfc90d --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonArrayAttribute.cs @@ -0,0 +1,73 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json +{ + /// + /// Instructs the how to serialize the collection. + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] + public sealed class JsonArrayAttribute : JsonContainerAttribute + { + private bool _allowNullItems; + + /// + /// Gets or sets a value indicating whether null items are allowed in the collection. + /// + /// true if null items are allowed in the collection; otherwise, false. + public bool AllowNullItems + { + get { return _allowNullItems; } + set { _allowNullItems = value; } + } + + /// + /// Initializes a new instance of the class. + /// + public JsonArrayAttribute() + { + } + + /// + /// Initializes a new instance of the class with a flag indicating whether the array can contain null items + /// + /// A flag indicating whether the array can contain null items. + public JsonArrayAttribute(bool allowNullItems) + { + _allowNullItems = allowNullItems; + } + + /// + /// Initializes a new instance of the class with the specified container Id. + /// + /// The container Id. + public JsonArrayAttribute(string id) + : base(id) + { + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonConstructorAttribute.cs b/Common/00-1Json8.3/Json8.3/JsonConstructorAttribute.cs new file mode 100644 index 0000000..cd5d1bb --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonConstructorAttribute.cs @@ -0,0 +1,37 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json +{ + /// + /// Instructs the to use the specified constructor when deserializing that object. + /// + [AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false)] + public sealed class JsonConstructorAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonContainerAttribute.cs b/Common/00-1Json8.3/Json8.3/JsonContainerAttribute.cs new file mode 100644 index 0000000..cfc1b58 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonContainerAttribute.cs @@ -0,0 +1,138 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json +{ + /// + /// Instructs the how to serialize the object. + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] + public abstract class JsonContainerAttribute : Attribute + { + /// + /// Gets or sets the id. + /// + /// The id. + public string Id { get; set; } + + /// + /// Gets or sets the title. + /// + /// The title. + public string Title { get; set; } + + /// + /// Gets or sets the description. + /// + /// The description. + public string Description { get; set; } + + /// + /// Gets the collection's items converter. + /// + /// The collection's items converter. + public Type ItemConverterType { get; set; } + + /// + /// The parameter list to use when constructing the JsonConverter described by ItemConverterType. + /// If null, the default constructor is used. + /// When non-null, there must be a constructor defined in the JsonConverter that exactly matches the number, + /// order, and type of these parameters. + /// + /// + /// [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + /// + public object[] ItemConverterParameters { get; set; } + + // yuck. can't set nullable properties on an attribute in C# + // have to use this approach to get an unset default state + internal bool? _isReference; + internal bool? _itemIsReference; + internal ReferenceLoopHandling? _itemReferenceLoopHandling; + internal TypeNameHandling? _itemTypeNameHandling; + + /// + /// Gets or sets a value that indicates whether to preserve object references. + /// + /// + /// true to keep object reference; otherwise, false. The default is false. + /// + public bool IsReference + { + get { return _isReference ?? default(bool); } + set { _isReference = value; } + } + + /// + /// Gets or sets a value that indicates whether to preserve collection's items references. + /// + /// + /// true to keep collection's items object references; otherwise, false. The default is false. + /// + public bool ItemIsReference + { + get { return _itemIsReference ?? default(bool); } + set { _itemIsReference = value; } + } + + /// + /// Gets or sets the reference loop handling used when serializing the collection's items. + /// + /// The reference loop handling. + public ReferenceLoopHandling ItemReferenceLoopHandling + { + get { return _itemReferenceLoopHandling ?? default(ReferenceLoopHandling); } + set { _itemReferenceLoopHandling = value; } + } + + /// + /// Gets or sets the type name handling used when serializing the collection's items. + /// + /// The type name handling. + public TypeNameHandling ItemTypeNameHandling + { + get { return _itemTypeNameHandling ?? default(TypeNameHandling); } + set { _itemTypeNameHandling = value; } + } + + /// + /// Initializes a new instance of the class. + /// + protected JsonContainerAttribute() + { + } + + /// + /// Initializes a new instance of the class with the specified container Id. + /// + /// The container Id. + protected JsonContainerAttribute(string id) + { + Id = id; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonConvert.cs b/Common/00-1Json8.3/Json8.3/JsonConvert.cs new file mode 100644 index 0000000..e1021b4 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonConvert.cs @@ -0,0 +1,1153 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.IO; +using System.Globalization; +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) +using System.Numerics; +#endif +#if !(NET20 || NET35 || PORTABLE40) +using System.Threading.Tasks; +#endif +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Utilities; +using System.Xml; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Serialization; +using System.Text; +#if !(NET20 || PORTABLE40) +using System.Xml.Linq; + +#endif + +namespace Newtonsoft.Json +{ + /// + /// Provides methods for converting between common language runtime types and JSON types. + /// + /// + /// + /// + public static class JsonConvert + { + /// + /// Gets or sets a function that creates default . + /// Default settings are automatically used by serialization methods on , + /// and and on . + /// To serialize without using any default settings create a with + /// . + /// + public static Func DefaultSettings { get; set; } + + /// + /// Represents JavaScript's boolean value true as a string. This field is read-only. + /// + public static readonly string True = "true"; + + /// + /// Represents JavaScript's boolean value false as a string. This field is read-only. + /// + public static readonly string False = "false"; + + /// + /// Represents JavaScript's null as a string. This field is read-only. + /// + public static readonly string Null = "null"; + + /// + /// Represents JavaScript's undefined as a string. This field is read-only. + /// + public static readonly string Undefined = "undefined"; + + /// + /// Represents JavaScript's positive infinity as a string. This field is read-only. + /// + public static readonly string PositiveInfinity = "Infinity"; + + /// + /// Represents JavaScript's negative infinity as a string. This field is read-only. + /// + public static readonly string NegativeInfinity = "-Infinity"; + + /// + /// Represents JavaScript's NaN as a string. This field is read-only. + /// + public static readonly string NaN = "NaN"; + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + public static string ToString(DateTime value) + { + return ToString(value, DateFormatHandling.IsoDateFormat, DateTimeZoneHandling.RoundtripKind); + } + + /// + /// Converts the to its JSON string representation using the specified. + /// + /// The value to convert. + /// The format the date will be converted to. + /// The time zone handling when the date is converted to a string. + /// A JSON string representation of the . + public static string ToString(DateTime value, DateFormatHandling format, DateTimeZoneHandling timeZoneHandling) + { + DateTime updatedDateTime = DateTimeUtils.EnsureDateTime(value, timeZoneHandling); + + using (StringWriter writer = StringUtils.CreateStringWriter(64)) + { + writer.Write('"'); + DateTimeUtils.WriteDateTimeString(writer, updatedDateTime, format, null, CultureInfo.InvariantCulture); + writer.Write('"'); + return writer.ToString(); + } + } + +#if !NET20 + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + public static string ToString(DateTimeOffset value) + { + return ToString(value, DateFormatHandling.IsoDateFormat); + } + + /// + /// Converts the to its JSON string representation using the specified. + /// + /// The value to convert. + /// The format the date will be converted to. + /// A JSON string representation of the . + public static string ToString(DateTimeOffset value, DateFormatHandling format) + { + using (StringWriter writer = StringUtils.CreateStringWriter(64)) + { + writer.Write('"'); + DateTimeUtils.WriteDateTimeOffsetString(writer, value, format, null, CultureInfo.InvariantCulture); + writer.Write('"'); + return writer.ToString(); + } + } +#endif + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + public static string ToString(bool value) + { + return (value) ? True : False; + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + public static string ToString(char value) + { + return ToString(char.ToString(value)); + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + public static string ToString(Enum value) + { + return value.ToString("D"); + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + public static string ToString(int value) + { + return value.ToString(null, CultureInfo.InvariantCulture); + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + public static string ToString(short value) + { + return value.ToString(null, CultureInfo.InvariantCulture); + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + [CLSCompliant(false)] + public static string ToString(ushort value) + { + return value.ToString(null, CultureInfo.InvariantCulture); + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + [CLSCompliant(false)] + public static string ToString(uint value) + { + return value.ToString(null, CultureInfo.InvariantCulture); + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + public static string ToString(long value) + { + return value.ToString(null, CultureInfo.InvariantCulture); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + private static string ToStringInternal(BigInteger value) + { + return value.ToString(null, CultureInfo.InvariantCulture); + } +#endif + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + [CLSCompliant(false)] + public static string ToString(ulong value) + { + return value.ToString(null, CultureInfo.InvariantCulture); + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + public static string ToString(float value) + { + return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)); + } + + internal static string ToString(float value, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) + { + return EnsureFloatFormat(value, EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)), floatFormatHandling, quoteChar, nullable); + } + + private static string EnsureFloatFormat(double value, string text, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) + { + if (floatFormatHandling == FloatFormatHandling.Symbol || !(double.IsInfinity(value) || double.IsNaN(value))) + { + return text; + } + + if (floatFormatHandling == FloatFormatHandling.DefaultValue) + { + return (!nullable) ? "0.0" : Null; + } + + return quoteChar + text + quoteChar; + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + public static string ToString(double value) + { + return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)); + } + + internal static string ToString(double value, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) + { + return EnsureFloatFormat(value, EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)), floatFormatHandling, quoteChar, nullable); + } + + private static string EnsureDecimalPlace(double value, string text) + { + if (double.IsNaN(value) || double.IsInfinity(value) || text.IndexOf('.') != -1 || text.IndexOf('E') != -1 || text.IndexOf('e') != -1) + { + return text; + } + + return text + ".0"; + } + + private static string EnsureDecimalPlace(string text) + { + if (text.IndexOf('.') != -1) + { + return text; + } + + return text + ".0"; + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + public static string ToString(byte value) + { + return value.ToString(null, CultureInfo.InvariantCulture); + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + [CLSCompliant(false)] + public static string ToString(sbyte value) + { + return value.ToString(null, CultureInfo.InvariantCulture); + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + public static string ToString(decimal value) + { + return EnsureDecimalPlace(value.ToString(null, CultureInfo.InvariantCulture)); + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + public static string ToString(Guid value) + { + return ToString(value, '"'); + } + + internal static string ToString(Guid value, char quoteChar) + { + string text; + string qc; +#if !(DOTNET || PORTABLE40 || PORTABLE) + text = value.ToString("D", CultureInfo.InvariantCulture); + qc = quoteChar.ToString(CultureInfo.InvariantCulture); +#else + text = value.ToString("D"); + qc = quoteChar.ToString(); +#endif + + return qc + text + qc; + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + public static string ToString(TimeSpan value) + { + return ToString(value, '"'); + } + + internal static string ToString(TimeSpan value, char quoteChar) + { + return ToString(value.ToString(), quoteChar); + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + public static string ToString(Uri value) + { + if (value == null) + { + return Null; + } + + return ToString(value, '"'); + } + + internal static string ToString(Uri value, char quoteChar) + { + return ToString(value.OriginalString, quoteChar); + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + public static string ToString(string value) + { + return ToString(value, '"'); + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// The string delimiter character. + /// A JSON string representation of the . + public static string ToString(string value, char delimiter) + { + return ToString(value, delimiter, StringEscapeHandling.Default); + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// The string delimiter character. + /// The string escape handling. + /// A JSON string representation of the . + public static string ToString(string value, char delimiter, StringEscapeHandling stringEscapeHandling) + { + if (delimiter != '"' && delimiter != '\'') + { + throw new ArgumentException("Delimiter must be a single or double quote.", nameof(delimiter)); + } + + return JavaScriptUtils.ToEscapedJavaScriptString(value, delimiter, true, stringEscapeHandling); + } + + /// + /// Converts the to its JSON string representation. + /// + /// The value to convert. + /// A JSON string representation of the . + public static string ToString(object value) + { + if (value == null) + { + return Null; + } + + PrimitiveTypeCode typeCode = ConvertUtils.GetTypeCode(value.GetType()); + + switch (typeCode) + { + case PrimitiveTypeCode.String: + return ToString((string)value); + case PrimitiveTypeCode.Char: + return ToString((char)value); + case PrimitiveTypeCode.Boolean: + return ToString((bool)value); + case PrimitiveTypeCode.SByte: + return ToString((sbyte)value); + case PrimitiveTypeCode.Int16: + return ToString((short)value); + case PrimitiveTypeCode.UInt16: + return ToString((ushort)value); + case PrimitiveTypeCode.Int32: + return ToString((int)value); + case PrimitiveTypeCode.Byte: + return ToString((byte)value); + case PrimitiveTypeCode.UInt32: + return ToString((uint)value); + case PrimitiveTypeCode.Int64: + return ToString((long)value); + case PrimitiveTypeCode.UInt64: + return ToString((ulong)value); + case PrimitiveTypeCode.Single: + return ToString((float)value); + case PrimitiveTypeCode.Double: + return ToString((double)value); + case PrimitiveTypeCode.DateTime: + return ToString((DateTime)value); + case PrimitiveTypeCode.Decimal: + return ToString((decimal)value); +#if !(DOTNET || PORTABLE) + case PrimitiveTypeCode.DBNull: + return Null; +#endif +#if !NET20 + case PrimitiveTypeCode.DateTimeOffset: + return ToString((DateTimeOffset)value); +#endif + case PrimitiveTypeCode.Guid: + return ToString((Guid)value); + case PrimitiveTypeCode.Uri: + return ToString((Uri)value); + case PrimitiveTypeCode.TimeSpan: + return ToString((TimeSpan)value); +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + case PrimitiveTypeCode.BigInteger: + return ToStringInternal((BigInteger)value); +#endif + } + + throw new ArgumentException("Unsupported type: {0}. Use the JsonSerializer class to get the object's JSON representation.".FormatWith(CultureInfo.InvariantCulture, value.GetType())); + } + + #region Serialize + /// + /// Serializes the specified object to a JSON string. + /// + /// The object to serialize. + /// A JSON string representation of the object. + public static string SerializeObject(object value) + { + return SerializeObject(value, null, (JsonSerializerSettings)null); + } + + /// + /// Serializes the specified object to a JSON string using formatting. + /// + /// The object to serialize. + /// Indicates how the output is formatted. + /// + /// A JSON string representation of the object. + /// + public static string SerializeObject(object value, Formatting formatting) + { + return SerializeObject(value, formatting, (JsonSerializerSettings)null); + } + + /// + /// Serializes the specified object to a JSON string using a collection of . + /// + /// The object to serialize. + /// A collection converters used while serializing. + /// A JSON string representation of the object. + public static string SerializeObject(object value, params JsonConverter[] converters) + { + JsonSerializerSettings settings = (converters != null && converters.Length > 0) + ? new JsonSerializerSettings { Converters = converters } + : null; + + return SerializeObject(value, null, settings); + } + + /// + /// Serializes the specified object to a JSON string using formatting and a collection of . + /// + /// The object to serialize. + /// Indicates how the output is formatted. + /// A collection converters used while serializing. + /// A JSON string representation of the object. + public static string SerializeObject(object value, Formatting formatting, params JsonConverter[] converters) + { + JsonSerializerSettings settings = (converters != null && converters.Length > 0) + ? new JsonSerializerSettings { Converters = converters } + : null; + + return SerializeObject(value, null, formatting, settings); + } + + /// + /// Serializes the specified object to a JSON string using . + /// + /// The object to serialize. + /// The used to serialize the object. + /// If this is null, default serialization settings will be used. + /// + /// A JSON string representation of the object. + /// + public static string SerializeObject(object value, JsonSerializerSettings settings) + { + return SerializeObject(value, null, settings); + } + + /// + /// Serializes the specified object to a JSON string using a type, formatting and . + /// + /// The object to serialize. + /// The used to serialize the object. + /// If this is null, default serialization settings will be used. + /// + /// The type of the value being serialized. + /// This parameter is used when is Auto to write out the type name if the type of the value does not match. + /// Specifing the type is optional. + /// + /// + /// A JSON string representation of the object. + /// + public static string SerializeObject(object value, Type type, JsonSerializerSettings settings) + { + JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); + + return SerializeObjectInternal(value, type, jsonSerializer); + } + + /// + /// Serializes the specified object to a JSON string using formatting and . + /// + /// The object to serialize. + /// Indicates how the output is formatted. + /// The used to serialize the object. + /// If this is null, default serialization settings will be used. + /// + /// A JSON string representation of the object. + /// + public static string SerializeObject(object value, Formatting formatting, JsonSerializerSettings settings) + { + return SerializeObject(value, null, formatting, settings); + } + + /// + /// Serializes the specified object to a JSON string using a type, formatting and . + /// + /// The object to serialize. + /// Indicates how the output is formatted. + /// The used to serialize the object. + /// If this is null, default serialization settings will be used. + /// + /// The type of the value being serialized. + /// This parameter is used when is Auto to write out the type name if the type of the value does not match. + /// Specifing the type is optional. + /// + /// + /// A JSON string representation of the object. + /// + public static string SerializeObject(object value, Type type, Formatting formatting, JsonSerializerSettings settings) + { + JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); + jsonSerializer.Formatting = formatting; + + return SerializeObjectInternal(value, type, jsonSerializer); + } + + private static string SerializeObjectInternal(object value, Type type, JsonSerializer jsonSerializer) + { + StringBuilder sb = new StringBuilder(256); + StringWriter sw = new StringWriter(sb, CultureInfo.InvariantCulture); + using (JsonTextWriter jsonWriter = new JsonTextWriter(sw)) + { + jsonWriter.Formatting = jsonSerializer.Formatting; + + jsonSerializer.Serialize(jsonWriter, value, type); + } + + return sw.ToString(); + } + +#if !(NET20 || NET35 || PORTABLE40) + /// + /// Asynchronously serializes the specified object to a JSON string. + /// Serialization will happen on a new thread. + /// + /// The object to serialize. + /// + /// A task that represents the asynchronous serialize operation. The value of the TResult parameter contains a JSON string representation of the object. + /// + [ObsoleteAttribute("SerializeObjectAsync is obsolete. Use the Task.Factory.StartNew method to serialize JSON asynchronously: Task.Factory.StartNew(() => JsonConvert.SerializeObject(value))")] + public static Task SerializeObjectAsync(object value) + { + return SerializeObjectAsync(value, Formatting.None, null); + } + + /// + /// Asynchronously serializes the specified object to a JSON string using formatting. + /// Serialization will happen on a new thread. + /// + /// The object to serialize. + /// Indicates how the output is formatted. + /// + /// A task that represents the asynchronous serialize operation. The value of the TResult parameter contains a JSON string representation of the object. + /// + [ObsoleteAttribute("SerializeObjectAsync is obsolete. Use the Task.Factory.StartNew method to serialize JSON asynchronously: Task.Factory.StartNew(() => JsonConvert.SerializeObject(value, formatting))")] + public static Task SerializeObjectAsync(object value, Formatting formatting) + { + return SerializeObjectAsync(value, formatting, null); + } + + /// + /// Asynchronously serializes the specified object to a JSON string using formatting and a collection of . + /// Serialization will happen on a new thread. + /// + /// The object to serialize. + /// Indicates how the output is formatted. + /// The used to serialize the object. + /// If this is null, default serialization settings will be used. + /// + /// A task that represents the asynchronous serialize operation. The value of the TResult parameter contains a JSON string representation of the object. + /// + [ObsoleteAttribute("SerializeObjectAsync is obsolete. Use the Task.Factory.StartNew method to serialize JSON asynchronously: Task.Factory.StartNew(() => JsonConvert.SerializeObject(value, formatting, settings))")] + public static Task SerializeObjectAsync(object value, Formatting formatting, JsonSerializerSettings settings) + { + return Task.Factory.StartNew(() => SerializeObject(value, formatting, settings)); + } +#endif + #endregion + + #region Deserialize + /// + /// Deserializes the JSON to a .NET object. + /// + /// The JSON to deserialize. + /// The deserialized object from the JSON string. + public static object DeserializeObject(string value) + { + return DeserializeObject(value, null, (JsonSerializerSettings)null); + } + + /// + /// Deserializes the JSON to a .NET object using . + /// + /// The JSON to deserialize. + /// + /// The used to deserialize the object. + /// If this is null, default serialization settings will be used. + /// + /// The deserialized object from the JSON string. + public static object DeserializeObject(string value, JsonSerializerSettings settings) + { + return DeserializeObject(value, null, settings); + } + + /// + /// Deserializes the JSON to the specified .NET type. + /// + /// The JSON to deserialize. + /// The of object being deserialized. + /// The deserialized object from the JSON string. + public static object DeserializeObject(string value, Type type) + { + return DeserializeObject(value, type, (JsonSerializerSettings)null); + } + + /// + /// Deserializes the JSON to the specified .NET type. + /// + /// The type of the object to deserialize to. + /// The JSON to deserialize. + /// The deserialized object from the JSON string. + public static T DeserializeObject(string value) + { + return DeserializeObject(value, (JsonSerializerSettings)null); + } + + /// + /// Deserializes the JSON to the given anonymous type. + /// + /// + /// The anonymous type to deserialize to. This can't be specified + /// traditionally and must be infered from the anonymous type passed + /// as a parameter. + /// + /// The JSON to deserialize. + /// The anonymous type object. + /// The deserialized anonymous type from the JSON string. + public static T DeserializeAnonymousType(string value, T anonymousTypeObject) + { + return DeserializeObject(value); + } + + /// + /// Deserializes the JSON to the given anonymous type using . + /// + /// + /// The anonymous type to deserialize to. This can't be specified + /// traditionally and must be infered from the anonymous type passed + /// as a parameter. + /// + /// The JSON to deserialize. + /// The anonymous type object. + /// + /// The used to deserialize the object. + /// If this is null, default serialization settings will be used. + /// + /// The deserialized anonymous type from the JSON string. + public static T DeserializeAnonymousType(string value, T anonymousTypeObject, JsonSerializerSettings settings) + { + return DeserializeObject(value, settings); + } + + /// + /// Deserializes the JSON to the specified .NET type using a collection of . + /// + /// The type of the object to deserialize to. + /// The JSON to deserialize. + /// Converters to use while deserializing. + /// The deserialized object from the JSON string. + public static T DeserializeObject(string value, params JsonConverter[] converters) + { + return (T)DeserializeObject(value, typeof(T), converters); + } + + /// + /// Deserializes the JSON to the specified .NET type using . + /// + /// The type of the object to deserialize to. + /// The object to deserialize. + /// + /// The used to deserialize the object. + /// If this is null, default serialization settings will be used. + /// + /// The deserialized object from the JSON string. + public static T DeserializeObject(string value, JsonSerializerSettings settings) + { + return (T)DeserializeObject(value, typeof(T), settings); + } + + /// + /// Deserializes the JSON to the specified .NET type using a collection of . + /// + /// The JSON to deserialize. + /// The type of the object to deserialize. + /// Converters to use while deserializing. + /// The deserialized object from the JSON string. + public static object DeserializeObject(string value, Type type, params JsonConverter[] converters) + { + JsonSerializerSettings settings = (converters != null && converters.Length > 0) + ? new JsonSerializerSettings { Converters = converters } + : null; + + return DeserializeObject(value, type, settings); + } + + /// + /// Deserializes the JSON to the specified .NET type using . + /// + /// The JSON to deserialize. + /// The type of the object to deserialize to. + /// + /// The used to deserialize the object. + /// If this is null, default serialization settings will be used. + /// + /// The deserialized object from the JSON string. + public static object DeserializeObject(string value, Type type, JsonSerializerSettings settings) + { + ValidationUtils.ArgumentNotNull(value, nameof(value)); + + JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); + + // by default DeserializeObject should check for additional content + if (!jsonSerializer.IsCheckAdditionalContentSet()) + { + jsonSerializer.CheckAdditionalContent = true; + } + + using (var reader = new JsonTextReader(new StringReader(value))) + { + return jsonSerializer.Deserialize(reader, type); + } + } + +#if !(NET20 || NET35 || PORTABLE40) + /// + /// Asynchronously deserializes the JSON to the specified .NET type. + /// Deserialization will happen on a new thread. + /// + /// The type of the object to deserialize to. + /// The JSON to deserialize. + /// + /// A task that represents the asynchronous deserialize operation. The value of the TResult parameter contains the deserialized object from the JSON string. + /// + [ObsoleteAttribute("DeserializeObjectAsync is obsolete. Use the Task.Factory.StartNew method to deserialize JSON asynchronously: Task.Factory.StartNew(() => JsonConvert.DeserializeObject(value))")] + public static Task DeserializeObjectAsync(string value) + { + return DeserializeObjectAsync(value, null); + } + + /// + /// Asynchronously deserializes the JSON to the specified .NET type using . + /// Deserialization will happen on a new thread. + /// + /// The type of the object to deserialize to. + /// The JSON to deserialize. + /// + /// The used to deserialize the object. + /// If this is null, default serialization settings will be used. + /// + /// + /// A task that represents the asynchronous deserialize operation. The value of the TResult parameter contains the deserialized object from the JSON string. + /// + [ObsoleteAttribute("DeserializeObjectAsync is obsolete. Use the Task.Factory.StartNew method to deserialize JSON asynchronously: Task.Factory.StartNew(() => JsonConvert.DeserializeObject(value, settings))")] + public static Task DeserializeObjectAsync(string value, JsonSerializerSettings settings) + { + return Task.Factory.StartNew(() => DeserializeObject(value, settings)); + } + + /// + /// Asynchronously deserializes the JSON to the specified .NET type. + /// Deserialization will happen on a new thread. + /// + /// The JSON to deserialize. + /// + /// A task that represents the asynchronous deserialize operation. The value of the TResult parameter contains the deserialized object from the JSON string. + /// + [ObsoleteAttribute("DeserializeObjectAsync is obsolete. Use the Task.Factory.StartNew method to deserialize JSON asynchronously: Task.Factory.StartNew(() => JsonConvert.DeserializeObject(value))")] + public static Task DeserializeObjectAsync(string value) + { + return DeserializeObjectAsync(value, null, null); + } + + /// + /// Asynchronously deserializes the JSON to the specified .NET type using . + /// Deserialization will happen on a new thread. + /// + /// The JSON to deserialize. + /// The type of the object to deserialize to. + /// + /// The used to deserialize the object. + /// If this is null, default serialization settings will be used. + /// + /// + /// A task that represents the asynchronous deserialize operation. The value of the TResult parameter contains the deserialized object from the JSON string. + /// + [ObsoleteAttribute("DeserializeObjectAsync is obsolete. Use the Task.Factory.StartNew method to deserialize JSON asynchronously: Task.Factory.StartNew(() => JsonConvert.DeserializeObject(value, type, settings))")] + public static Task DeserializeObjectAsync(string value, Type type, JsonSerializerSettings settings) + { + return Task.Factory.StartNew(() => DeserializeObject(value, type, settings)); + } +#endif + #endregion + + #region Populate + /// + /// Populates the object with values from the JSON string. + /// + /// The JSON to populate values from. + /// The target object to populate values onto. + public static void PopulateObject(string value, object target) + { + PopulateObject(value, target, null); + } + + /// + /// Populates the object with values from the JSON string using . + /// + /// The JSON to populate values from. + /// The target object to populate values onto. + /// + /// The used to deserialize the object. + /// If this is null, default serialization settings will be used. + /// + public static void PopulateObject(string value, object target, JsonSerializerSettings settings) + { + JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); + + using (JsonReader jsonReader = new JsonTextReader(new StringReader(value))) + { + jsonSerializer.Populate(jsonReader, target); + + if (jsonReader.Read() && jsonReader.TokenType != JsonToken.Comment) + { + throw new JsonSerializationException("Additional text found in JSON string after finishing deserializing object."); + } + } + } + +#if !(NET20 || NET35 || PORTABLE40) + /// + /// Asynchronously populates the object with values from the JSON string using . + /// + /// The JSON to populate values from. + /// The target object to populate values onto. + /// + /// The used to deserialize the object. + /// If this is null, default serialization settings will be used. + /// + /// + /// A task that represents the asynchronous populate operation. + /// + [ObsoleteAttribute("PopulateObjectAsync is obsolete. Use the Task.Factory.StartNew method to populate an object with JSON values asynchronously: Task.Factory.StartNew(() => JsonConvert.PopulateObject(value, target, settings))")] + public static Task PopulateObjectAsync(string value, object target, JsonSerializerSettings settings) + { + return Task.Factory.StartNew(() => PopulateObject(value, target, settings)); + } +#endif + #endregion + + #region Xml +#if !(PORTABLE40 || PORTABLE || DOTNET) + /// + /// Serializes the XML node to a JSON string. + /// + /// The node to serialize. + /// A JSON string of the XmlNode. + public static string SerializeXmlNode(XmlNode node) + { + return SerializeXmlNode(node, Formatting.None); + } + + /// + /// Serializes the XML node to a JSON string using formatting. + /// + /// The node to serialize. + /// Indicates how the output is formatted. + /// A JSON string of the XmlNode. + public static string SerializeXmlNode(XmlNode node, Formatting formatting) + { + XmlNodeConverter converter = new XmlNodeConverter(); + + return SerializeObject(node, formatting, converter); + } + + /// + /// Serializes the XML node to a JSON string using formatting and omits the root object if is true. + /// + /// The node to serialize. + /// Indicates how the output is formatted. + /// Omits writing the root object. + /// A JSON string of the XmlNode. + public static string SerializeXmlNode(XmlNode node, Formatting formatting, bool omitRootObject) + { + XmlNodeConverter converter = new XmlNodeConverter { OmitRootObject = omitRootObject }; + + return SerializeObject(node, formatting, converter); + } + + /// + /// Deserializes the XmlNode from a JSON string. + /// + /// The JSON string. + /// The deserialized XmlNode + public static XmlDocument DeserializeXmlNode(string value) + { + return DeserializeXmlNode(value, null); + } + + /// + /// Deserializes the XmlNode from a JSON string nested in a root elment specified by . + /// + /// The JSON string. + /// The name of the root element to append when deserializing. + /// The deserialized XmlNode + public static XmlDocument DeserializeXmlNode(string value, string deserializeRootElementName) + { + return DeserializeXmlNode(value, deserializeRootElementName, false); + } + + /// + /// Deserializes the XmlNode from a JSON string nested in a root elment specified by + /// and writes a .NET array attribute for collections. + /// + /// The JSON string. + /// The name of the root element to append when deserializing. + /// + /// A flag to indicate whether to write the Json.NET array attribute. + /// This attribute helps preserve arrays when converting the written XML back to JSON. + /// + /// The deserialized XmlNode + public static XmlDocument DeserializeXmlNode(string value, string deserializeRootElementName, bool writeArrayAttribute) + { + XmlNodeConverter converter = new XmlNodeConverter(); + converter.DeserializeRootElementName = deserializeRootElementName; + converter.WriteArrayAttribute = writeArrayAttribute; + + return (XmlDocument)DeserializeObject(value, typeof(XmlDocument), converter); + } +#endif + +#if !NET20 && !PORTABLE40 + /// + /// Serializes the to a JSON string. + /// + /// The node to convert to JSON. + /// A JSON string of the XNode. + public static string SerializeXNode(XObject node) + { + return SerializeXNode(node, Formatting.None); + } + + /// + /// Serializes the to a JSON string using formatting. + /// + /// The node to convert to JSON. + /// Indicates how the output is formatted. + /// A JSON string of the XNode. + public static string SerializeXNode(XObject node, Formatting formatting) + { + return SerializeXNode(node, formatting, false); + } + + /// + /// Serializes the to a JSON string using formatting and omits the root object if is true. + /// + /// The node to serialize. + /// Indicates how the output is formatted. + /// Omits writing the root object. + /// A JSON string of the XNode. + public static string SerializeXNode(XObject node, Formatting formatting, bool omitRootObject) + { + XmlNodeConverter converter = new XmlNodeConverter { OmitRootObject = omitRootObject }; + + return SerializeObject(node, formatting, converter); + } + + /// + /// Deserializes the from a JSON string. + /// + /// The JSON string. + /// The deserialized XNode + public static XDocument DeserializeXNode(string value) + { + return DeserializeXNode(value, null); + } + + /// + /// Deserializes the from a JSON string nested in a root elment specified by . + /// + /// The JSON string. + /// The name of the root element to append when deserializing. + /// The deserialized XNode + public static XDocument DeserializeXNode(string value, string deserializeRootElementName) + { + return DeserializeXNode(value, deserializeRootElementName, false); + } + + /// + /// Deserializes the from a JSON string nested in a root elment specified by + /// and writes a .NET array attribute for collections. + /// + /// The JSON string. + /// The name of the root element to append when deserializing. + /// + /// A flag to indicate whether to write the Json.NET array attribute. + /// This attribute helps preserve arrays when converting the written XML back to JSON. + /// + /// The deserialized XNode + public static XDocument DeserializeXNode(string value, string deserializeRootElementName, bool writeArrayAttribute) + { + XmlNodeConverter converter = new XmlNodeConverter(); + converter.DeserializeRootElementName = deserializeRootElementName; + converter.WriteArrayAttribute = writeArrayAttribute; + + return (XDocument)DeserializeObject(value, typeof(XDocument), converter); + } +#endif + #endregion + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonConverter.cs b/Common/00-1Json8.3/Json8.3/JsonConverter.cs new file mode 100644 index 0000000..a973d38 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonConverter.cs @@ -0,0 +1,99 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Text; +using Newtonsoft.Json.Utilities; +using Newtonsoft.Json.Schema; + +namespace Newtonsoft.Json +{ + /// + /// Converts an object to and from JSON. + /// + public abstract class JsonConverter + { + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The value. + /// The calling serializer. + public abstract void WriteJson(JsonWriter writer, object value, JsonSerializer serializer); + + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing value of object being read. + /// The calling serializer. + /// The object value. + public abstract object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer); + + /// + /// Determines whether this instance can convert the specified object type. + /// + /// Type of the object. + /// + /// true if this instance can convert the specified object type; otherwise, false. + /// + public abstract bool CanConvert(Type objectType); + + /// + /// + /// Gets the of the JSON produced by the JsonConverter. + /// + /// + /// JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. + /// + /// + /// The of the JSON produced by the JsonConverter. + [Obsolete("JSON Schema validation has been moved to its own package. It is strongly recommended that you do not override GetSchema() in your own converter. It is not used by Json.NET and will be removed at some point in the future. Converter's that override GetSchema() will stop working when it is removed.")] + public virtual JsonSchema GetSchema() + { + return null; + } + + /// + /// Gets a value indicating whether this can read JSON. + /// + /// true if this can read JSON; otherwise, false. + public virtual bool CanRead + { + get { return true; } + } + + /// + /// Gets a value indicating whether this can write JSON. + /// + /// true if this can write JSON; otherwise, false. + public virtual bool CanWrite + { + get { return true; } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonConverterAttribute.cs b/Common/00-1Json8.3/Json8.3/JsonConverterAttribute.cs new file mode 100644 index 0000000..fdafb3a --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonConverterAttribute.cs @@ -0,0 +1,80 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using Newtonsoft.Json.Utilities; +using System.Globalization; + +namespace Newtonsoft.Json +{ + /// + /// Instructs the to use the specified when serializing the member or class. + /// + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface | AttributeTargets.Enum | AttributeTargets.Parameter, AllowMultiple = false)] + public sealed class JsonConverterAttribute : Attribute + { + private readonly Type _converterType; + + /// + /// Gets the of the converter. + /// + /// The of the converter. + public Type ConverterType + { + get { return _converterType; } + } + + /// + /// The parameter list to use when constructing the JsonConverter described by ConverterType. + /// If null, the default constructor is used. + /// + public object[] ConverterParameters { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + /// Type of the converter. + public JsonConverterAttribute(Type converterType) + { + if (converterType == null) + { + throw new ArgumentNullException(nameof(converterType)); + } + + _converterType = converterType; + } + + /// + /// Initializes a new instance of the class. + /// + /// Type of the converter. + /// Parameter list to use when constructing the JsonConverter. Can be null. + public JsonConverterAttribute(Type converterType, params object[] converterParameters) + : this(converterType) + { + ConverterParameters = converterParameters; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonConverterCollection.cs b/Common/00-1Json8.3/Json8.3/JsonConverterCollection.cs new file mode 100644 index 0000000..b2c0492 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonConverterCollection.cs @@ -0,0 +1,39 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Text; +using System.Collections.ObjectModel; + +namespace Newtonsoft.Json +{ + /// + /// Represents a collection of . + /// + public class JsonConverterCollection : Collection + { + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonDictionaryAttribute.cs b/Common/00-1Json8.3/Json8.3/JsonDictionaryAttribute.cs new file mode 100644 index 0000000..7ddf411 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonDictionaryAttribute.cs @@ -0,0 +1,52 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json +{ + /// + /// Instructs the how to serialize the collection. + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] + public sealed class JsonDictionaryAttribute : JsonContainerAttribute + { + /// + /// Initializes a new instance of the class. + /// + public JsonDictionaryAttribute() + { + } + + /// + /// Initializes a new instance of the class with the specified container Id. + /// + /// The container Id. + public JsonDictionaryAttribute(string id) + : base(id) + { + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonException.cs b/Common/00-1Json8.3/Json8.3/JsonException.cs new file mode 100644 index 0000000..97ea724 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonException.cs @@ -0,0 +1,92 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Runtime.Serialization; +using System.Text; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json +{ + /// + /// The exception thrown when an error occurs during JSON serialization or deserialization. + /// +#if !(DOTNET || PORTABLE40 || PORTABLE) + [Serializable] +#endif + public class JsonException : Exception + { + /// + /// Initializes a new instance of the class. + /// + public JsonException() + { + } + + /// + /// Initializes a new instance of the class + /// with a specified error message. + /// + /// The error message that explains the reason for the exception. + public JsonException(string message) + : base(message) + { + } + + /// + /// Initializes a new instance of the class + /// with a specified error message and a reference to the inner exception that is the cause of this exception. + /// + /// The error message that explains the reason for the exception. + /// The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + public JsonException(string message, Exception innerException) + : base(message, innerException) + { + } + +#if !(DOTNET || PORTABLE40 || PORTABLE) + /// + /// Initializes a new instance of the class. + /// + /// The that holds the serialized object data about the exception being thrown. + /// The that contains contextual information about the source or destination. + /// The parameter is null. + /// The class name is null or is zero (0). + public JsonException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } +#endif + + internal static JsonException Create(IJsonLineInfo lineInfo, string path, string message) + { + message = JsonPosition.FormatMessage(lineInfo, path, message); + + return new JsonException(message); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonExtensionDataAttribute.cs b/Common/00-1Json8.3/Json8.3/JsonExtensionDataAttribute.cs new file mode 100644 index 0000000..6bc15b7 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonExtensionDataAttribute.cs @@ -0,0 +1,37 @@ +using System; + +namespace Newtonsoft.Json +{ + /// + /// Instructs the to deserialize properties with no matching class member into the specified collection + /// and write values during serialization. + /// + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)] + public class JsonExtensionDataAttribute : Attribute + { + /// + /// Gets or sets a value that indicates whether to write extension data when serializing the object. + /// + /// + /// true to write extension data when serializing the object; otherwise, false. The default is true. + /// + public bool WriteData { get; set; } + + /// + /// Gets or sets a value that indicates whether to read extension data when deserializing the object. + /// + /// + /// true to read extension data when deserializing the object; otherwise, false. The default is true. + /// + public bool ReadData { get; set; } + + /// + /// Initializes a new instance of the class. + /// + public JsonExtensionDataAttribute() + { + WriteData = true; + ReadData = true; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonIgnoreAttribute.cs b/Common/00-1Json8.3/Json8.3/JsonIgnoreAttribute.cs new file mode 100644 index 0000000..8229299 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonIgnoreAttribute.cs @@ -0,0 +1,39 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Text; + +namespace Newtonsoft.Json +{ + /// + /// Instructs the not to serialize the public field or public read/write property value. + /// + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)] + public sealed class JsonIgnoreAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonObjectAttribute.cs b/Common/00-1Json8.3/Json8.3/JsonObjectAttribute.cs new file mode 100644 index 0000000..61fad92 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonObjectAttribute.cs @@ -0,0 +1,89 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json +{ + /// + /// Instructs the how to serialize the object. + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, AllowMultiple = false)] + public sealed class JsonObjectAttribute : JsonContainerAttribute + { + private MemberSerialization _memberSerialization = MemberSerialization.OptOut; + + // yuck. can't set nullable properties on an attribute in C# + // have to use this approach to get an unset default state + internal Required? _itemRequired; + + /// + /// Gets or sets the member serialization. + /// + /// The member serialization. + public MemberSerialization MemberSerialization + { + get { return _memberSerialization; } + set { _memberSerialization = value; } + } + + /// + /// Gets or sets a value that indicates whether the object's properties are required. + /// + /// + /// A value indicating whether the object's properties are required. + /// + public Required ItemRequired + { + get { return _itemRequired ?? default(Required); } + set { _itemRequired = value; } + } + + /// + /// Initializes a new instance of the class. + /// + public JsonObjectAttribute() + { + } + + /// + /// Initializes a new instance of the class with the specified member serialization. + /// + /// The member serialization. + public JsonObjectAttribute(MemberSerialization memberSerialization) + { + MemberSerialization = memberSerialization; + } + + /// + /// Initializes a new instance of the class with the specified container Id. + /// + /// The container Id. + public JsonObjectAttribute(string id) + : base(id) + { + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonPosition.cs b/Common/00-1Json8.3/Json8.3/JsonPosition.cs new file mode 100644 index 0000000..f478cc1 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonPosition.cs @@ -0,0 +1,167 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json +{ + internal enum JsonContainerType + { + None = 0, + Object = 1, + Array = 2, + Constructor = 3 + } + + internal struct JsonPosition + { + private static readonly char[] SpecialCharacters = { '.', ' ', '[', ']', '(', ')' }; + + internal JsonContainerType Type; + internal int Position; + internal string PropertyName; + internal bool HasIndex; + + public JsonPosition(JsonContainerType type) + { + Type = type; + HasIndex = TypeHasIndex(type); + Position = -1; + PropertyName = null; + } + + internal int CalculateLength() + { + switch (Type) + { + case JsonContainerType.Object: + return PropertyName.Length + 5; + case JsonContainerType.Array: + case JsonContainerType.Constructor: + return MathUtils.IntLength((ulong)Position) + 2; + default: + throw new ArgumentOutOfRangeException("Type"); + } + } + + internal void WriteTo(StringBuilder sb) + { + switch (Type) + { + case JsonContainerType.Object: + string propertyName = PropertyName; + if (propertyName.IndexOfAny(SpecialCharacters) != -1) + { + sb.Append(@"['"); + sb.Append(propertyName); + sb.Append(@"']"); + } + else + { + if (sb.Length > 0) + { + sb.Append('.'); + } + + sb.Append(propertyName); + } + break; + case JsonContainerType.Array: + case JsonContainerType.Constructor: + sb.Append('['); + sb.Append(Position); + sb.Append(']'); + break; + } + } + + internal static bool TypeHasIndex(JsonContainerType type) + { + return (type == JsonContainerType.Array || type == JsonContainerType.Constructor); + } + + internal static string BuildPath(List positions, JsonPosition? currentPosition) + { + int capacity = 0; + if (positions != null) + { + for (int i = 0; i < positions.Count; i++) + { + capacity += positions[i].CalculateLength(); + } + } + if (currentPosition != null) + { + capacity += currentPosition.GetValueOrDefault().CalculateLength(); + } + + StringBuilder sb = new StringBuilder(capacity); + if (positions != null) + { + foreach (JsonPosition state in positions) + { + state.WriteTo(sb); + } + } + if (currentPosition != null) + { + currentPosition.GetValueOrDefault().WriteTo(sb); + } + + return sb.ToString(); + } + + internal static string FormatMessage(IJsonLineInfo lineInfo, string path, string message) + { + // don't add a fullstop and space when message ends with a new line + if (!message.EndsWith(Environment.NewLine, StringComparison.Ordinal)) + { + message = message.Trim(); + + if (!message.EndsWith('.')) + { + message += "."; + } + + message += " "; + } + + message += "Path '{0}'".FormatWith(CultureInfo.InvariantCulture, path); + + if (lineInfo != null && lineInfo.HasLineInfo()) + { + message += ", line {0}, position {1}".FormatWith(CultureInfo.InvariantCulture, lineInfo.LineNumber, lineInfo.LinePosition); + } + + message += "."; + + return message; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonPropertyAttribute.cs b/Common/00-1Json8.3/Json8.3/JsonPropertyAttribute.cs new file mode 100644 index 0000000..6efe0ed --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonPropertyAttribute.cs @@ -0,0 +1,201 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json +{ + /// + /// Instructs the to always serialize the member with the specified name. + /// + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter, AllowMultiple = false)] + public sealed class JsonPropertyAttribute : Attribute + { + // yuck. can't set nullable properties on an attribute in C# + // have to use this approach to get an unset default state + internal NullValueHandling? _nullValueHandling; + internal DefaultValueHandling? _defaultValueHandling; + internal ReferenceLoopHandling? _referenceLoopHandling; + internal ObjectCreationHandling? _objectCreationHandling; + internal TypeNameHandling? _typeNameHandling; + internal bool? _isReference; + internal int? _order; + internal Required? _required; + internal bool? _itemIsReference; + internal ReferenceLoopHandling? _itemReferenceLoopHandling; + internal TypeNameHandling? _itemTypeNameHandling; + + /// + /// Gets or sets the converter used when serializing the property's collection items. + /// + /// The collection's items converter. + public Type ItemConverterType { get; set; } + + /// + /// The parameter list to use when constructing the JsonConverter described by ItemConverterType. + /// If null, the default constructor is used. + /// When non-null, there must be a constructor defined in the JsonConverter that exactly matches the number, + /// order, and type of these parameters. + /// + /// + /// [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + /// + public object[] ItemConverterParameters { get; set; } + + /// + /// Gets or sets the null value handling used when serializing this property. + /// + /// The null value handling. + public NullValueHandling NullValueHandling + { + get { return _nullValueHandling ?? default(NullValueHandling); } + set { _nullValueHandling = value; } + } + + /// + /// Gets or sets the default value handling used when serializing this property. + /// + /// The default value handling. + public DefaultValueHandling DefaultValueHandling + { + get { return _defaultValueHandling ?? default(DefaultValueHandling); } + set { _defaultValueHandling = value; } + } + + /// + /// Gets or sets the reference loop handling used when serializing this property. + /// + /// The reference loop handling. + public ReferenceLoopHandling ReferenceLoopHandling + { + get { return _referenceLoopHandling ?? default(ReferenceLoopHandling); } + set { _referenceLoopHandling = value; } + } + + /// + /// Gets or sets the object creation handling used when deserializing this property. + /// + /// The object creation handling. + public ObjectCreationHandling ObjectCreationHandling + { + get { return _objectCreationHandling ?? default(ObjectCreationHandling); } + set { _objectCreationHandling = value; } + } + + /// + /// Gets or sets the type name handling used when serializing this property. + /// + /// The type name handling. + public TypeNameHandling TypeNameHandling + { + get { return _typeNameHandling ?? default(TypeNameHandling); } + set { _typeNameHandling = value; } + } + + /// + /// Gets or sets whether this property's value is serialized as a reference. + /// + /// Whether this property's value is serialized as a reference. + public bool IsReference + { + get { return _isReference ?? default(bool); } + set { _isReference = value; } + } + + /// + /// Gets or sets the order of serialization of a member. + /// + /// The numeric order of serialization. + public int Order + { + get { return _order ?? default(int); } + set { _order = value; } + } + + /// + /// Gets or sets a value indicating whether this property is required. + /// + /// + /// A value indicating whether this property is required. + /// + public Required Required + { + get { return _required ?? Required.Default; } + set { _required = value; } + } + + /// + /// Gets or sets the name of the property. + /// + /// The name of the property. + public string PropertyName { get; set; } + + /// + /// Gets or sets the the reference loop handling used when serializing the property's collection items. + /// + /// The collection's items reference loop handling. + public ReferenceLoopHandling ItemReferenceLoopHandling + { + get { return _itemReferenceLoopHandling ?? default(ReferenceLoopHandling); } + set { _itemReferenceLoopHandling = value; } + } + + /// + /// Gets or sets the the type name handling used when serializing the property's collection items. + /// + /// The collection's items type name handling. + public TypeNameHandling ItemTypeNameHandling + { + get { return _itemTypeNameHandling ?? default(TypeNameHandling); } + set { _itemTypeNameHandling = value; } + } + + /// + /// Gets or sets whether this property's collection items are serialized as a reference. + /// + /// Whether this property's collection items are serialized as a reference. + public bool ItemIsReference + { + get { return _itemIsReference ?? default(bool); } + set { _itemIsReference = value; } + } + + /// + /// Initializes a new instance of the class. + /// + public JsonPropertyAttribute() + { + } + + /// + /// Initializes a new instance of the class with the specified name. + /// + /// Name of the property. + public JsonPropertyAttribute(string propertyName) + { + PropertyName = propertyName; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonReader.cs b/Common/00-1Json8.3/Json8.3/JsonReader.cs new file mode 100644 index 0000000..ce71c23 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonReader.cs @@ -0,0 +1,1173 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Globalization; +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) +using System.Numerics; +#endif +using Newtonsoft.Json.Serialization; +using Newtonsoft.Json.Utilities; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; +#endif + +namespace Newtonsoft.Json +{ + /// + /// Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + /// + public abstract class JsonReader : IDisposable + { + /// + /// Specifies the state of the reader. + /// + protected internal enum State + { + /// + /// The Read method has not been called. + /// + Start, + + /// + /// The end of the file has been reached successfully. + /// + Complete, + + /// + /// Reader is at a property. + /// + Property, + + /// + /// Reader is at the start of an object. + /// + ObjectStart, + + /// + /// Reader is in an object. + /// + Object, + + /// + /// Reader is at the start of an array. + /// + ArrayStart, + + /// + /// Reader is in an array. + /// + Array, + + /// + /// The Close method has been called. + /// + Closed, + + /// + /// Reader has just read a value. + /// + PostValue, + + /// + /// Reader is at the start of a constructor. + /// + ConstructorStart, + + /// + /// Reader in a constructor. + /// + Constructor, + + /// + /// An error occurred that prevents the read operation from continuing. + /// + Error, + + /// + /// The end of the file has been reached successfully. + /// + Finished + } + + // current Token data + private JsonToken _tokenType; + private object _value; + internal char _quoteChar; + internal State _currentState; + private JsonPosition _currentPosition; + private CultureInfo _culture; + private DateTimeZoneHandling _dateTimeZoneHandling; + private int? _maxDepth; + private bool _hasExceededMaxDepth; + internal DateParseHandling _dateParseHandling; + internal FloatParseHandling _floatParseHandling; + private string _dateFormatString; + private List _stack; + + /// + /// Gets the current reader state. + /// + /// The current reader state. + protected State CurrentState + { + get { return _currentState; } + } + + /// + /// Gets or sets a value indicating whether the underlying stream or + /// should be closed when the reader is closed. + /// + /// + /// true to close the underlying stream or when + /// the reader is closed; otherwise false. The default is true. + /// + public bool CloseInput { get; set; } + + /// + /// Gets or sets a value indicating whether multiple pieces of JSON content can + /// be read from a continuous stream without erroring. + /// + /// + /// true to support reading multiple pieces of JSON content; otherwise false. The default is false. + /// + public bool SupportMultipleContent { get; set; } + + /// + /// Gets the quotation mark character used to enclose the value of a string. + /// + public virtual char QuoteChar + { + get { return _quoteChar; } + protected internal set { _quoteChar = value; } + } + + /// + /// Get or set how time zones are handling when reading JSON. + /// + public DateTimeZoneHandling DateTimeZoneHandling + { + get { return _dateTimeZoneHandling; } + set + { + if (value < DateTimeZoneHandling.Local || value > DateTimeZoneHandling.RoundtripKind) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _dateTimeZoneHandling = value; + } + } + + /// + /// Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + /// + public DateParseHandling DateParseHandling + { + get { return _dateParseHandling; } + set + { + if (value < DateParseHandling.None || +#if !NET20 + value > DateParseHandling.DateTimeOffset +#else + value > DateParseHandling.DateTime +#endif + ) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _dateParseHandling = value; + } + } + + /// + /// Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + /// + public FloatParseHandling FloatParseHandling + { + get { return _floatParseHandling; } + set + { + if (value < FloatParseHandling.Double || value > FloatParseHandling.Decimal) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _floatParseHandling = value; + } + } + + /// + /// Get or set how custom date formatted strings are parsed when reading JSON. + /// + public string DateFormatString + { + get { return _dateFormatString; } + set { _dateFormatString = value; } + } + + /// + /// Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + /// + public int? MaxDepth + { + get { return _maxDepth; } + set + { + if (value <= 0) + { + throw new ArgumentException("Value must be positive.", nameof(value)); + } + + _maxDepth = value; + } + } + + /// + /// Gets the type of the current JSON token. + /// + public virtual JsonToken TokenType + { + get { return _tokenType; } + } + + /// + /// Gets the text value of the current JSON token. + /// + public virtual object Value + { + get { return _value; } + } + + /// + /// Gets The Common Language Runtime (CLR) type for the current JSON token. + /// + public virtual Type ValueType + { + get { return (_value != null) ? _value.GetType() : null; } + } + + /// + /// Gets the depth of the current token in the JSON document. + /// + /// The depth of the current token in the JSON document. + public virtual int Depth + { + get + { + int depth = (_stack != null) ? _stack.Count : 0; + if (JsonTokenUtils.IsStartToken(TokenType) || _currentPosition.Type == JsonContainerType.None) + { + return depth; + } + else + { + return depth + 1; + } + } + } + + /// + /// Gets the path of the current JSON token. + /// + public virtual string Path + { + get + { + if (_currentPosition.Type == JsonContainerType.None) + { + return string.Empty; + } + + bool insideContainer = (_currentState != State.ArrayStart + && _currentState != State.ConstructorStart + && _currentState != State.ObjectStart); + + JsonPosition? current = insideContainer ? (JsonPosition?)_currentPosition : null; + + return JsonPosition.BuildPath(_stack, current); + } + } + + /// + /// Gets or sets the culture used when reading JSON. Defaults to . + /// + public CultureInfo Culture + { + get { return _culture ?? CultureInfo.InvariantCulture; } + set { _culture = value; } + } + + internal JsonPosition GetPosition(int depth) + { + if (_stack != null && depth < _stack.Count) + { + return _stack[depth]; + } + + return _currentPosition; + } + + /// + /// Initializes a new instance of the class with the specified . + /// + protected JsonReader() + { + _currentState = State.Start; + _dateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; + _dateParseHandling = DateParseHandling.DateTime; + _floatParseHandling = FloatParseHandling.Double; + + CloseInput = true; + } + + private void Push(JsonContainerType value) + { + UpdateScopeWithFinishedValue(); + + if (_currentPosition.Type == JsonContainerType.None) + { + _currentPosition = new JsonPosition(value); + } + else + { + if (_stack == null) + { + _stack = new List(); + } + + _stack.Add(_currentPosition); + _currentPosition = new JsonPosition(value); + + // this is a little hacky because Depth increases when first property/value is written but only testing here is faster/simpler + if (_maxDepth != null && Depth + 1 > _maxDepth && !_hasExceededMaxDepth) + { + _hasExceededMaxDepth = true; + throw JsonReaderException.Create(this, "The reader's MaxDepth of {0} has been exceeded.".FormatWith(CultureInfo.InvariantCulture, _maxDepth)); + } + } + } + + private JsonContainerType Pop() + { + JsonPosition oldPosition; + if (_stack != null && _stack.Count > 0) + { + oldPosition = _currentPosition; + _currentPosition = _stack[_stack.Count - 1]; + _stack.RemoveAt(_stack.Count - 1); + } + else + { + oldPosition = _currentPosition; + _currentPosition = new JsonPosition(); + } + + if (_maxDepth != null && Depth <= _maxDepth) + { + _hasExceededMaxDepth = false; + } + + return oldPosition.Type; + } + + private JsonContainerType Peek() + { + return _currentPosition.Type; + } + + /// + /// Reads the next JSON token from the stream. + /// + /// true if the next token was read successfully; false if there are no more tokens to read. + public abstract bool Read(); + + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . This method will return null at the end of an array. + public virtual int? ReadAsInt32() + { + JsonToken t = GetContentToken(); + + switch (t) + { + case JsonToken.None: + case JsonToken.Null: + case JsonToken.EndArray: + return null; + case JsonToken.Integer: + case JsonToken.Float: + if (!(Value is int)) + { + SetToken(JsonToken.Integer, Convert.ToInt32(Value, CultureInfo.InvariantCulture), false); + } + + return (int)Value; + case JsonToken.String: + string s = (string)Value; + return ReadInt32String(s); + } + + throw JsonReaderException.Create(this, "Error reading integer. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, t)); + } + + internal int? ReadInt32String(string s) + { + if (string.IsNullOrEmpty(s)) + { + SetToken(JsonToken.Null, null, false); + return null; + } + + int i; + if (int.TryParse(s, NumberStyles.Integer, Culture, out i)) + { + SetToken(JsonToken.Integer, i, false); + return i; + } + else + { + SetToken(JsonToken.String, s, false); + throw JsonReaderException.Create(this, "Could not convert string to integer: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); + } + } + + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . This method will return null at the end of an array. + public virtual string ReadAsString() + { + JsonToken t = GetContentToken(); + + switch (t) + { + case JsonToken.None: + case JsonToken.Null: + case JsonToken.EndArray: + return null; + case JsonToken.String: + return (string)Value; + } + + if (JsonTokenUtils.IsPrimitiveToken(t)) + { + if (Value != null) + { + string s; + if (Value is IFormattable) + { + s = ((IFormattable)Value).ToString(null, Culture); + } + else if (Value is Uri) + { + s = ((Uri)Value).OriginalString; + } + else + { + s = Value.ToString(); + } + + SetToken(JsonToken.String, s, false); + return s; + } + } + + throw JsonReaderException.Create(this, "Error reading string. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, t)); + } + + /// + /// Reads the next JSON token from the stream as a []. + /// + /// A [] or a null reference if the next JSON token is null. This method will return null at the end of an array. + public virtual byte[] ReadAsBytes() + { + JsonToken t = GetContentToken(); + + if (t == JsonToken.None) + { + return null; + } + + if (TokenType == JsonToken.StartObject) + { + ReadIntoWrappedTypeObject(); + + byte[] data = ReadAsBytes(); + ReaderReadAndAssert(); + + if (TokenType != JsonToken.EndObject) + { + throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); + } + + SetToken(JsonToken.Bytes, data, false); + return data; + } + + switch (t) + { + case JsonToken.String: + { + // attempt to convert possible base 64 or GUID string to bytes + // GUID has to have format 00000000-0000-0000-0000-000000000000 + string s = (string)Value; + + byte[] data; + + Guid g; + if (s.Length == 0) + { + data = new byte[0]; + } + else if (ConvertUtils.TryConvertGuid(s, out g)) + { + data = g.ToByteArray(); + } + else + { + data = Convert.FromBase64String(s); + } + + SetToken(JsonToken.Bytes, data, false); + return data; + } + case JsonToken.Null: + case JsonToken.EndArray: + return null; + case JsonToken.Bytes: + if (ValueType == typeof(Guid)) + { + byte[] data = ((Guid)Value).ToByteArray(); + SetToken(JsonToken.Bytes, data, false); + return data; + } + + return (byte[])Value; + case JsonToken.StartArray: + return ReadArrayIntoByteArray(); + } + + throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, t)); + } + + internal byte[] ReadArrayIntoByteArray() + { + List buffer = new List(); + + while (true) + { + JsonToken t = GetContentToken(); + switch (t) + { + case JsonToken.None: + throw JsonReaderException.Create(this, "Unexpected end when reading bytes."); + case JsonToken.Integer: + buffer.Add(Convert.ToByte(Value, CultureInfo.InvariantCulture)); + break; + case JsonToken.EndArray: + byte[] d = buffer.ToArray(); + SetToken(JsonToken.Bytes, d, false); + return d; + default: + throw JsonReaderException.Create(this, "Unexpected token when reading bytes: {0}.".FormatWith(CultureInfo.InvariantCulture, t)); + } + } + } + + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . This method will return null at the end of an array. + public virtual double? ReadAsDouble() + { + JsonToken t = GetContentToken(); + + switch (t) + { + case JsonToken.None: + case JsonToken.Null: + case JsonToken.EndArray: + return null; + case JsonToken.Integer: + case JsonToken.Float: + if (!(Value is double)) + { + SetToken(JsonToken.Float, Convert.ToDouble(Value, CultureInfo.InvariantCulture), false); + } + + return (double) Value; + case JsonToken.String: + return ReadDoubleString((string) Value); + } + + throw JsonReaderException.Create(this, "Error reading double. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, t)); + } + + internal double? ReadDoubleString(string s) + { + if (string.IsNullOrEmpty(s)) + { + SetToken(JsonToken.Null, null, false); + return null; + } + + double d; + if (double.TryParse(s, NumberStyles.Float | NumberStyles.AllowThousands, Culture, out d)) + { + SetToken(JsonToken.Float, d, false); + return d; + } + else + { + SetToken(JsonToken.String, s, false); + throw JsonReaderException.Create(this, "Could not convert string to double: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); + } + } + + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . This method will return null at the end of an array. + public virtual bool? ReadAsBoolean() + { + JsonToken t = GetContentToken(); + + switch (t) + { + case JsonToken.None: + case JsonToken.Null: + case JsonToken.EndArray: + return null; + case JsonToken.Integer: + case JsonToken.Float: + bool b; +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (Value is BigInteger) + { + b = (BigInteger)Value != 0; + } + else +#endif + { + b = Convert.ToBoolean(Value, CultureInfo.InvariantCulture); + } + + SetToken(JsonToken.Boolean, b, false); + + return b; + case JsonToken.String: + return ReadBooleanString((string)Value); + case JsonToken.Boolean: + return (bool)Value; + } + + throw JsonReaderException.Create(this, "Error reading boolean. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, t)); + } + + internal bool? ReadBooleanString(string s) + { + if (string.IsNullOrEmpty(s)) + { + SetToken(JsonToken.Null, null, false); + return null; + } + + bool b; + if (bool.TryParse(s, out b)) + { + SetToken(JsonToken.Boolean, b, false); + return b; + } + else + { + SetToken(JsonToken.String, s, false); + throw JsonReaderException.Create(this, "Could not convert string to boolean: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); + } + } + + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . This method will return null at the end of an array. + public virtual decimal? ReadAsDecimal() + { + JsonToken t = GetContentToken(); + + switch (t) + { + case JsonToken.None: + case JsonToken.Null: + case JsonToken.EndArray: + return null; + case JsonToken.Integer: + case JsonToken.Float: + if (!(Value is decimal)) + { + SetToken(JsonToken.Float, Convert.ToDecimal(Value, CultureInfo.InvariantCulture), false); + } + + return (decimal)Value; + case JsonToken.String: + return ReadDecimalString((string)Value); + } + + throw JsonReaderException.Create(this, "Error reading decimal. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, t)); + } + + internal decimal? ReadDecimalString(string s) + { + if (string.IsNullOrEmpty(s)) + { + SetToken(JsonToken.Null, null, false); + return null; + } + + decimal d; + if (decimal.TryParse(s, NumberStyles.Number, Culture, out d)) + { + SetToken(JsonToken.Float, d, false); + return d; + } + else + { + SetToken(JsonToken.String, s, false); + throw JsonReaderException.Create(this, "Could not convert string to decimal: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); + } + } + + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . This method will return null at the end of an array. + public virtual DateTime? ReadAsDateTime() + { + switch (GetContentToken()) + { + case JsonToken.None: + case JsonToken.Null: + case JsonToken.EndArray: + return null; + case JsonToken.Date: +#if !NET20 + if (Value is DateTimeOffset) + { + SetToken(JsonToken.Date, ((DateTimeOffset)Value).DateTime, false); + } +#endif + + return (DateTime)Value; + case JsonToken.String: + string s = (string)Value; + return ReadDateTimeString(s); + } + + throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); + } + + internal DateTime? ReadDateTimeString(string s) + { + if (string.IsNullOrEmpty(s)) + { + SetToken(JsonToken.Null, null, false); + return null; + } + + DateTime dt; + if (DateTimeUtils.TryParseDateTime(s, DateTimeZoneHandling, _dateFormatString, Culture, out dt)) + { + dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling); + SetToken(JsonToken.Date, dt, false); + return dt; + } + + if (DateTime.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt)) + { + dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling); + SetToken(JsonToken.Date, dt, false); + return dt; + } + + throw JsonReaderException.Create(this, "Could not convert string to DateTime: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); + } + +#if !NET20 + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . This method will return null at the end of an array. + public virtual DateTimeOffset? ReadAsDateTimeOffset() + { + JsonToken t = GetContentToken(); + + switch (t) + { + case JsonToken.None: + case JsonToken.Null: + case JsonToken.EndArray: + return null; + case JsonToken.Date: + if (Value is DateTime) + { + SetToken(JsonToken.Date, new DateTimeOffset((DateTime)Value), false); + } + + return (DateTimeOffset)Value; + case JsonToken.String: + string s = (string)Value; + return ReadDateTimeOffsetString(s); + default: + throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, t)); + } + } + + internal DateTimeOffset? ReadDateTimeOffsetString(string s) + { + if (string.IsNullOrEmpty(s)) + { + SetToken(JsonToken.Null, null, false); + return null; + } + + DateTimeOffset dt; + if (DateTimeUtils.TryParseDateTimeOffset(s, _dateFormatString, Culture, out dt)) + { + SetToken(JsonToken.Date, dt, false); + return dt; + } + + if (DateTimeOffset.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt)) + { + SetToken(JsonToken.Date, dt, false); + return dt; + } + + SetToken(JsonToken.String, s, false); + throw JsonReaderException.Create(this, "Could not convert string to DateTimeOffset: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); + } +#endif + + internal void ReaderReadAndAssert() + { + if (!Read()) + { + throw CreateUnexpectedEndException(); + } + } + + internal JsonReaderException CreateUnexpectedEndException() + { + return JsonReaderException.Create(this, "Unexpected end when reading JSON."); + } + + internal void ReadIntoWrappedTypeObject() + { + ReaderReadAndAssert(); + if (Value.ToString() == JsonTypeReflector.TypePropertyName) + { + ReaderReadAndAssert(); + if (Value != null && Value.ToString().StartsWith("System.Byte[]", StringComparison.Ordinal)) + { + ReaderReadAndAssert(); + if (Value.ToString() == JsonTypeReflector.ValuePropertyName) + { + return; + } + } + } + + throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, JsonToken.StartObject)); + } + + /// + /// Skips the children of the current token. + /// + public void Skip() + { + if (TokenType == JsonToken.PropertyName) + { + Read(); + } + + if (JsonTokenUtils.IsStartToken(TokenType)) + { + int depth = Depth; + + while (Read() && (depth < Depth)) + { + } + } + } + + /// + /// Sets the current token. + /// + /// The new token. + protected void SetToken(JsonToken newToken) + { + SetToken(newToken, null, true); + } + + /// + /// Sets the current token and value. + /// + /// The new token. + /// The value. + protected void SetToken(JsonToken newToken, object value) + { + SetToken(newToken, value, true); + } + + internal void SetToken(JsonToken newToken, object value, bool updateIndex) + { + _tokenType = newToken; + _value = value; + + switch (newToken) + { + case JsonToken.StartObject: + _currentState = State.ObjectStart; + Push(JsonContainerType.Object); + break; + case JsonToken.StartArray: + _currentState = State.ArrayStart; + Push(JsonContainerType.Array); + break; + case JsonToken.StartConstructor: + _currentState = State.ConstructorStart; + Push(JsonContainerType.Constructor); + break; + case JsonToken.EndObject: + ValidateEnd(JsonToken.EndObject); + break; + case JsonToken.EndArray: + ValidateEnd(JsonToken.EndArray); + break; + case JsonToken.EndConstructor: + ValidateEnd(JsonToken.EndConstructor); + break; + case JsonToken.PropertyName: + _currentState = State.Property; + + _currentPosition.PropertyName = (string)value; + break; + case JsonToken.Undefined: + case JsonToken.Integer: + case JsonToken.Float: + case JsonToken.Boolean: + case JsonToken.Null: + case JsonToken.Date: + case JsonToken.String: + case JsonToken.Raw: + case JsonToken.Bytes: + SetPostValueState(updateIndex); + break; + } + } + + internal void SetPostValueState(bool updateIndex) + { + if (Peek() != JsonContainerType.None) + { + _currentState = State.PostValue; + } + else + { + SetFinished(); + } + + if (updateIndex) + { + UpdateScopeWithFinishedValue(); + } + } + + private void UpdateScopeWithFinishedValue() + { + if (_currentPosition.HasIndex) + { + _currentPosition.Position++; + } + } + + private void ValidateEnd(JsonToken endToken) + { + JsonContainerType currentObject = Pop(); + + if (GetTypeForCloseToken(endToken) != currentObject) + { + throw JsonReaderException.Create(this, "JsonToken {0} is not valid for closing JsonType {1}.".FormatWith(CultureInfo.InvariantCulture, endToken, currentObject)); + } + + if (Peek() != JsonContainerType.None) + { + _currentState = State.PostValue; + } + else + { + SetFinished(); + } + } + + /// + /// Sets the state based on current token type. + /// + protected void SetStateBasedOnCurrent() + { + JsonContainerType currentObject = Peek(); + + switch (currentObject) + { + case JsonContainerType.Object: + _currentState = State.Object; + break; + case JsonContainerType.Array: + _currentState = State.Array; + break; + case JsonContainerType.Constructor: + _currentState = State.Constructor; + break; + case JsonContainerType.None: + SetFinished(); + break; + default: + throw JsonReaderException.Create(this, "While setting the reader state back to current object an unexpected JsonType was encountered: {0}".FormatWith(CultureInfo.InvariantCulture, currentObject)); + } + } + + private void SetFinished() + { + if (SupportMultipleContent) + { + _currentState = State.Start; + } + else + { + _currentState = State.Finished; + } + } + + private JsonContainerType GetTypeForCloseToken(JsonToken token) + { + switch (token) + { + case JsonToken.EndObject: + return JsonContainerType.Object; + case JsonToken.EndArray: + return JsonContainerType.Array; + case JsonToken.EndConstructor: + return JsonContainerType.Constructor; + default: + throw JsonReaderException.Create(this, "Not a valid close JsonToken: {0}".FormatWith(CultureInfo.InvariantCulture, token)); + } + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + void IDisposable.Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Releases unmanaged and - optionally - managed resources + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (_currentState != State.Closed && disposing) + { + Close(); + } + } + + /// + /// Changes the to Closed. + /// + public virtual void Close() + { + _currentState = State.Closed; + _tokenType = JsonToken.None; + _value = null; + } + + internal void ReadAndAssert() + { + if (!Read()) + { + throw JsonSerializationException.Create(this, "Unexpected end when reading JSON."); + } + } + + internal bool ReadAndMoveToContent() + { + return Read() && MoveToContent(); + } + + internal bool MoveToContent() + { + JsonToken t = TokenType; + while (t == JsonToken.None || t == JsonToken.Comment) + { + if (!Read()) + { + return false; + } + + t = TokenType; + } + + return true; + } + + private JsonToken GetContentToken() + { + JsonToken t; + do + { + if (!Read()) + { + SetToken(JsonToken.None); + return JsonToken.None; + } + else + { + t = TokenType; + } + } while (t == JsonToken.Comment); + + return t; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonReaderException.cs b/Common/00-1Json8.3/Json8.3/JsonReaderException.cs new file mode 100644 index 0000000..9f448c4 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonReaderException.cs @@ -0,0 +1,139 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Globalization; +using System.Runtime.Serialization; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json +{ + /// + /// The exception thrown when an error occurs while reading JSON text. + /// +#if !(DOTNET || PORTABLE || PORTABLE40) + [Serializable] +#endif + public class JsonReaderException : JsonException + { + /// + /// Gets the line number indicating where the error occurred. + /// + /// The line number indicating where the error occurred. + public int LineNumber { get; private set; } + + /// + /// Gets the line position indicating where the error occurred. + /// + /// The line position indicating where the error occurred. + public int LinePosition { get; private set; } + + /// + /// Gets the path to the JSON where the error occurred. + /// + /// The path to the JSON where the error occurred. + public string Path { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + public JsonReaderException() + { + } + + /// + /// Initializes a new instance of the class + /// with a specified error message. + /// + /// The error message that explains the reason for the exception. + public JsonReaderException(string message) + : base(message) + { + } + + /// + /// Initializes a new instance of the class + /// with a specified error message and a reference to the inner exception that is the cause of this exception. + /// + /// The error message that explains the reason for the exception. + /// The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + public JsonReaderException(string message, Exception innerException) + : base(message, innerException) + { + } + +#if !(DOTNET || PORTABLE40 || PORTABLE) + /// + /// Initializes a new instance of the class. + /// + /// The that holds the serialized object data about the exception being thrown. + /// The that contains contextual information about the source or destination. + /// The parameter is null. + /// The class name is null or is zero (0). + public JsonReaderException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } +#endif + + internal JsonReaderException(string message, Exception innerException, string path, int lineNumber, int linePosition) + : base(message, innerException) + { + Path = path; + LineNumber = lineNumber; + LinePosition = linePosition; + } + + internal static JsonReaderException Create(JsonReader reader, string message) + { + return Create(reader, message, null); + } + + internal static JsonReaderException Create(JsonReader reader, string message, Exception ex) + { + return Create(reader as IJsonLineInfo, reader.Path, message, ex); + } + + internal static JsonReaderException Create(IJsonLineInfo lineInfo, string path, string message, Exception ex) + { + message = JsonPosition.FormatMessage(lineInfo, path, message); + + int lineNumber; + int linePosition; + if (lineInfo != null && lineInfo.HasLineInfo()) + { + lineNumber = lineInfo.LineNumber; + linePosition = lineInfo.LinePosition; + } + else + { + lineNumber = 0; + linePosition = 0; + } + + return new JsonReaderException(message, ex, path, lineNumber, linePosition); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonRequiredAttribute.cs b/Common/00-1Json8.3/Json8.3/JsonRequiredAttribute.cs new file mode 100644 index 0000000..625a23a --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonRequiredAttribute.cs @@ -0,0 +1,39 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Text; + +namespace Newtonsoft.Json +{ + /// + /// Instructs the to always serialize the member, and require the member has a value. + /// + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)] + public sealed class JsonRequiredAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonSerializationException.cs b/Common/00-1Json8.3/Json8.3/JsonSerializationException.cs new file mode 100644 index 0000000..1c872c7 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonSerializationException.cs @@ -0,0 +1,100 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Text; + +namespace Newtonsoft.Json +{ + /// + /// The exception thrown when an error occurs during JSON serialization or deserialization. + /// +#if !(DOTNET || PORTABLE40 || PORTABLE) + [Serializable] +#endif + public class JsonSerializationException : JsonException + { + /// + /// Initializes a new instance of the class. + /// + public JsonSerializationException() + { + } + + /// + /// Initializes a new instance of the class + /// with a specified error message. + /// + /// The error message that explains the reason for the exception. + public JsonSerializationException(string message) + : base(message) + { + } + + /// + /// Initializes a new instance of the class + /// with a specified error message and a reference to the inner exception that is the cause of this exception. + /// + /// The error message that explains the reason for the exception. + /// The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + public JsonSerializationException(string message, Exception innerException) + : base(message, innerException) + { + } + +#if !(DOTNET || PORTABLE40 || PORTABLE) + /// + /// Initializes a new instance of the class. + /// + /// The that holds the serialized object data about the exception being thrown. + /// The that contains contextual information about the source or destination. + /// The parameter is null. + /// The class name is null or is zero (0). + public JsonSerializationException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } +#endif + + internal static JsonSerializationException Create(JsonReader reader, string message) + { + return Create(reader, message, null); + } + + internal static JsonSerializationException Create(JsonReader reader, string message, Exception ex) + { + return Create(reader as IJsonLineInfo, reader.Path, message, ex); + } + + internal static JsonSerializationException Create(IJsonLineInfo lineInfo, string path, string message, Exception ex) + { + message = JsonPosition.FormatMessage(lineInfo, path, message); + + return new JsonSerializationException(message, ex); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonSerializer.cs b/Common/00-1Json8.3/Json8.3/JsonSerializer.cs new file mode 100644 index 0000000..7540116 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonSerializer.cs @@ -0,0 +1,1140 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Runtime.Serialization.Formatters; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Serialization; +using Newtonsoft.Json.Utilities; +using System.Runtime.Serialization; +using ErrorEventArgs = Newtonsoft.Json.Serialization.ErrorEventArgs; + +namespace Newtonsoft.Json +{ + /// + /// Serializes and deserializes objects into and from the JSON format. + /// The enables you to control how objects are encoded into JSON. + /// + public class JsonSerializer + { + internal TypeNameHandling _typeNameHandling; + internal FormatterAssemblyStyle _typeNameAssemblyFormat; + internal PreserveReferencesHandling _preserveReferencesHandling; + internal ReferenceLoopHandling _referenceLoopHandling; + internal MissingMemberHandling _missingMemberHandling; + internal ObjectCreationHandling _objectCreationHandling; + internal NullValueHandling _nullValueHandling; + internal DefaultValueHandling _defaultValueHandling; + internal ConstructorHandling _constructorHandling; + internal MetadataPropertyHandling _metadataPropertyHandling; + internal JsonConverterCollection _converters; + internal IContractResolver _contractResolver; + internal ITraceWriter _traceWriter; + internal IEqualityComparer _equalityComparer; + internal SerializationBinder _binder; + internal StreamingContext _context; + private IReferenceResolver _referenceResolver; + + private Formatting? _formatting; + private DateFormatHandling? _dateFormatHandling; + private DateTimeZoneHandling? _dateTimeZoneHandling; + private DateParseHandling? _dateParseHandling; + private FloatFormatHandling? _floatFormatHandling; + private FloatParseHandling? _floatParseHandling; + private StringEscapeHandling? _stringEscapeHandling; + private CultureInfo _culture; + private int? _maxDepth; + private bool _maxDepthSet; + private bool? _checkAdditionalContent; + private string _dateFormatString; + private bool _dateFormatStringSet; + + /// + /// Occurs when the errors during serialization and deserialization. + /// + public virtual event EventHandler Error; + + /// + /// Gets or sets the used by the serializer when resolving references. + /// + public virtual IReferenceResolver ReferenceResolver + { + get { return GetReferenceResolver(); } + set + { + if (value == null) + { + throw new ArgumentNullException(nameof(value), "Reference resolver cannot be null."); + } + + _referenceResolver = value; + } + } + + /// + /// Gets or sets the used by the serializer when resolving type names. + /// + public virtual SerializationBinder Binder + { + get { return _binder; } + set + { + if (value == null) + { + throw new ArgumentNullException(nameof(value), "Serialization binder cannot be null."); + } + + _binder = value; + } + } + + /// + /// Gets or sets the used by the serializer when writing trace messages. + /// + /// The trace writer. + public virtual ITraceWriter TraceWriter + { + get { return _traceWriter; } + set { _traceWriter = value; } + } + + /// + /// Gets or sets the equality comparer used by the serializer when comparing references. + /// + /// The equality comparer. + public virtual IEqualityComparer EqualityComparer + { + get { return _equalityComparer; } + set { _equalityComparer = value; } + } + + /// + /// Gets or sets how type name writing and reading is handled by the serializer. + /// + /// + /// should be used with caution when your application deserializes JSON from an external source. + /// Incoming types should be validated with a custom + /// when deserializing with a value other than TypeNameHandling.None. + /// + public virtual TypeNameHandling TypeNameHandling + { + get { return _typeNameHandling; } + set + { + if (value < TypeNameHandling.None || value > TypeNameHandling.Auto) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _typeNameHandling = value; + } + } + + /// + /// Gets or sets how a type name assembly is written and resolved by the serializer. + /// + /// The type name assembly format. + public virtual FormatterAssemblyStyle TypeNameAssemblyFormat + { + get { return _typeNameAssemblyFormat; } + set + { + if (value < FormatterAssemblyStyle.Simple || value > FormatterAssemblyStyle.Full) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _typeNameAssemblyFormat = value; + } + } + + /// + /// Gets or sets how object references are preserved by the serializer. + /// + public virtual PreserveReferencesHandling PreserveReferencesHandling + { + get { return _preserveReferencesHandling; } + set + { + if (value < PreserveReferencesHandling.None || value > PreserveReferencesHandling.All) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _preserveReferencesHandling = value; + } + } + + /// + /// Get or set how reference loops (e.g. a class referencing itself) is handled. + /// + public virtual ReferenceLoopHandling ReferenceLoopHandling + { + get { return _referenceLoopHandling; } + set + { + if (value < ReferenceLoopHandling.Error || value > ReferenceLoopHandling.Serialize) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _referenceLoopHandling = value; + } + } + + /// + /// Get or set how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + /// + public virtual MissingMemberHandling MissingMemberHandling + { + get { return _missingMemberHandling; } + set + { + if (value < MissingMemberHandling.Ignore || value > MissingMemberHandling.Error) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _missingMemberHandling = value; + } + } + + /// + /// Get or set how null values are handled during serialization and deserialization. + /// + public virtual NullValueHandling NullValueHandling + { + get { return _nullValueHandling; } + set + { + if (value < NullValueHandling.Include || value > NullValueHandling.Ignore) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _nullValueHandling = value; + } + } + + /// + /// Get or set how null default are handled during serialization and deserialization. + /// + public virtual DefaultValueHandling DefaultValueHandling + { + get { return _defaultValueHandling; } + set + { + if (value < DefaultValueHandling.Include || value > DefaultValueHandling.IgnoreAndPopulate) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _defaultValueHandling = value; + } + } + + /// + /// Gets or sets how objects are created during deserialization. + /// + /// The object creation handling. + public virtual ObjectCreationHandling ObjectCreationHandling + { + get { return _objectCreationHandling; } + set + { + if (value < ObjectCreationHandling.Auto || value > ObjectCreationHandling.Replace) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _objectCreationHandling = value; + } + } + + /// + /// Gets or sets how constructors are used during deserialization. + /// + /// The constructor handling. + public virtual ConstructorHandling ConstructorHandling + { + get { return _constructorHandling; } + set + { + if (value < ConstructorHandling.Default || value > ConstructorHandling.AllowNonPublicDefaultConstructor) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _constructorHandling = value; + } + } + + /// + /// Gets or sets how metadata properties are used during deserialization. + /// + /// The metadata properties handling. + public virtual MetadataPropertyHandling MetadataPropertyHandling + { + get { return _metadataPropertyHandling; } + set + { + if (value < MetadataPropertyHandling.Default || value > MetadataPropertyHandling.Ignore) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _metadataPropertyHandling = value; + } + } + + /// + /// Gets a collection that will be used during serialization. + /// + /// Collection that will be used during serialization. + public virtual JsonConverterCollection Converters + { + get + { + if (_converters == null) + { + _converters = new JsonConverterCollection(); + } + + return _converters; + } + } + + /// + /// Gets or sets the contract resolver used by the serializer when + /// serializing .NET objects to JSON and vice versa. + /// + public virtual IContractResolver ContractResolver + { + get { return _contractResolver; } + set { _contractResolver = value ?? DefaultContractResolver.Instance; } + } + + /// + /// Gets or sets the used by the serializer when invoking serialization callback methods. + /// + /// The context. + public virtual StreamingContext Context + { + get { return _context; } + set { _context = value; } + } + + /// + /// Indicates how JSON text output is formatted. + /// + public virtual Formatting Formatting + { + get { return _formatting ?? JsonSerializerSettings.DefaultFormatting; } + set { _formatting = value; } + } + + /// + /// Get or set how dates are written to JSON text. + /// + public virtual DateFormatHandling DateFormatHandling + { + get { return _dateFormatHandling ?? JsonSerializerSettings.DefaultDateFormatHandling; } + set { _dateFormatHandling = value; } + } + + /// + /// Get or set how time zones are handling during serialization and deserialization. + /// + public virtual DateTimeZoneHandling DateTimeZoneHandling + { + get { return _dateTimeZoneHandling ?? JsonSerializerSettings.DefaultDateTimeZoneHandling; } + set { _dateTimeZoneHandling = value; } + } + + /// + /// Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + /// + public virtual DateParseHandling DateParseHandling + { + get { return _dateParseHandling ?? JsonSerializerSettings.DefaultDateParseHandling; } + set { _dateParseHandling = value; } + } + + /// + /// Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + /// + public virtual FloatParseHandling FloatParseHandling + { + get { return _floatParseHandling ?? JsonSerializerSettings.DefaultFloatParseHandling; } + set { _floatParseHandling = value; } + } + + /// + /// Get or set how special floating point numbers, e.g. , + /// and , + /// are written as JSON text. + /// + public virtual FloatFormatHandling FloatFormatHandling + { + get { return _floatFormatHandling ?? JsonSerializerSettings.DefaultFloatFormatHandling; } + set { _floatFormatHandling = value; } + } + + /// + /// Get or set how strings are escaped when writing JSON text. + /// + public virtual StringEscapeHandling StringEscapeHandling + { + get { return _stringEscapeHandling ?? JsonSerializerSettings.DefaultStringEscapeHandling; } + set { _stringEscapeHandling = value; } + } + + /// + /// Get or set how and values are formatted when writing JSON text, and the expected date format when reading JSON text. + /// + public virtual string DateFormatString + { + get { return _dateFormatString ?? JsonSerializerSettings.DefaultDateFormatString; } + set + { + _dateFormatString = value; + _dateFormatStringSet = true; + } + } + + /// + /// Gets or sets the culture used when reading JSON. Defaults to . + /// + public virtual CultureInfo Culture + { + get { return _culture ?? JsonSerializerSettings.DefaultCulture; } + set { _culture = value; } + } + + /// + /// Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + /// + public virtual int? MaxDepth + { + get { return _maxDepth; } + set + { + if (value <= 0) + { + throw new ArgumentException("Value must be positive.", nameof(value)); + } + + _maxDepth = value; + _maxDepthSet = true; + } + } + + /// + /// Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + /// + /// + /// true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + /// + public virtual bool CheckAdditionalContent + { + get { return _checkAdditionalContent ?? JsonSerializerSettings.DefaultCheckAdditionalContent; } + set { _checkAdditionalContent = value; } + } + + internal bool IsCheckAdditionalContentSet() + { + return (_checkAdditionalContent != null); + } + + /// + /// Initializes a new instance of the class. + /// + public JsonSerializer() + { + _referenceLoopHandling = JsonSerializerSettings.DefaultReferenceLoopHandling; + _missingMemberHandling = JsonSerializerSettings.DefaultMissingMemberHandling; + _nullValueHandling = JsonSerializerSettings.DefaultNullValueHandling; + _defaultValueHandling = JsonSerializerSettings.DefaultDefaultValueHandling; + _objectCreationHandling = JsonSerializerSettings.DefaultObjectCreationHandling; + _preserveReferencesHandling = JsonSerializerSettings.DefaultPreserveReferencesHandling; + _constructorHandling = JsonSerializerSettings.DefaultConstructorHandling; + _typeNameHandling = JsonSerializerSettings.DefaultTypeNameHandling; + _metadataPropertyHandling = JsonSerializerSettings.DefaultMetadataPropertyHandling; + _context = JsonSerializerSettings.DefaultContext; + _binder = DefaultSerializationBinder.Instance; + + _culture = JsonSerializerSettings.DefaultCulture; + _contractResolver = DefaultContractResolver.Instance; + } + + /// + /// Creates a new instance. + /// The will not use default settings + /// from . + /// + /// + /// A new instance. + /// The will not use default settings + /// from . + /// + public static JsonSerializer Create() + { + return new JsonSerializer(); + } + + /// + /// Creates a new instance using the specified . + /// The will not use default settings + /// from . + /// + /// The settings to be applied to the . + /// + /// A new instance using the specified . + /// The will not use default settings + /// from . + /// + public static JsonSerializer Create(JsonSerializerSettings settings) + { + JsonSerializer serializer = Create(); + + if (settings != null) + { + ApplySerializerSettings(serializer, settings); + } + + return serializer; + } + + /// + /// Creates a new instance. + /// The will use default settings + /// from . + /// + /// + /// A new instance. + /// The will use default settings + /// from . + /// + public static JsonSerializer CreateDefault() + { + // copy static to local variable to avoid concurrency issues + Func defaultSettingsCreator = JsonConvert.DefaultSettings; + JsonSerializerSettings defaultSettings = (defaultSettingsCreator != null) ? defaultSettingsCreator() : null; + + return Create(defaultSettings); + } + + /// + /// Creates a new instance using the specified . + /// The will use default settings + /// from as well as the specified . + /// + /// The settings to be applied to the . + /// + /// A new instance using the specified . + /// The will use default settings + /// from as well as the specified . + /// + public static JsonSerializer CreateDefault(JsonSerializerSettings settings) + { + JsonSerializer serializer = CreateDefault(); + if (settings != null) + { + ApplySerializerSettings(serializer, settings); + } + + return serializer; + } + + private static void ApplySerializerSettings(JsonSerializer serializer, JsonSerializerSettings settings) + { + if (!CollectionUtils.IsNullOrEmpty(settings.Converters)) + { + // insert settings converters at the beginning so they take precedence + // if user wants to remove one of the default converters they will have to do it manually + for (int i = 0; i < settings.Converters.Count; i++) + { + serializer.Converters.Insert(i, settings.Converters[i]); + } + } + + // serializer specific + if (settings._typeNameHandling != null) + { + serializer.TypeNameHandling = settings.TypeNameHandling; + } + if (settings._metadataPropertyHandling != null) + { + serializer.MetadataPropertyHandling = settings.MetadataPropertyHandling; + } + if (settings._typeNameAssemblyFormat != null) + { + serializer.TypeNameAssemblyFormat = settings.TypeNameAssemblyFormat; + } + if (settings._preserveReferencesHandling != null) + { + serializer.PreserveReferencesHandling = settings.PreserveReferencesHandling; + } + if (settings._referenceLoopHandling != null) + { + serializer.ReferenceLoopHandling = settings.ReferenceLoopHandling; + } + if (settings._missingMemberHandling != null) + { + serializer.MissingMemberHandling = settings.MissingMemberHandling; + } + if (settings._objectCreationHandling != null) + { + serializer.ObjectCreationHandling = settings.ObjectCreationHandling; + } + if (settings._nullValueHandling != null) + { + serializer.NullValueHandling = settings.NullValueHandling; + } + if (settings._defaultValueHandling != null) + { + serializer.DefaultValueHandling = settings.DefaultValueHandling; + } + if (settings._constructorHandling != null) + { + serializer.ConstructorHandling = settings.ConstructorHandling; + } + if (settings._context != null) + { + serializer.Context = settings.Context; + } + if (settings._checkAdditionalContent != null) + { + serializer._checkAdditionalContent = settings._checkAdditionalContent; + } + + if (settings.Error != null) + { + serializer.Error += settings.Error; + } + + if (settings.ContractResolver != null) + { + serializer.ContractResolver = settings.ContractResolver; + } + if (settings.ReferenceResolverProvider != null) + { + serializer.ReferenceResolver = settings.ReferenceResolverProvider(); + } + if (settings.TraceWriter != null) + { + serializer.TraceWriter = settings.TraceWriter; + } + if (settings.EqualityComparer != null) + { + serializer.EqualityComparer = settings.EqualityComparer; + } + if (settings.Binder != null) + { + serializer.Binder = settings.Binder; + } + + // reader/writer specific + // unset values won't override reader/writer set values + if (settings._formatting != null) + { + serializer._formatting = settings._formatting; + } + if (settings._dateFormatHandling != null) + { + serializer._dateFormatHandling = settings._dateFormatHandling; + } + if (settings._dateTimeZoneHandling != null) + { + serializer._dateTimeZoneHandling = settings._dateTimeZoneHandling; + } + if (settings._dateParseHandling != null) + { + serializer._dateParseHandling = settings._dateParseHandling; + } + if (settings._dateFormatStringSet) + { + serializer._dateFormatString = settings._dateFormatString; + serializer._dateFormatStringSet = settings._dateFormatStringSet; + } + if (settings._floatFormatHandling != null) + { + serializer._floatFormatHandling = settings._floatFormatHandling; + } + if (settings._floatParseHandling != null) + { + serializer._floatParseHandling = settings._floatParseHandling; + } + if (settings._stringEscapeHandling != null) + { + serializer._stringEscapeHandling = settings._stringEscapeHandling; + } + if (settings._culture != null) + { + serializer._culture = settings._culture; + } + if (settings._maxDepthSet) + { + serializer._maxDepth = settings._maxDepth; + serializer._maxDepthSet = settings._maxDepthSet; + } + } + + /// + /// Populates the JSON values onto the target object. + /// + /// The that contains the JSON structure to reader values from. + /// The target object to populate values onto. + public void Populate(TextReader reader, object target) + { + Populate(new JsonTextReader(reader), target); + } + + /// + /// Populates the JSON values onto the target object. + /// + /// The that contains the JSON structure to reader values from. + /// The target object to populate values onto. + public void Populate(JsonReader reader, object target) + { + PopulateInternal(reader, target); + } + + internal virtual void PopulateInternal(JsonReader reader, object target) + { + ValidationUtils.ArgumentNotNull(reader, nameof(reader)); + ValidationUtils.ArgumentNotNull(target, nameof(target)); + + // set serialization options onto reader + CultureInfo previousCulture; + DateTimeZoneHandling? previousDateTimeZoneHandling; + DateParseHandling? previousDateParseHandling; + FloatParseHandling? previousFloatParseHandling; + int? previousMaxDepth; + string previousDateFormatString; + SetupReader(reader, out previousCulture, out previousDateTimeZoneHandling, out previousDateParseHandling, out previousFloatParseHandling, out previousMaxDepth, out previousDateFormatString); + + TraceJsonReader traceJsonReader = (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) + ? new TraceJsonReader(reader) + : null; + + JsonSerializerInternalReader serializerReader = new JsonSerializerInternalReader(this); + serializerReader.Populate(traceJsonReader ?? reader, target); + + if (traceJsonReader != null) + { + TraceWriter.Trace(TraceLevel.Verbose, traceJsonReader.GetDeserializedJsonMessage(), null); + } + + ResetReader(reader, previousCulture, previousDateTimeZoneHandling, previousDateParseHandling, previousFloatParseHandling, previousMaxDepth, previousDateFormatString); + } + + /// + /// Deserializes the JSON structure contained by the specified . + /// + /// The that contains the JSON structure to deserialize. + /// The being deserialized. + public object Deserialize(JsonReader reader) + { + return Deserialize(reader, null); + } + + /// + /// Deserializes the JSON structure contained by the specified + /// into an instance of the specified type. + /// + /// The containing the object. + /// The of object being deserialized. + /// The instance of being deserialized. + public object Deserialize(TextReader reader, Type objectType) + { + return Deserialize(new JsonTextReader(reader), objectType); + } + + /// + /// Deserializes the JSON structure contained by the specified + /// into an instance of the specified type. + /// + /// The containing the object. + /// The type of the object to deserialize. + /// The instance of being deserialized. + public T Deserialize(JsonReader reader) + { + return (T)Deserialize(reader, typeof(T)); + } + + /// + /// Deserializes the JSON structure contained by the specified + /// into an instance of the specified type. + /// + /// The containing the object. + /// The of object being deserialized. + /// The instance of being deserialized. + public object Deserialize(JsonReader reader, Type objectType) + { + return DeserializeInternal(reader, objectType); + } + + internal virtual object DeserializeInternal(JsonReader reader, Type objectType) + { + ValidationUtils.ArgumentNotNull(reader, nameof(reader)); + + // set serialization options onto reader + CultureInfo previousCulture; + DateTimeZoneHandling? previousDateTimeZoneHandling; + DateParseHandling? previousDateParseHandling; + FloatParseHandling? previousFloatParseHandling; + int? previousMaxDepth; + string previousDateFormatString; + SetupReader(reader, out previousCulture, out previousDateTimeZoneHandling, out previousDateParseHandling, out previousFloatParseHandling, out previousMaxDepth, out previousDateFormatString); + + TraceJsonReader traceJsonReader = (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) + ? new TraceJsonReader(reader) + : null; + + JsonSerializerInternalReader serializerReader = new JsonSerializerInternalReader(this); + object value = serializerReader.Deserialize(traceJsonReader ?? reader, objectType, CheckAdditionalContent); + + if (traceJsonReader != null) + { + TraceWriter.Trace(TraceLevel.Verbose, traceJsonReader.GetDeserializedJsonMessage(), null); + } + + ResetReader(reader, previousCulture, previousDateTimeZoneHandling, previousDateParseHandling, previousFloatParseHandling, previousMaxDepth, previousDateFormatString); + + return value; + } + + private void SetupReader(JsonReader reader, out CultureInfo previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string previousDateFormatString) + { + if (_culture != null && !_culture.Equals(reader.Culture)) + { + previousCulture = reader.Culture; + reader.Culture = _culture; + } + else + { + previousCulture = null; + } + + if (_dateTimeZoneHandling != null && reader.DateTimeZoneHandling != _dateTimeZoneHandling) + { + previousDateTimeZoneHandling = reader.DateTimeZoneHandling; + reader.DateTimeZoneHandling = _dateTimeZoneHandling.GetValueOrDefault(); + } + else + { + previousDateTimeZoneHandling = null; + } + + if (_dateParseHandling != null && reader.DateParseHandling != _dateParseHandling) + { + previousDateParseHandling = reader.DateParseHandling; + reader.DateParseHandling = _dateParseHandling.GetValueOrDefault(); + } + else + { + previousDateParseHandling = null; + } + + if (_floatParseHandling != null && reader.FloatParseHandling != _floatParseHandling) + { + previousFloatParseHandling = reader.FloatParseHandling; + reader.FloatParseHandling = _floatParseHandling.GetValueOrDefault(); + } + else + { + previousFloatParseHandling = null; + } + + if (_maxDepthSet && reader.MaxDepth != _maxDepth) + { + previousMaxDepth = reader.MaxDepth; + reader.MaxDepth = _maxDepth; + } + else + { + previousMaxDepth = null; + } + + if (_dateFormatStringSet && reader.DateFormatString != _dateFormatString) + { + previousDateFormatString = reader.DateFormatString; + reader.DateFormatString = _dateFormatString; + } + else + { + previousDateFormatString = null; + } + + JsonTextReader textReader = reader as JsonTextReader; + if (textReader != null) + { + DefaultContractResolver resolver = _contractResolver as DefaultContractResolver; + if (resolver != null) + { + textReader.NameTable = resolver.GetState().NameTable; + } + } + } + + private void ResetReader(JsonReader reader, CultureInfo previousCulture, DateTimeZoneHandling? previousDateTimeZoneHandling, DateParseHandling? previousDateParseHandling, FloatParseHandling? previousFloatParseHandling, int? previousMaxDepth, string previousDateFormatString) + { + // reset reader back to previous options + if (previousCulture != null) + { + reader.Culture = previousCulture; + } + if (previousDateTimeZoneHandling != null) + { + reader.DateTimeZoneHandling = previousDateTimeZoneHandling.GetValueOrDefault(); + } + if (previousDateParseHandling != null) + { + reader.DateParseHandling = previousDateParseHandling.GetValueOrDefault(); + } + if (previousFloatParseHandling != null) + { + reader.FloatParseHandling = previousFloatParseHandling.GetValueOrDefault(); + } + if (_maxDepthSet) + { + reader.MaxDepth = previousMaxDepth; + } + if (_dateFormatStringSet) + { + reader.DateFormatString = previousDateFormatString; + } + + JsonTextReader textReader = reader as JsonTextReader; + if (textReader != null) + { + textReader.NameTable = null; + } + } + + /// + /// Serializes the specified and writes the JSON structure + /// to a Stream using the specified . + /// + /// The used to write the JSON structure. + /// The to serialize. + public void Serialize(TextWriter textWriter, object value) + { + Serialize(new JsonTextWriter(textWriter), value); + } + + /// + /// Serializes the specified and writes the JSON structure + /// to a Stream using the specified . + /// + /// The used to write the JSON structure. + /// The to serialize. + /// + /// The type of the value being serialized. + /// This parameter is used when is Auto to write out the type name if the type of the value does not match. + /// Specifing the type is optional. + /// + public void Serialize(JsonWriter jsonWriter, object value, Type objectType) + { + SerializeInternal(jsonWriter, value, objectType); + } + + /// + /// Serializes the specified and writes the JSON structure + /// to a Stream using the specified . + /// + /// The used to write the JSON structure. + /// The to serialize. + /// + /// The type of the value being serialized. + /// This parameter is used when is Auto to write out the type name if the type of the value does not match. + /// Specifing the type is optional. + /// + public void Serialize(TextWriter textWriter, object value, Type objectType) + { + Serialize(new JsonTextWriter(textWriter), value, objectType); + } + + /// + /// Serializes the specified and writes the JSON structure + /// to a Stream using the specified . + /// + /// The used to write the JSON structure. + /// The to serialize. + public void Serialize(JsonWriter jsonWriter, object value) + { + SerializeInternal(jsonWriter, value, null); + } + + internal virtual void SerializeInternal(JsonWriter jsonWriter, object value, Type objectType) + { + ValidationUtils.ArgumentNotNull(jsonWriter, nameof(jsonWriter)); + + // set serialization options onto writer + Formatting? previousFormatting = null; + if (_formatting != null && jsonWriter.Formatting != _formatting) + { + previousFormatting = jsonWriter.Formatting; + jsonWriter.Formatting = _formatting.GetValueOrDefault(); + } + + DateFormatHandling? previousDateFormatHandling = null; + if (_dateFormatHandling != null && jsonWriter.DateFormatHandling != _dateFormatHandling) + { + previousDateFormatHandling = jsonWriter.DateFormatHandling; + jsonWriter.DateFormatHandling = _dateFormatHandling.GetValueOrDefault(); + } + + DateTimeZoneHandling? previousDateTimeZoneHandling = null; + if (_dateTimeZoneHandling != null && jsonWriter.DateTimeZoneHandling != _dateTimeZoneHandling) + { + previousDateTimeZoneHandling = jsonWriter.DateTimeZoneHandling; + jsonWriter.DateTimeZoneHandling = _dateTimeZoneHandling.GetValueOrDefault(); + } + + FloatFormatHandling? previousFloatFormatHandling = null; + if (_floatFormatHandling != null && jsonWriter.FloatFormatHandling != _floatFormatHandling) + { + previousFloatFormatHandling = jsonWriter.FloatFormatHandling; + jsonWriter.FloatFormatHandling = _floatFormatHandling.GetValueOrDefault(); + } + + StringEscapeHandling? previousStringEscapeHandling = null; + if (_stringEscapeHandling != null && jsonWriter.StringEscapeHandling != _stringEscapeHandling) + { + previousStringEscapeHandling = jsonWriter.StringEscapeHandling; + jsonWriter.StringEscapeHandling = _stringEscapeHandling.GetValueOrDefault(); + } + + CultureInfo previousCulture = null; + if (_culture != null && !_culture.Equals(jsonWriter.Culture)) + { + previousCulture = jsonWriter.Culture; + jsonWriter.Culture = _culture; + } + + string previousDateFormatString = null; + if (_dateFormatStringSet && jsonWriter.DateFormatString != _dateFormatString) + { + previousDateFormatString = jsonWriter.DateFormatString; + jsonWriter.DateFormatString = _dateFormatString; + } + + TraceJsonWriter traceJsonWriter = (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) + ? new TraceJsonWriter(jsonWriter) + : null; + + JsonSerializerInternalWriter serializerWriter = new JsonSerializerInternalWriter(this); + serializerWriter.Serialize(traceJsonWriter ?? jsonWriter, value, objectType); + + if (traceJsonWriter != null) + { + TraceWriter.Trace(TraceLevel.Verbose, traceJsonWriter.GetSerializedJsonMessage(), null); + } + + // reset writer back to previous options + if (previousFormatting != null) + { + jsonWriter.Formatting = previousFormatting.GetValueOrDefault(); + } + if (previousDateFormatHandling != null) + { + jsonWriter.DateFormatHandling = previousDateFormatHandling.GetValueOrDefault(); + } + if (previousDateTimeZoneHandling != null) + { + jsonWriter.DateTimeZoneHandling = previousDateTimeZoneHandling.GetValueOrDefault(); + } + if (previousFloatFormatHandling != null) + { + jsonWriter.FloatFormatHandling = previousFloatFormatHandling.GetValueOrDefault(); + } + if (previousStringEscapeHandling != null) + { + jsonWriter.StringEscapeHandling = previousStringEscapeHandling.GetValueOrDefault(); + } + if (_dateFormatStringSet) + { + jsonWriter.DateFormatString = previousDateFormatString; + } + if (previousCulture != null) + { + jsonWriter.Culture = previousCulture; + } + } + + internal IReferenceResolver GetReferenceResolver() + { + if (_referenceResolver == null) + { + _referenceResolver = new DefaultReferenceResolver(); + } + + return _referenceResolver; + } + + internal JsonConverter GetMatchingConverter(Type type) + { + return GetMatchingConverter(_converters, type); + } + + internal static JsonConverter GetMatchingConverter(IList converters, Type objectType) + { +#if DEBUG + ValidationUtils.ArgumentNotNull(objectType, nameof(objectType)); +#endif + + if (converters != null) + { + for (int i = 0; i < converters.Count; i++) + { + JsonConverter converter = converters[i]; + + if (converter.CanConvert(objectType)) + { + return converter; + } + } + } + + return null; + } + + internal void OnError(ErrorEventArgs e) + { + EventHandler error = Error; + if (error != null) + { + error(this, e); + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonSerializerSettings.cs b/Common/00-1Json8.3/Json8.3/JsonSerializerSettings.cs new file mode 100644 index 0000000..d3b9b49 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonSerializerSettings.cs @@ -0,0 +1,403 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Runtime.Serialization.Formatters; +using Newtonsoft.Json.Serialization; +using System.Runtime.Serialization; + +namespace Newtonsoft.Json +{ + /// + /// Specifies the settings on a object. + /// + public class JsonSerializerSettings + { + internal const ReferenceLoopHandling DefaultReferenceLoopHandling = ReferenceLoopHandling.Error; + internal const MissingMemberHandling DefaultMissingMemberHandling = MissingMemberHandling.Ignore; + internal const NullValueHandling DefaultNullValueHandling = NullValueHandling.Include; + internal const DefaultValueHandling DefaultDefaultValueHandling = DefaultValueHandling.Include; + internal const ObjectCreationHandling DefaultObjectCreationHandling = ObjectCreationHandling.Auto; + internal const PreserveReferencesHandling DefaultPreserveReferencesHandling = PreserveReferencesHandling.None; + internal const ConstructorHandling DefaultConstructorHandling = ConstructorHandling.Default; + internal const TypeNameHandling DefaultTypeNameHandling = TypeNameHandling.None; + internal const MetadataPropertyHandling DefaultMetadataPropertyHandling = MetadataPropertyHandling.Default; + internal const FormatterAssemblyStyle DefaultTypeNameAssemblyFormat = FormatterAssemblyStyle.Simple; + internal static readonly StreamingContext DefaultContext; + + internal const Formatting DefaultFormatting = Formatting.None; + internal const DateFormatHandling DefaultDateFormatHandling = DateFormatHandling.IsoDateFormat; + internal const DateTimeZoneHandling DefaultDateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; + internal const DateParseHandling DefaultDateParseHandling = DateParseHandling.DateTime; + internal const FloatParseHandling DefaultFloatParseHandling = FloatParseHandling.Double; + internal const FloatFormatHandling DefaultFloatFormatHandling = FloatFormatHandling.String; + internal const StringEscapeHandling DefaultStringEscapeHandling = StringEscapeHandling.Default; + internal const FormatterAssemblyStyle DefaultFormatterAssemblyStyle = FormatterAssemblyStyle.Simple; + internal static readonly CultureInfo DefaultCulture; + internal const bool DefaultCheckAdditionalContent = false; + internal const string DefaultDateFormatString = @"yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; + + internal Formatting? _formatting; + internal DateFormatHandling? _dateFormatHandling; + internal DateTimeZoneHandling? _dateTimeZoneHandling; + internal DateParseHandling? _dateParseHandling; + internal FloatFormatHandling? _floatFormatHandling; + internal FloatParseHandling? _floatParseHandling; + internal StringEscapeHandling? _stringEscapeHandling; + internal CultureInfo _culture; + internal bool? _checkAdditionalContent; + internal int? _maxDepth; + internal bool _maxDepthSet; + internal string _dateFormatString; + internal bool _dateFormatStringSet; + internal FormatterAssemblyStyle? _typeNameAssemblyFormat; + internal DefaultValueHandling? _defaultValueHandling; + internal PreserveReferencesHandling? _preserveReferencesHandling; + internal NullValueHandling? _nullValueHandling; + internal ObjectCreationHandling? _objectCreationHandling; + internal MissingMemberHandling? _missingMemberHandling; + internal ReferenceLoopHandling? _referenceLoopHandling; + internal StreamingContext? _context; + internal ConstructorHandling? _constructorHandling; + internal TypeNameHandling? _typeNameHandling; + internal MetadataPropertyHandling? _metadataPropertyHandling; + + /// + /// Gets or sets how reference loops (e.g. a class referencing itself) is handled. + /// + /// Reference loop handling. + public ReferenceLoopHandling ReferenceLoopHandling + { + get { return _referenceLoopHandling ?? DefaultReferenceLoopHandling; } + set { _referenceLoopHandling = value; } + } + + /// + /// Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + /// + /// Missing member handling. + public MissingMemberHandling MissingMemberHandling + { + get { return _missingMemberHandling ?? DefaultMissingMemberHandling; } + set { _missingMemberHandling = value; } + } + + /// + /// Gets or sets how objects are created during deserialization. + /// + /// The object creation handling. + public ObjectCreationHandling ObjectCreationHandling + { + get { return _objectCreationHandling ?? DefaultObjectCreationHandling; } + set { _objectCreationHandling = value; } + } + + /// + /// Gets or sets how null values are handled during serialization and deserialization. + /// + /// Null value handling. + public NullValueHandling NullValueHandling + { + get { return _nullValueHandling ?? DefaultNullValueHandling; } + set { _nullValueHandling = value; } + } + + /// + /// Gets or sets how null default are handled during serialization and deserialization. + /// + /// The default value handling. + public DefaultValueHandling DefaultValueHandling + { + get { return _defaultValueHandling ?? DefaultDefaultValueHandling; } + set { _defaultValueHandling = value; } + } + + /// + /// Gets or sets a collection that will be used during serialization. + /// + /// The converters. + public IList Converters { get; set; } + + /// + /// Gets or sets how object references are preserved by the serializer. + /// + /// The preserve references handling. + public PreserveReferencesHandling PreserveReferencesHandling + { + get { return _preserveReferencesHandling ?? DefaultPreserveReferencesHandling; } + set { _preserveReferencesHandling = value; } + } + + /// + /// Gets or sets how type name writing and reading is handled by the serializer. + /// + /// + /// should be used with caution when your application deserializes JSON from an external source. + /// Incoming types should be validated with a custom + /// when deserializing with a value other than TypeNameHandling.None. + /// + /// The type name handling. + public TypeNameHandling TypeNameHandling + { + get { return _typeNameHandling ?? DefaultTypeNameHandling; } + set { _typeNameHandling = value; } + } + + /// + /// Gets or sets how metadata properties are used during deserialization. + /// + /// The metadata properties handling. + public MetadataPropertyHandling MetadataPropertyHandling + { + get { return _metadataPropertyHandling ?? DefaultMetadataPropertyHandling; } + set { _metadataPropertyHandling = value; } + } + + /// + /// Gets or sets how a type name assembly is written and resolved by the serializer. + /// + /// The type name assembly format. + public FormatterAssemblyStyle TypeNameAssemblyFormat + { + get { return _typeNameAssemblyFormat ?? DefaultFormatterAssemblyStyle; } + set { _typeNameAssemblyFormat = value; } + } + + /// + /// Gets or sets how constructors are used during deserialization. + /// + /// The constructor handling. + public ConstructorHandling ConstructorHandling + { + get { return _constructorHandling ?? DefaultConstructorHandling; } + set { _constructorHandling = value; } + } + + /// + /// Gets or sets the contract resolver used by the serializer when + /// serializing .NET objects to JSON and vice versa. + /// + /// The contract resolver. + public IContractResolver ContractResolver { get; set; } + + /// + /// Gets or sets the equality comparer used by the serializer when comparing references. + /// + /// The equality comparer. + public IEqualityComparer EqualityComparer { get; set; } + + /// + /// Gets or sets the used by the serializer when resolving references. + /// + /// The reference resolver. + [ObsoleteAttribute("ReferenceResolver property is obsolete. Use the ReferenceResolverProvider property to set the IReferenceResolver: settings.ReferenceResolverProvider = () => resolver")] + public IReferenceResolver ReferenceResolver + { + get + { + if (ReferenceResolverProvider == null) + { + return null; + } + + return ReferenceResolverProvider(); + } + set + { + ReferenceResolverProvider = (value != null) + ? () => value + : (Func)null; + } + } + + /// + /// Gets or sets a function that creates the used by the serializer when resolving references. + /// + /// A function that creates the used by the serializer when resolving references. + public Func ReferenceResolverProvider { get; set; } + + /// + /// Gets or sets the used by the serializer when writing trace messages. + /// + /// The trace writer. + public ITraceWriter TraceWriter { get; set; } + + /// + /// Gets or sets the used by the serializer when resolving type names. + /// + /// The binder. + public SerializationBinder Binder { get; set; } + + /// + /// Gets or sets the error handler called during serialization and deserialization. + /// + /// The error handler called during serialization and deserialization. + public EventHandler Error { get; set; } + + /// + /// Gets or sets the used by the serializer when invoking serialization callback methods. + /// + /// The context. + public StreamingContext Context + { + get { return _context ?? DefaultContext; } + set { _context = value; } + } + + /// + /// Get or set how and values are formatted when writing JSON text, and the expected date format when reading JSON text. + /// + public string DateFormatString + { + get { return _dateFormatString ?? DefaultDateFormatString; } + set + { + _dateFormatString = value; + _dateFormatStringSet = true; + } + } + + /// + /// Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + /// + public int? MaxDepth + { + get { return _maxDepth; } + set + { + if (value <= 0) + { + throw new ArgumentException("Value must be positive.", nameof(value)); + } + + _maxDepth = value; + _maxDepthSet = true; + } + } + + /// + /// Indicates how JSON text output is formatted. + /// + public Formatting Formatting + { + get { return _formatting ?? DefaultFormatting; } + set { _formatting = value; } + } + + /// + /// Get or set how dates are written to JSON text. + /// + public DateFormatHandling DateFormatHandling + { + get { return _dateFormatHandling ?? DefaultDateFormatHandling; } + set { _dateFormatHandling = value; } + } + + /// + /// Get or set how time zones are handling during serialization and deserialization. + /// + public DateTimeZoneHandling DateTimeZoneHandling + { + get { return _dateTimeZoneHandling ?? DefaultDateTimeZoneHandling; } + set { _dateTimeZoneHandling = value; } + } + + /// + /// Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + /// + public DateParseHandling DateParseHandling + { + get { return _dateParseHandling ?? DefaultDateParseHandling; } + set { _dateParseHandling = value; } + } + + /// + /// Get or set how special floating point numbers, e.g. , + /// and , + /// are written as JSON. + /// + public FloatFormatHandling FloatFormatHandling + { + get { return _floatFormatHandling ?? DefaultFloatFormatHandling; } + set { _floatFormatHandling = value; } + } + + /// + /// Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + /// + public FloatParseHandling FloatParseHandling + { + get { return _floatParseHandling ?? DefaultFloatParseHandling; } + set { _floatParseHandling = value; } + } + + /// + /// Get or set how strings are escaped when writing JSON text. + /// + public StringEscapeHandling StringEscapeHandling + { + get { return _stringEscapeHandling ?? DefaultStringEscapeHandling; } + set { _stringEscapeHandling = value; } + } + + /// + /// Gets or sets the culture used when reading JSON. Defaults to . + /// + public CultureInfo Culture + { + get { return _culture ?? DefaultCulture; } + set { _culture = value; } + } + + /// + /// Gets a value indicating whether there will be a check for additional content after deserializing an object. + /// + /// + /// true if there will be a check for additional content after deserializing an object; otherwise, false. + /// + public bool CheckAdditionalContent + { + get { return _checkAdditionalContent ?? DefaultCheckAdditionalContent; } + set { _checkAdditionalContent = value; } + } + + static JsonSerializerSettings() + { + DefaultContext = new StreamingContext(); + DefaultCulture = CultureInfo.InvariantCulture; + } + + /// + /// Initializes a new instance of the class. + /// + public JsonSerializerSettings() + { + Converters = new List(); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonTextReader.cs b/Common/00-1Json8.3/Json8.3/JsonTextReader.cs new file mode 100644 index 0000000..96a3ee8 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonTextReader.cs @@ -0,0 +1,2380 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Text; +using System.IO; +using System.Globalization; +#if !(PORTABLE || PORTABLE40 || NET35 || NET20) +using System.Numerics; +#endif +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json +{ + internal enum ReadType + { + Read, + ReadAsInt32, + ReadAsBytes, + ReadAsString, + ReadAsDecimal, + ReadAsDateTime, +#if !NET20 + ReadAsDateTimeOffset, +#endif + ReadAsDouble, + ReadAsBoolean + } + + /// + /// Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + /// + public class JsonTextReader : JsonReader, IJsonLineInfo + { + private const char UnicodeReplacementChar = '\uFFFD'; + private const int MaximumJavascriptIntegerCharacterLength = 380; + + private readonly TextReader _reader; + private char[] _chars; + private int _charsUsed; + private int _charPos; + private int _lineStartPos; + private int _lineNumber; + private bool _isEndOfFile; + private StringBuffer _stringBuffer; + private StringReference _stringReference; + private IArrayPool _arrayPool; + internal PropertyNameTable NameTable; + + /// + /// Initializes a new instance of the class with the specified . + /// + /// The TextReader containing the XML data to read. + public JsonTextReader(TextReader reader) + { + if (reader == null) + { + throw new ArgumentNullException(nameof(reader)); + } + + _reader = reader; + _lineNumber = 1; + } + +#if DEBUG + internal void SetCharBuffer(char[] chars) + { + _chars = chars; + } +#endif + + /// + /// Gets or sets the reader's character buffer pool. + /// + public IArrayPool ArrayPool + { + get { return _arrayPool; } + set + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + _arrayPool = value; + } + } + + private void EnsureBufferNotEmpty() + { + if (_stringBuffer.IsEmpty) + { + _stringBuffer = new StringBuffer(_arrayPool, 1024); + } + } + + private void OnNewLine(int pos) + { + _lineNumber++; + _lineStartPos = pos; + } + + private void ParseString(char quote, ReadType readType) + { + _charPos++; + + ShiftBufferIfNeeded(); + ReadStringIntoBuffer(quote); + SetPostValueState(true); + + switch (readType) + { + case ReadType.ReadAsBytes: + Guid g; + byte[] data; + if (_stringReference.Length == 0) + { + data = new byte[0]; + } + else if (_stringReference.Length == 36 && ConvertUtils.TryConvertGuid(_stringReference.ToString(), out g)) + { + data = g.ToByteArray(); + } + else + { + data = Convert.FromBase64CharArray(_stringReference.Chars, _stringReference.StartIndex, _stringReference.Length); + } + + SetToken(JsonToken.Bytes, data, false); + break; + case ReadType.ReadAsString: + string text = _stringReference.ToString(); + + SetToken(JsonToken.String, text, false); + _quoteChar = quote; + break; + case ReadType.ReadAsInt32: + case ReadType.ReadAsDecimal: + case ReadType.ReadAsBoolean: + // caller will convert result + break; + default: + if (_dateParseHandling != DateParseHandling.None) + { + DateParseHandling dateParseHandling; + if (readType == ReadType.ReadAsDateTime) + { + dateParseHandling = DateParseHandling.DateTime; + } +#if !NET20 + else if (readType == ReadType.ReadAsDateTimeOffset) + { + dateParseHandling = DateParseHandling.DateTimeOffset; + } +#endif + else + { + dateParseHandling = _dateParseHandling; + } + + if (dateParseHandling == DateParseHandling.DateTime) + { + DateTime dt; + if (DateTimeUtils.TryParseDateTime(_stringReference, DateTimeZoneHandling, DateFormatString, Culture, out dt)) + { + SetToken(JsonToken.Date, dt, false); + return; + } + } +#if !NET20 + else + { + DateTimeOffset dt; + if (DateTimeUtils.TryParseDateTimeOffset(_stringReference, DateFormatString, Culture, out dt)) + { + SetToken(JsonToken.Date, dt, false); + return; + } + } +#endif + } + + SetToken(JsonToken.String, _stringReference.ToString(), false); + _quoteChar = quote; + break; + } + } + + private static void BlockCopyChars(char[] src, int srcOffset, char[] dst, int dstOffset, int count) + { + const int charByteCount = 2; + + Buffer.BlockCopy(src, srcOffset * charByteCount, dst, dstOffset * charByteCount, count * charByteCount); + } + + private void ShiftBufferIfNeeded() + { + // once in the last 10% of the buffer shift the remaining content to the start to avoid + // unnessesarly increasing the buffer size when reading numbers/strings + int length = _chars.Length; + if (length - _charPos <= length * 0.1) + { + int count = _charsUsed - _charPos; + if (count > 0) + { + BlockCopyChars(_chars, _charPos, _chars, 0, count); + } + + _lineStartPos -= _charPos; + _charPos = 0; + _charsUsed = count; + _chars[_charsUsed] = '\0'; + } + } + + private int ReadData(bool append) + { + return ReadData(append, 0); + } + + private int ReadData(bool append, int charsRequired) + { + if (_isEndOfFile) + { + return 0; + } + + // char buffer is full + if (_charsUsed + charsRequired >= _chars.Length - 1) + { + if (append) + { + // copy to new array either double the size of the current or big enough to fit required content + int newArrayLength = Math.Max(_chars.Length * 2, _charsUsed + charsRequired + 1); + + // increase the size of the buffer + char[] dst = BufferUtils.RentBuffer(_arrayPool, newArrayLength); + + BlockCopyChars(_chars, 0, dst, 0, _chars.Length); + + BufferUtils.ReturnBuffer(_arrayPool, _chars); + + _chars = dst; + } + else + { + int remainingCharCount = _charsUsed - _charPos; + + if (remainingCharCount + charsRequired + 1 >= _chars.Length) + { + // the remaining count plus the required is bigger than the current buffer size + char[] dst = BufferUtils.RentBuffer(_arrayPool, remainingCharCount + charsRequired + 1); + + if (remainingCharCount > 0) + { + BlockCopyChars(_chars, _charPos, dst, 0, remainingCharCount); + } + + BufferUtils.ReturnBuffer(_arrayPool, _chars); + + _chars = dst; + } + else + { + // copy any remaining data to the beginning of the buffer if needed and reset positions + if (remainingCharCount > 0) + { + BlockCopyChars(_chars, _charPos, _chars, 0, remainingCharCount); + } + } + + _lineStartPos -= _charPos; + _charPos = 0; + _charsUsed = remainingCharCount; + } + } + + int attemptCharReadCount = _chars.Length - _charsUsed - 1; + + int charsRead = _reader.Read(_chars, _charsUsed, attemptCharReadCount); + + _charsUsed += charsRead; + + if (charsRead == 0) + { + _isEndOfFile = true; + } + + _chars[_charsUsed] = '\0'; + return charsRead; + } + + private bool EnsureChars(int relativePosition, bool append) + { + if (_charPos + relativePosition >= _charsUsed) + { + return ReadChars(relativePosition, append); + } + + return true; + } + + private bool ReadChars(int relativePosition, bool append) + { + if (_isEndOfFile) + { + return false; + } + + int charsRequired = _charPos + relativePosition - _charsUsed + 1; + + int totalCharsRead = 0; + + // it is possible that the TextReader doesn't return all data at once + // repeat read until the required text is returned or the reader is out of content + do + { + int charsRead = ReadData(append, charsRequired - totalCharsRead); + + // no more content + if (charsRead == 0) + { + break; + } + + totalCharsRead += charsRead; + } while (totalCharsRead < charsRequired); + + if (totalCharsRead < charsRequired) + { + return false; + } + return true; + } + + /// + /// Reads the next JSON token from the stream. + /// + /// + /// true if the next token was read successfully; false if there are no more tokens to read. + /// + public override bool Read() + { + EnsureBuffer(); + + while (true) + { + switch (_currentState) + { + case State.Start: + case State.Property: + case State.Array: + case State.ArrayStart: + case State.Constructor: + case State.ConstructorStart: + return ParseValue(); + case State.Object: + case State.ObjectStart: + return ParseObject(); + case State.PostValue: + // returns true if it hits + // end of object or array + if (ParsePostValue()) + { + return true; + } + break; + case State.Finished: + if (EnsureChars(0, false)) + { + EatWhitespace(false); + if (_isEndOfFile) + { + SetToken(JsonToken.None); + return false; + } + if (_chars[_charPos] == '/') + { + ParseComment(true); + return true; + } + + throw JsonReaderException.Create(this, "Additional text encountered after finished reading JSON content: {0}.".FormatWith(CultureInfo.InvariantCulture, _chars[_charPos])); + } + SetToken(JsonToken.None); + return false; + default: + throw JsonReaderException.Create(this, "Unexpected state: {0}.".FormatWith(CultureInfo.InvariantCulture, CurrentState)); + } + } + } + + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . This method will return null at the end of an array. + public override int? ReadAsInt32() + { + return (int?)ReadNumberValue(ReadType.ReadAsInt32); + } + + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . This method will return null at the end of an array. + public override DateTime? ReadAsDateTime() + { + return (DateTime?)ReadStringValue(ReadType.ReadAsDateTime); + } + + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . This method will return null at the end of an array. + public override string ReadAsString() + { + return (string)ReadStringValue(ReadType.ReadAsString); + } + + /// + /// Reads the next JSON token from the stream as a []. + /// + /// A [] or a null reference if the next JSON token is null. This method will return null at the end of an array. + public override byte[] ReadAsBytes() + { + EnsureBuffer(); + bool isWrapped = false; + + switch (_currentState) + { + case State.Start: + case State.Property: + case State.Array: + case State.ArrayStart: + case State.Constructor: + case State.ConstructorStart: + case State.PostValue: + while (true) + { + char currentChar = _chars[_charPos]; + + switch (currentChar) + { + case '\0': + if (ReadNullChar()) + { + SetToken(JsonToken.None, null, false); + return null; + } + break; + case '"': + case '\'': + ParseString(currentChar, ReadType.ReadAsBytes); + byte[] data = (byte[])Value; + if (isWrapped) + { + ReaderReadAndAssert(); + if (TokenType != JsonToken.EndObject) + { + throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); + } + SetToken(JsonToken.Bytes, data, false); + } + return data; + case '{': + _charPos++; + SetToken(JsonToken.StartObject); + ReadIntoWrappedTypeObject(); + isWrapped = true; + break; + case '[': + _charPos++; + SetToken(JsonToken.StartArray); + return ReadArrayIntoByteArray(); + case 'n': + HandleNull(); + return null; + case '/': + ParseComment(false); + break; + case ',': + ProcessValueComma(); + break; + case ']': + _charPos++; + if (_currentState == State.Array || _currentState == State.ArrayStart || _currentState == State.PostValue) + { + SetToken(JsonToken.EndArray); + return null; + } + throw CreateUnexpectedCharacterException(currentChar); + case StringUtils.CarriageReturn: + ProcessCarriageReturn(false); + break; + case StringUtils.LineFeed: + ProcessLineFeed(); + break; + case ' ': + case StringUtils.Tab: + // eat + _charPos++; + break; + default: + _charPos++; + + if (!char.IsWhiteSpace(currentChar)) + { + throw CreateUnexpectedCharacterException(currentChar); + } + + // eat + break; + } + } + case State.Finished: + ReadFinished(); + return null; + default: + throw JsonReaderException.Create(this, "Unexpected state: {0}.".FormatWith(CultureInfo.InvariantCulture, CurrentState)); + } + } + + private object ReadStringValue(ReadType readType) + { + EnsureBuffer(); + + switch (_currentState) + { + case State.Start: + case State.Property: + case State.Array: + case State.ArrayStart: + case State.Constructor: + case State.ConstructorStart: + case State.PostValue: + while (true) + { + char currentChar = _chars[_charPos]; + + switch (currentChar) + { + case '\0': + if (ReadNullChar()) + { + SetToken(JsonToken.None, null, false); + return null; + } + break; + case '"': + case '\'': + ParseString(currentChar, readType); + switch (readType) + { + case ReadType.ReadAsBytes: + return Value; + case ReadType.ReadAsString: + return Value; + case ReadType.ReadAsDateTime: + if (Value is DateTime) + { + return (DateTime)Value; + } + return ReadDateTimeString((string)Value); +#if !NET20 + case ReadType.ReadAsDateTimeOffset: + if (Value is DateTimeOffset) + { + return (DateTimeOffset)Value; + } + return ReadDateTimeOffsetString((string)Value); +#endif + default: + throw new ArgumentOutOfRangeException(nameof(readType)); + } + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (readType != ReadType.ReadAsString) + { + _charPos++; + throw CreateUnexpectedCharacterException(currentChar); + } + ParseNumber(ReadType.Read); + string s = ((IFormattable)Value).ToString(null, CultureInfo.InvariantCulture); + SetToken(JsonToken.String, s); + return s; + case 't': + case 'f': + if (readType != ReadType.ReadAsString) + { + _charPos++; + throw CreateUnexpectedCharacterException(currentChar); + } + string expected = currentChar == 't' ? JsonConvert.True : JsonConvert.False; + if (!MatchValueWithTrailingSeparator(expected)) + { + throw CreateUnexpectedCharacterException(_chars[_charPos]); + } + SetToken(JsonToken.String, expected); + return expected; + case 'n': + HandleNull(); + return null; + case '/': + ParseComment(false); + break; + case ',': + ProcessValueComma(); + break; + case ']': + _charPos++; + if (_currentState == State.Array || _currentState == State.ArrayStart || _currentState == State.PostValue) + { + SetToken(JsonToken.EndArray); + return null; + } + throw CreateUnexpectedCharacterException(currentChar); + case StringUtils.CarriageReturn: + ProcessCarriageReturn(false); + break; + case StringUtils.LineFeed: + ProcessLineFeed(); + break; + case ' ': + case StringUtils.Tab: + // eat + _charPos++; + break; + default: + _charPos++; + + if (!char.IsWhiteSpace(currentChar)) + { + throw CreateUnexpectedCharacterException(currentChar); + } + + // eat + break; + } + } + case State.Finished: + ReadFinished(); + return null; + default: + throw JsonReaderException.Create(this, "Unexpected state: {0}.".FormatWith(CultureInfo.InvariantCulture, CurrentState)); + } + } + + private JsonReaderException CreateUnexpectedCharacterException(char c) + { + return JsonReaderException.Create(this, "Unexpected character encountered while parsing value: {0}.".FormatWith(CultureInfo.InvariantCulture, c)); + } + + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . This method will return null at the end of an array. + public override bool? ReadAsBoolean() + { + EnsureBuffer(); + + switch (_currentState) + { + case State.Start: + case State.Property: + case State.Array: + case State.ArrayStart: + case State.Constructor: + case State.ConstructorStart: + case State.PostValue: + while (true) + { + char currentChar = _chars[_charPos]; + + switch (currentChar) + { + case '\0': + if (ReadNullChar()) + { + SetToken(JsonToken.None, null, false); + return null; + } + break; + case '"': + case '\'': + ParseString(currentChar, ReadType.Read); + return ReadBooleanString(_stringReference.ToString()); + case 'n': + HandleNull(); + return null; + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + ParseNumber(ReadType.Read); + bool b; +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (Value is BigInteger) + { + b = (BigInteger)Value != 0; + } + else +#endif + { + b = Convert.ToBoolean(Value, CultureInfo.InvariantCulture); + } + SetToken(JsonToken.Boolean, b, false); + return b; + case 't': + case 'f': + bool isTrue = currentChar == 't'; + string expected = isTrue ? JsonConvert.True : JsonConvert.False; + + if (!MatchValueWithTrailingSeparator(expected)) + { + throw CreateUnexpectedCharacterException(_chars[_charPos]); + } + SetToken(JsonToken.Boolean, isTrue); + return isTrue; + case '/': + ParseComment(false); + break; + case ',': + ProcessValueComma(); + break; + case ']': + _charPos++; + if (_currentState == State.Array || _currentState == State.ArrayStart || _currentState == State.PostValue) + { + SetToken(JsonToken.EndArray); + return null; + } + throw CreateUnexpectedCharacterException(currentChar); + case StringUtils.CarriageReturn: + ProcessCarriageReturn(false); + break; + case StringUtils.LineFeed: + ProcessLineFeed(); + break; + case ' ': + case StringUtils.Tab: + // eat + _charPos++; + break; + default: + _charPos++; + + if (!char.IsWhiteSpace(currentChar)) + { + throw CreateUnexpectedCharacterException(currentChar); + } + + // eat + break; + } + } + case State.Finished: + ReadFinished(); + return null; + default: + throw JsonReaderException.Create(this, "Unexpected state: {0}.".FormatWith(CultureInfo.InvariantCulture, CurrentState)); + } + } + + private void ProcessValueComma() + { + _charPos++; + + if (_currentState != State.PostValue) + { + SetToken(JsonToken.Undefined); + throw CreateUnexpectedCharacterException(','); + } + + SetStateBasedOnCurrent(); + } + + private object ReadNumberValue(ReadType readType) + { + EnsureBuffer(); + + switch (_currentState) + { + case State.Start: + case State.Property: + case State.Array: + case State.ArrayStart: + case State.Constructor: + case State.ConstructorStart: + case State.PostValue: + while (true) + { + char currentChar = _chars[_charPos]; + + switch (currentChar) + { + case '\0': + if (ReadNullChar()) + { + SetToken(JsonToken.None, null, false); + return null; + } + break; + case '"': + case '\'': + ParseString(currentChar, readType); + switch (readType) + { + case ReadType.ReadAsInt32: + return ReadInt32String(_stringReference.ToString()); + case ReadType.ReadAsDecimal: + return ReadDecimalString(_stringReference.ToString()); + case ReadType.ReadAsDouble: + return ReadDoubleString(_stringReference.ToString()); + default: + throw new ArgumentOutOfRangeException(nameof(readType)); + } + case 'n': + HandleNull(); + return null; + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + ParseNumber(readType); + return Value; + case '/': + ParseComment(false); + break; + case ',': + ProcessValueComma(); + break; + case ']': + _charPos++; + if (_currentState == State.Array || _currentState == State.ArrayStart || _currentState == State.PostValue) + { + SetToken(JsonToken.EndArray); + return null; + } + throw CreateUnexpectedCharacterException(currentChar); + case StringUtils.CarriageReturn: + ProcessCarriageReturn(false); + break; + case StringUtils.LineFeed: + ProcessLineFeed(); + break; + case ' ': + case StringUtils.Tab: + // eat + _charPos++; + break; + default: + _charPos++; + + if (!char.IsWhiteSpace(currentChar)) + { + throw CreateUnexpectedCharacterException(currentChar); + } + + // eat + break; + } + } + case State.Finished: + ReadFinished(); + return null; + default: + throw JsonReaderException.Create(this, "Unexpected state: {0}.".FormatWith(CultureInfo.InvariantCulture, CurrentState)); + } + } + +#if !NET20 + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . This method will return null at the end of an array. + public override DateTimeOffset? ReadAsDateTimeOffset() + { + return (DateTimeOffset?)ReadStringValue(ReadType.ReadAsDateTimeOffset); + } +#endif + + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . This method will return null at the end of an array. + public override decimal? ReadAsDecimal() + { + return (decimal?)ReadNumberValue(ReadType.ReadAsDecimal); + } + + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . This method will return null at the end of an array. + public override double? ReadAsDouble() + { + return (double?)ReadNumberValue(ReadType.ReadAsDouble); + } + + private void HandleNull() + { + if (EnsureChars(1, true)) + { + char next = _chars[_charPos + 1]; + + if (next == 'u') + { + ParseNull(); + return; + } + + _charPos += 2; + throw CreateUnexpectedCharacterException(_chars[_charPos - 1]); + } + + _charPos = _charsUsed; + throw CreateUnexpectedEndException(); + } + + private void ReadFinished() + { + if (EnsureChars(0, false)) + { + EatWhitespace(false); + if (_isEndOfFile) + { + return; + } + if (_chars[_charPos] == '/') + { + ParseComment(false); + } + else + { + throw JsonReaderException.Create(this, "Additional text encountered after finished reading JSON content: {0}.".FormatWith(CultureInfo.InvariantCulture, _chars[_charPos])); + } + } + + SetToken(JsonToken.None); + } + + private bool ReadNullChar() + { + if (_charsUsed == _charPos) + { + if (ReadData(false) == 0) + { + _isEndOfFile = true; + return true; + } + } + else + { + _charPos++; + } + + return false; + } + + private void EnsureBuffer() + { + if (_chars == null) + { + _chars = BufferUtils.RentBuffer(_arrayPool, 1024); + _chars[0] = '\0'; + } + } + + private void ReadStringIntoBuffer(char quote) + { + int charPos = _charPos; + int initialPosition = _charPos; + int lastWritePosition = _charPos; + _stringBuffer.Position = 0; + + while (true) + { + switch (_chars[charPos++]) + { + case '\0': + if (_charsUsed == charPos - 1) + { + charPos--; + + if (ReadData(true) == 0) + { + _charPos = charPos; + throw JsonReaderException.Create(this, "Unterminated string. Expected delimiter: {0}.".FormatWith(CultureInfo.InvariantCulture, quote)); + } + } + break; + case '\\': + _charPos = charPos; + if (!EnsureChars(0, true)) + { + throw JsonReaderException.Create(this, "Unterminated string. Expected delimiter: {0}.".FormatWith(CultureInfo.InvariantCulture, quote)); + } + + // start of escape sequence + int escapeStartPos = charPos - 1; + + char currentChar = _chars[charPos]; + charPos++; + + char writeChar; + + switch (currentChar) + { + case 'b': + writeChar = '\b'; + break; + case 't': + writeChar = '\t'; + break; + case 'n': + writeChar = '\n'; + break; + case 'f': + writeChar = '\f'; + break; + case 'r': + writeChar = '\r'; + break; + case '\\': + writeChar = '\\'; + break; + case '"': + case '\'': + case '/': + writeChar = currentChar; + break; + case 'u': + _charPos = charPos; + writeChar = ParseUnicode(); + + if (StringUtils.IsLowSurrogate(writeChar)) + { + // low surrogate with no preceding high surrogate; this char is replaced + writeChar = UnicodeReplacementChar; + } + else if (StringUtils.IsHighSurrogate(writeChar)) + { + bool anotherHighSurrogate; + + // loop for handling situations where there are multiple consecutive high surrogates + do + { + anotherHighSurrogate = false; + + // potential start of a surrogate pair + if (EnsureChars(2, true) && _chars[_charPos] == '\\' && _chars[_charPos + 1] == 'u') + { + char highSurrogate = writeChar; + + _charPos += 2; + writeChar = ParseUnicode(); + + if (StringUtils.IsLowSurrogate(writeChar)) + { + // a valid surrogate pair! + } + else if (StringUtils.IsHighSurrogate(writeChar)) + { + // another high surrogate; replace current and start check over + highSurrogate = UnicodeReplacementChar; + anotherHighSurrogate = true; + } + else + { + // high surrogate not followed by low surrogate; original char is replaced + highSurrogate = UnicodeReplacementChar; + } + + EnsureBufferNotEmpty(); + + WriteCharToBuffer(highSurrogate, lastWritePosition, escapeStartPos); + lastWritePosition = _charPos; + } + else + { + // there are not enough remaining chars for the low surrogate or is not follow by unicode sequence + // replace high surrogate and continue on as usual + writeChar = UnicodeReplacementChar; + } + } while (anotherHighSurrogate); + } + + charPos = _charPos; + break; + default: + _charPos = charPos; + throw JsonReaderException.Create(this, "Bad JSON escape sequence: {0}.".FormatWith(CultureInfo.InvariantCulture, @"\" + currentChar)); + } + + EnsureBufferNotEmpty(); + WriteCharToBuffer(writeChar, lastWritePosition, escapeStartPos); + + lastWritePosition = charPos; + break; + case StringUtils.CarriageReturn: + _charPos = charPos - 1; + ProcessCarriageReturn(true); + charPos = _charPos; + break; + case StringUtils.LineFeed: + _charPos = charPos - 1; + ProcessLineFeed(); + charPos = _charPos; + break; + case '"': + case '\'': + if (_chars[charPos - 1] == quote) + { + charPos--; + + if (initialPosition == lastWritePosition) + { + _stringReference = new StringReference(_chars, initialPosition, charPos - initialPosition); + } + else + { + EnsureBufferNotEmpty(); + + if (charPos > lastWritePosition) + { + _stringBuffer.Append(_arrayPool, _chars, lastWritePosition, charPos - lastWritePosition); + } + + _stringReference = new StringReference(_stringBuffer.InternalBuffer, 0, _stringBuffer.Position); + } + + charPos++; + _charPos = charPos; + return; + } + break; + } + } + } + + private void WriteCharToBuffer(char writeChar, int lastWritePosition, int writeToPosition) + { + if (writeToPosition > lastWritePosition) + { + _stringBuffer.Append(_arrayPool, _chars, lastWritePosition, writeToPosition - lastWritePosition); + } + + _stringBuffer.Append(_arrayPool, writeChar); + } + + private char ParseUnicode() + { + char writeChar; + if (EnsureChars(4, true)) + { + char hexChar = Convert.ToChar(ConvertUtils.HexTextToInt(_chars, _charPos, _charPos + 4)); + writeChar = hexChar; + + _charPos += 4; + } + else + { + throw JsonReaderException.Create(this, "Unexpected end while parsing unicode character."); + } + return writeChar; + } + + private void ReadNumberIntoBuffer() + { + int charPos = _charPos; + + while (true) + { + switch (_chars[charPos]) + { + case '\0': + _charPos = charPos; + + if (_charsUsed == charPos) + { + if (ReadData(true) == 0) + { + return; + } + } + else + { + return; + } + break; + case '-': + case '+': + case 'a': + case 'A': + case 'b': + case 'B': + case 'c': + case 'C': + case 'd': + case 'D': + case 'e': + case 'E': + case 'f': + case 'F': + case 'x': + case 'X': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + charPos++; + break; + default: + _charPos = charPos; + + char currentChar = _chars[_charPos]; + if (char.IsWhiteSpace(currentChar) || currentChar == ',' || currentChar == '}' || currentChar == ']' || currentChar == ')' || currentChar == '/') + { + return; + } + + throw JsonReaderException.Create(this, "Unexpected character encountered while parsing number: {0}.".FormatWith(CultureInfo.InvariantCulture, currentChar)); + } + } + } + + private void ClearRecentString() + { + _stringBuffer.Position = 0; + _stringReference = new StringReference(); + } + + private bool ParsePostValue() + { + while (true) + { + char currentChar = _chars[_charPos]; + + switch (currentChar) + { + case '\0': + if (_charsUsed == _charPos) + { + if (ReadData(false) == 0) + { + _currentState = State.Finished; + return false; + } + } + else + { + _charPos++; + } + break; + case '}': + _charPos++; + SetToken(JsonToken.EndObject); + return true; + case ']': + _charPos++; + SetToken(JsonToken.EndArray); + return true; + case ')': + _charPos++; + SetToken(JsonToken.EndConstructor); + return true; + case '/': + ParseComment(true); + return true; + case ',': + _charPos++; + + // finished parsing + SetStateBasedOnCurrent(); + return false; + case ' ': + case StringUtils.Tab: + // eat + _charPos++; + break; + case StringUtils.CarriageReturn: + ProcessCarriageReturn(false); + break; + case StringUtils.LineFeed: + ProcessLineFeed(); + break; + default: + if (char.IsWhiteSpace(currentChar)) + { + // eat + _charPos++; + } + else + { + throw JsonReaderException.Create(this, "After parsing a value an unexpected character was encountered: {0}.".FormatWith(CultureInfo.InvariantCulture, currentChar)); + } + break; + } + } + } + + private bool ParseObject() + { + while (true) + { + char currentChar = _chars[_charPos]; + + switch (currentChar) + { + case '\0': + if (_charsUsed == _charPos) + { + if (ReadData(false) == 0) + { + return false; + } + } + else + { + _charPos++; + } + break; + case '}': + SetToken(JsonToken.EndObject); + _charPos++; + return true; + case '/': + ParseComment(true); + return true; + case StringUtils.CarriageReturn: + ProcessCarriageReturn(false); + break; + case StringUtils.LineFeed: + ProcessLineFeed(); + break; + case ' ': + case StringUtils.Tab: + // eat + _charPos++; + break; + default: + if (char.IsWhiteSpace(currentChar)) + { + // eat + _charPos++; + } + else + { + return ParseProperty(); + } + break; + } + } + } + + private bool ParseProperty() + { + char firstChar = _chars[_charPos]; + char quoteChar; + + if (firstChar == '"' || firstChar == '\'') + { + _charPos++; + quoteChar = firstChar; + ShiftBufferIfNeeded(); + ReadStringIntoBuffer(quoteChar); + } + else if (ValidIdentifierChar(firstChar)) + { + quoteChar = '\0'; + ShiftBufferIfNeeded(); + ParseUnquotedProperty(); + } + else + { + throw JsonReaderException.Create(this, "Invalid property identifier character: {0}.".FormatWith(CultureInfo.InvariantCulture, _chars[_charPos])); + } + + string propertyName; + + if (NameTable != null) + { + propertyName = NameTable.Get(_stringReference.Chars, _stringReference.StartIndex, _stringReference.Length); + + // no match in name table + if (propertyName == null) + { + propertyName = _stringReference.ToString(); + } + } + else + { + propertyName = _stringReference.ToString(); + } + + EatWhitespace(false); + + if (_chars[_charPos] != ':') + { + throw JsonReaderException.Create(this, "Invalid character after parsing property name. Expected ':' but got: {0}.".FormatWith(CultureInfo.InvariantCulture, _chars[_charPos])); + } + + _charPos++; + + SetToken(JsonToken.PropertyName, propertyName); + _quoteChar = quoteChar; + ClearRecentString(); + + return true; + } + + private bool ValidIdentifierChar(char value) + { + return (char.IsLetterOrDigit(value) || value == '_' || value == '$'); + } + + private void ParseUnquotedProperty() + { + int initialPosition = _charPos; + + // parse unquoted property name until whitespace or colon + while (true) + { + switch (_chars[_charPos]) + { + case '\0': + if (_charsUsed == _charPos) + { + if (ReadData(true) == 0) + { + throw JsonReaderException.Create(this, "Unexpected end while parsing unquoted property name."); + } + + break; + } + + _stringReference = new StringReference(_chars, initialPosition, _charPos - initialPosition); + return; + default: + char currentChar = _chars[_charPos]; + + if (ValidIdentifierChar(currentChar)) + { + _charPos++; + break; + } + else if (char.IsWhiteSpace(currentChar) || currentChar == ':') + { + _stringReference = new StringReference(_chars, initialPosition, _charPos - initialPosition); + return; + } + + throw JsonReaderException.Create(this, "Invalid JavaScript property identifier character: {0}.".FormatWith(CultureInfo.InvariantCulture, currentChar)); + } + } + } + + private bool ParseValue() + { + while (true) + { + char currentChar = _chars[_charPos]; + + switch (currentChar) + { + case '\0': + if (_charsUsed == _charPos) + { + if (ReadData(false) == 0) + { + return false; + } + } + else + { + _charPos++; + } + break; + case '"': + case '\'': + ParseString(currentChar, ReadType.Read); + return true; + case 't': + ParseTrue(); + return true; + case 'f': + ParseFalse(); + return true; + case 'n': + if (EnsureChars(1, true)) + { + char next = _chars[_charPos + 1]; + + if (next == 'u') + { + ParseNull(); + } + else if (next == 'e') + { + ParseConstructor(); + } + else + { + throw CreateUnexpectedCharacterException(_chars[_charPos]); + } + } + else + { + _charPos++; + throw CreateUnexpectedEndException(); + } + return true; + case 'N': + ParseNumberNaN(); + return true; + case 'I': + ParseNumberPositiveInfinity(); + return true; + case '-': + if (EnsureChars(1, true) && _chars[_charPos + 1] == 'I') + { + ParseNumberNegativeInfinity(); + } + else + { + ParseNumber(ReadType.Read); + } + return true; + case '/': + ParseComment(true); + return true; + case 'u': + ParseUndefined(); + return true; + case '{': + _charPos++; + SetToken(JsonToken.StartObject); + return true; + case '[': + _charPos++; + SetToken(JsonToken.StartArray); + return true; + case ']': + _charPos++; + SetToken(JsonToken.EndArray); + return true; + case ',': + // don't increment position, the next call to read will handle comma + // this is done to handle multiple empty comma values + SetToken(JsonToken.Undefined); + return true; + case ')': + _charPos++; + SetToken(JsonToken.EndConstructor); + return true; + case StringUtils.CarriageReturn: + ProcessCarriageReturn(false); + break; + case StringUtils.LineFeed: + ProcessLineFeed(); + break; + case ' ': + case StringUtils.Tab: + // eat + _charPos++; + break; + default: + if (char.IsWhiteSpace(currentChar)) + { + // eat + _charPos++; + break; + } + if (char.IsNumber(currentChar) || currentChar == '-' || currentChar == '.') + { + ParseNumber(ReadType.Read); + return true; + } + + throw CreateUnexpectedCharacterException(currentChar); + } + } + } + + private void ProcessLineFeed() + { + _charPos++; + OnNewLine(_charPos); + } + + private void ProcessCarriageReturn(bool append) + { + _charPos++; + + if (EnsureChars(1, append) && _chars[_charPos] == StringUtils.LineFeed) + { + _charPos++; + } + + OnNewLine(_charPos); + } + + private bool EatWhitespace(bool oneOrMore) + { + bool finished = false; + bool ateWhitespace = false; + while (!finished) + { + char currentChar = _chars[_charPos]; + + switch (currentChar) + { + case '\0': + if (_charsUsed == _charPos) + { + if (ReadData(false) == 0) + { + finished = true; + } + } + else + { + _charPos++; + } + break; + case StringUtils.CarriageReturn: + ProcessCarriageReturn(false); + break; + case StringUtils.LineFeed: + ProcessLineFeed(); + break; + default: + if (currentChar == ' ' || char.IsWhiteSpace(currentChar)) + { + ateWhitespace = true; + _charPos++; + } + else + { + finished = true; + } + break; + } + } + + return (!oneOrMore || ateWhitespace); + } + + private void ParseConstructor() + { + if (MatchValueWithTrailingSeparator("new")) + { + EatWhitespace(false); + + int initialPosition = _charPos; + int endPosition; + + while (true) + { + char currentChar = _chars[_charPos]; + if (currentChar == '\0') + { + if (_charsUsed == _charPos) + { + if (ReadData(true) == 0) + { + throw JsonReaderException.Create(this, "Unexpected end while parsing constructor."); + } + } + else + { + endPosition = _charPos; + _charPos++; + break; + } + } + else if (char.IsLetterOrDigit(currentChar)) + { + _charPos++; + } + else if (currentChar == StringUtils.CarriageReturn) + { + endPosition = _charPos; + ProcessCarriageReturn(true); + break; + } + else if (currentChar == StringUtils.LineFeed) + { + endPosition = _charPos; + ProcessLineFeed(); + break; + } + else if (char.IsWhiteSpace(currentChar)) + { + endPosition = _charPos; + _charPos++; + break; + } + else if (currentChar == '(') + { + endPosition = _charPos; + break; + } + else + { + throw JsonReaderException.Create(this, "Unexpected character while parsing constructor: {0}.".FormatWith(CultureInfo.InvariantCulture, currentChar)); + } + } + + _stringReference = new StringReference(_chars, initialPosition, endPosition - initialPosition); + string constructorName = _stringReference.ToString(); + + EatWhitespace(false); + + if (_chars[_charPos] != '(') + { + throw JsonReaderException.Create(this, "Unexpected character while parsing constructor: {0}.".FormatWith(CultureInfo.InvariantCulture, _chars[_charPos])); + } + + _charPos++; + + ClearRecentString(); + + SetToken(JsonToken.StartConstructor, constructorName); + } + else + { + throw JsonReaderException.Create(this, "Unexpected content while parsing JSON."); + } + } + + private void ParseNumber(ReadType readType) + { + ShiftBufferIfNeeded(); + + char firstChar = _chars[_charPos]; + int initialPosition = _charPos; + + ReadNumberIntoBuffer(); + + // set state to PostValue now so that if there is an error parsing the number then the reader can continue + SetPostValueState(true); + + _stringReference = new StringReference(_chars, initialPosition, _charPos - initialPosition); + + object numberValue; + JsonToken numberType; + + bool singleDigit = (char.IsDigit(firstChar) && _stringReference.Length == 1); + bool nonBase10 = (firstChar == '0' && _stringReference.Length > 1 && _stringReference.Chars[_stringReference.StartIndex + 1] != '.' && _stringReference.Chars[_stringReference.StartIndex + 1] != 'e' && _stringReference.Chars[_stringReference.StartIndex + 1] != 'E'); + + if (readType == ReadType.ReadAsInt32) + { + if (singleDigit) + { + // digit char values start at 48 + numberValue = firstChar - 48; + } + else if (nonBase10) + { + string number = _stringReference.ToString(); + + try + { + int integer = number.StartsWith("0x", StringComparison.OrdinalIgnoreCase) ? Convert.ToInt32(number, 16) : Convert.ToInt32(number, 8); + + numberValue = integer; + } + catch (Exception ex) + { + throw JsonReaderException.Create(this, "Input string '{0}' is not a valid integer.".FormatWith(CultureInfo.InvariantCulture, number), ex); + } + } + else + { + int value; + ParseResult parseResult = ConvertUtils.Int32TryParse(_stringReference.Chars, _stringReference.StartIndex, _stringReference.Length, out value); + if (parseResult == ParseResult.Success) + { + numberValue = value; + } + else if (parseResult == ParseResult.Overflow) + { + throw JsonReaderException.Create(this, "JSON integer {0} is too large or small for an Int32.".FormatWith(CultureInfo.InvariantCulture, _stringReference.ToString())); + } + else + { + throw JsonReaderException.Create(this, "Input string '{0}' is not a valid integer.".FormatWith(CultureInfo.InvariantCulture, _stringReference.ToString())); + } + } + + numberType = JsonToken.Integer; + } + else if (readType == ReadType.ReadAsDecimal) + { + if (singleDigit) + { + // digit char values start at 48 + numberValue = (decimal)firstChar - 48; + } + else if (nonBase10) + { + string number = _stringReference.ToString(); + + try + { + // decimal.Parse doesn't support parsing hexadecimal values + long integer = number.StartsWith("0x", StringComparison.OrdinalIgnoreCase) ? Convert.ToInt64(number, 16) : Convert.ToInt64(number, 8); + + numberValue = Convert.ToDecimal(integer); + } + catch (Exception ex) + { + throw JsonReaderException.Create(this, "Input string '{0}' is not a valid decimal.".FormatWith(CultureInfo.InvariantCulture, number), ex); + } + } + else + { + string number = _stringReference.ToString(); + + decimal value; + if (decimal.TryParse(number, NumberStyles.Number | NumberStyles.AllowExponent, CultureInfo.InvariantCulture, out value)) + { + numberValue = value; + } + else + { + throw JsonReaderException.Create(this, "Input string '{0}' is not a valid decimal.".FormatWith(CultureInfo.InvariantCulture, _stringReference.ToString())); + } + } + + numberType = JsonToken.Float; + } + else if (readType == ReadType.ReadAsDouble) + { + if (singleDigit) + { + // digit char values start at 48 + numberValue = (double)firstChar - 48; + } + else if (nonBase10) + { + string number = _stringReference.ToString(); + + try + { + // double.Parse doesn't support parsing hexadecimal values + long integer = number.StartsWith("0x", StringComparison.OrdinalIgnoreCase) ? Convert.ToInt64(number, 16) : Convert.ToInt64(number, 8); + + numberValue = Convert.ToDouble(integer); + } + catch (Exception ex) + { + throw JsonReaderException.Create(this, "Input string '{0}' is not a valid double.".FormatWith(CultureInfo.InvariantCulture, number), ex); + } + } + else + { + string number = _stringReference.ToString(); + + double value; + if (double.TryParse(number, NumberStyles.Float, CultureInfo.InvariantCulture, out value)) + { + numberValue = value; + } + else + { + throw JsonReaderException.Create(this, "Input string '{0}' is not a valid double.".FormatWith(CultureInfo.InvariantCulture, _stringReference.ToString())); + } + } + + numberType = JsonToken.Float; + } + else + { + if (singleDigit) + { + // digit char values start at 48 + numberValue = (long)firstChar - 48; + numberType = JsonToken.Integer; + } + else if (nonBase10) + { + string number = _stringReference.ToString(); + + try + { + numberValue = number.StartsWith("0x", StringComparison.OrdinalIgnoreCase) ? Convert.ToInt64(number, 16) : Convert.ToInt64(number, 8); + } + catch (Exception ex) + { + throw JsonReaderException.Create(this, "Input string '{0}' is not a valid number.".FormatWith(CultureInfo.InvariantCulture, number), ex); + } + + numberType = JsonToken.Integer; + } + else + { + long value; + ParseResult parseResult = ConvertUtils.Int64TryParse(_stringReference.Chars, _stringReference.StartIndex, _stringReference.Length, out value); + if (parseResult == ParseResult.Success) + { + numberValue = value; + numberType = JsonToken.Integer; + } + else if (parseResult == ParseResult.Overflow) + { +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + string number = _stringReference.ToString(); + + if (number.Length > MaximumJavascriptIntegerCharacterLength) + { + throw JsonReaderException.Create(this, "JSON integer {0} is too large to parse.".FormatWith(CultureInfo.InvariantCulture, _stringReference.ToString())); + } + + numberValue = BigIntegerParse(number, CultureInfo.InvariantCulture); + numberType = JsonToken.Integer; +#else + throw JsonReaderException.Create(this, "JSON integer {0} is too large or small for an Int64.".FormatWith(CultureInfo.InvariantCulture, _stringReference.ToString())); +#endif + } + else + { + string number = _stringReference.ToString(); + + if (_floatParseHandling == FloatParseHandling.Decimal) + { + decimal d; + if (decimal.TryParse(number, NumberStyles.Number | NumberStyles.AllowExponent, CultureInfo.InvariantCulture, out d)) + { + numberValue = d; + } + else + { + throw JsonReaderException.Create(this, "Input string '{0}' is not a valid decimal.".FormatWith(CultureInfo.InvariantCulture, number)); + } + } + else + { + double d; + if (double.TryParse(number, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out d)) + { + numberValue = d; + } + else + { + throw JsonReaderException.Create(this, "Input string '{0}' is not a valid number.".FormatWith(CultureInfo.InvariantCulture, number)); + } + } + + numberType = JsonToken.Float; + } + } + } + + ClearRecentString(); + + // index has already been updated + SetToken(numberType, numberValue, false); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + // By using the BigInteger type in a separate method, + // the runtime can execute the ParseNumber even if + // the System.Numerics.BigInteger.Parse method is + // missing, which happens in some versions of Mono + [MethodImpl(MethodImplOptions.NoInlining)] + private static object BigIntegerParse(string number, CultureInfo culture) + { + return System.Numerics.BigInteger.Parse(number, culture); + } +#endif + + private void ParseComment(bool setToken) + { + // should have already parsed / character before reaching this method + _charPos++; + + if (!EnsureChars(1, false)) + { + throw JsonReaderException.Create(this, "Unexpected end while parsing comment."); + } + + bool singlelineComment; + + if (_chars[_charPos] == '*') + { + singlelineComment = false; + } + else if (_chars[_charPos] == '/') + { + singlelineComment = true; + } + else + { + throw JsonReaderException.Create(this, "Error parsing comment. Expected: *, got {0}.".FormatWith(CultureInfo.InvariantCulture, _chars[_charPos])); + } + + _charPos++; + + int initialPosition = _charPos; + + while (true) + { + switch (_chars[_charPos]) + { + case '\0': + if (_charsUsed == _charPos) + { + if (ReadData(true) == 0) + { + if (!singlelineComment) + { + throw JsonReaderException.Create(this, "Unexpected end while parsing comment."); + } + + EndComment(setToken, initialPosition, _charPos); + return; + } + } + else + { + _charPos++; + } + break; + case '*': + _charPos++; + + if (!singlelineComment) + { + if (EnsureChars(0, true)) + { + if (_chars[_charPos] == '/') + { + EndComment(setToken, initialPosition, _charPos - 1); + + _charPos++; + return; + } + } + } + break; + case StringUtils.CarriageReturn: + if (singlelineComment) + { + EndComment(setToken, initialPosition, _charPos); + return; + } + ProcessCarriageReturn(true); + break; + case StringUtils.LineFeed: + if (singlelineComment) + { + EndComment(setToken, initialPosition, _charPos); + return; + } + ProcessLineFeed(); + break; + default: + _charPos++; + break; + } + } + } + + private void EndComment(bool setToken, int initialPosition, int endPosition) + { + if (setToken) + { + SetToken(JsonToken.Comment, new string(_chars, initialPosition, endPosition - initialPosition)); + } + } + + private bool MatchValue(string value) + { + if (!EnsureChars(value.Length - 1, true)) + { + _charPos = _charsUsed; + throw CreateUnexpectedEndException(); + } + + for (int i = 0; i < value.Length; i++) + { + if (_chars[_charPos + i] != value[i]) + { + _charPos += i; + return false; + } + } + + _charPos += value.Length; + + return true; + } + + private bool MatchValueWithTrailingSeparator(string value) + { + // will match value and then move to the next character, checking that it is a separator character + bool match = MatchValue(value); + + if (!match) + { + return false; + } + + if (!EnsureChars(0, false)) + { + return true; + } + + return IsSeparator(_chars[_charPos]) || _chars[_charPos] == '\0'; + } + + private bool IsSeparator(char c) + { + switch (c) + { + case '}': + case ']': + case ',': + return true; + case '/': + // check next character to see if start of a comment + if (!EnsureChars(1, false)) + { + return false; + } + + var nextChart = _chars[_charPos + 1]; + + return (nextChart == '*' || nextChart == '/'); + case ')': + if (CurrentState == State.Constructor || CurrentState == State.ConstructorStart) + { + return true; + } + break; + case ' ': + case StringUtils.Tab: + case StringUtils.LineFeed: + case StringUtils.CarriageReturn: + return true; + default: + if (char.IsWhiteSpace(c)) + { + return true; + } + break; + } + + return false; + } + + private void ParseTrue() + { + // check characters equal 'true' + // and that it is followed by either a separator character + // or the text ends + if (MatchValueWithTrailingSeparator(JsonConvert.True)) + { + SetToken(JsonToken.Boolean, true); + } + else + { + throw JsonReaderException.Create(this, "Error parsing boolean value."); + } + } + + private void ParseNull() + { + if (MatchValueWithTrailingSeparator(JsonConvert.Null)) + { + SetToken(JsonToken.Null); + } + else + { + throw JsonReaderException.Create(this, "Error parsing null value."); + } + } + + private void ParseUndefined() + { + if (MatchValueWithTrailingSeparator(JsonConvert.Undefined)) + { + SetToken(JsonToken.Undefined); + } + else + { + throw JsonReaderException.Create(this, "Error parsing undefined value."); + } + } + + private void ParseFalse() + { + if (MatchValueWithTrailingSeparator(JsonConvert.False)) + { + SetToken(JsonToken.Boolean, false); + } + else + { + throw JsonReaderException.Create(this, "Error parsing boolean value."); + } + } + + private void ParseNumberNegativeInfinity() + { + if (MatchValueWithTrailingSeparator(JsonConvert.NegativeInfinity)) + { + if (_floatParseHandling == FloatParseHandling.Decimal) + { + throw new JsonReaderException("Cannot read -Infinity as a decimal."); + } + + SetToken(JsonToken.Float, double.NegativeInfinity); + } + else + { + throw JsonReaderException.Create(this, "Error parsing negative infinity value."); + } + } + + private void ParseNumberPositiveInfinity() + { + if (MatchValueWithTrailingSeparator(JsonConvert.PositiveInfinity)) + { + if (_floatParseHandling == FloatParseHandling.Decimal) + { + throw new JsonReaderException("Cannot read Infinity as a decimal."); + } + + SetToken(JsonToken.Float, double.PositiveInfinity); + } + else + { + throw JsonReaderException.Create(this, "Error parsing positive infinity value."); + } + } + + private void ParseNumberNaN() + { + if (MatchValueWithTrailingSeparator(JsonConvert.NaN)) + { + if (_floatParseHandling == FloatParseHandling.Decimal) + { + throw new JsonReaderException("Cannot read NaN as a decimal."); + } + + SetToken(JsonToken.Float, double.NaN); + } + else + { + throw JsonReaderException.Create(this, "Error parsing NaN value."); + } + } + + /// + /// Changes the state to closed. + /// + public override void Close() + { + base.Close(); + + if (_chars != null) + { + BufferUtils.ReturnBuffer(_arrayPool, _chars); + _chars = null; + } + + if (CloseInput && _reader != null) + { +#if !(DOTNET || PORTABLE40 || PORTABLE) + _reader.Close(); +#else + _reader.Dispose(); +#endif + } + + _stringBuffer.Clear(_arrayPool); + } + + /// + /// Gets a value indicating whether the class can return line information. + /// + /// + /// true if LineNumber and LinePosition can be provided; otherwise, false. + /// + public bool HasLineInfo() + { + return true; + } + + /// + /// Gets the current line number. + /// + /// + /// The current line number or 0 if no line information is available (for example, HasLineInfo returns false). + /// + public int LineNumber + { + get + { + if (CurrentState == State.Start && LinePosition == 0 && TokenType != JsonToken.Comment) + { + return 0; + } + + return _lineNumber; + } + } + + /// + /// Gets the current line position. + /// + /// + /// The current line position or 0 if no line information is available (for example, HasLineInfo returns false). + /// + public int LinePosition + { + get { return _charPos - _lineStartPos; } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonTextWriter.cs b/Common/00-1Json8.3/Json8.3/JsonTextWriter.cs new file mode 100644 index 0000000..8367846 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonTextWriter.cs @@ -0,0 +1,807 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Globalization; +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) +using System.Numerics; +#endif +using System.Text; +using System.IO; +using System.Xml; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json +{ + /// + /// Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + /// + public class JsonTextWriter : JsonWriter + { + private readonly TextWriter _writer; + private Base64Encoder _base64Encoder; + private char _indentChar; + private int _indentation; + private char _quoteChar; + private bool _quoteName; + private bool[] _charEscapeFlags; + private char[] _writeBuffer; + private IArrayPool _arrayPool; + private char[] _indentChars; + + private Base64Encoder Base64Encoder + { + get + { + if (_base64Encoder == null) + { + _base64Encoder = new Base64Encoder(_writer); + } + + return _base64Encoder; + } + } + + /// + /// Gets or sets the writer's character array pool. + /// + public IArrayPool ArrayPool + { + get { return _arrayPool; } + set + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + _arrayPool = value; + } + } + + /// + /// Gets or sets how many IndentChars to write for each level in the hierarchy when is set to Formatting.Indented. + /// + public int Indentation + { + get { return _indentation; } + set + { + if (value < 0) + { + throw new ArgumentException("Indentation value must be greater than 0."); + } + + _indentation = value; + } + } + + /// + /// Gets or sets which character to use to quote attribute values. + /// + public char QuoteChar + { + get { return _quoteChar; } + set + { + if (value != '"' && value != '\'') + { + throw new ArgumentException(@"Invalid JavaScript string quote character. Valid quote characters are ' and ""."); + } + + _quoteChar = value; + UpdateCharEscapeFlags(); + } + } + + /// + /// Gets or sets which character to use for indenting when is set to Formatting.Indented. + /// + public char IndentChar + { + get { return _indentChar; } + set + { + if (value != _indentChar) + { + _indentChar = value; + _indentChars = null; + } + } + } + + /// + /// Gets or sets a value indicating whether object names will be surrounded with quotes. + /// + public bool QuoteName + { + get { return _quoteName; } + set { _quoteName = value; } + } + + /// + /// Creates an instance of the JsonWriter class using the specified . + /// + /// The TextWriter to write to. + public JsonTextWriter(TextWriter textWriter) + { + if (textWriter == null) + { + throw new ArgumentNullException(nameof(textWriter)); + } + + _writer = textWriter; + _quoteChar = '"'; + _quoteName = true; + _indentChar = ' '; + _indentation = 2; + + UpdateCharEscapeFlags(); + } + + /// + /// Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + /// + public override void Flush() + { + _writer.Flush(); + } + + /// + /// Closes this stream and the underlying stream. + /// + public override void Close() + { + base.Close(); + + if (_writeBuffer != null) + { + BufferUtils.ReturnBuffer(_arrayPool, _writeBuffer); + _writeBuffer = null; + } + + if (CloseOutput && _writer != null) + { +#if !(DOTNET || PORTABLE40 || PORTABLE) + _writer.Close(); +#else + _writer.Dispose(); +#endif + } + } + + /// + /// Writes the beginning of a JSON object. + /// + public override void WriteStartObject() + { + InternalWriteStart(JsonToken.StartObject, JsonContainerType.Object); + + _writer.Write('{'); + } + + /// + /// Writes the beginning of a JSON array. + /// + public override void WriteStartArray() + { + InternalWriteStart(JsonToken.StartArray, JsonContainerType.Array); + + _writer.Write('['); + } + + /// + /// Writes the start of a constructor with the given name. + /// + /// The name of the constructor. + public override void WriteStartConstructor(string name) + { + InternalWriteStart(JsonToken.StartConstructor, JsonContainerType.Constructor); + + _writer.Write("new "); + _writer.Write(name); + _writer.Write('('); + } + + /// + /// Writes the specified end token. + /// + /// The end token to write. + protected override void WriteEnd(JsonToken token) + { + switch (token) + { + case JsonToken.EndObject: + _writer.Write('}'); + break; + case JsonToken.EndArray: + _writer.Write(']'); + break; + case JsonToken.EndConstructor: + _writer.Write(')'); + break; + default: + throw JsonWriterException.Create(this, "Invalid JsonToken: " + token, null); + } + } + + /// + /// Writes the property name of a name/value pair on a JSON object. + /// + /// The name of the property. + public override void WritePropertyName(string name) + { + InternalWritePropertyName(name); + + WriteEscapedString(name, _quoteName); + + _writer.Write(':'); + } + + /// + /// Writes the property name of a name/value pair on a JSON object. + /// + /// The name of the property. + /// A flag to indicate whether the text should be escaped when it is written as a JSON property name. + public override void WritePropertyName(string name, bool escape) + { + InternalWritePropertyName(name); + + if (escape) + { + WriteEscapedString(name, _quoteName); + } + else + { + if (_quoteName) + { + _writer.Write(_quoteChar); + } + + _writer.Write(name); + + if (_quoteName) + { + _writer.Write(_quoteChar); + } + } + + _writer.Write(':'); + } + + internal override void OnStringEscapeHandlingChanged() + { + UpdateCharEscapeFlags(); + } + + private void UpdateCharEscapeFlags() + { + _charEscapeFlags = JavaScriptUtils.GetCharEscapeFlags(StringEscapeHandling, _quoteChar); + } + + /// + /// Writes indent characters. + /// + protected override void WriteIndent() + { + _writer.WriteLine(); + + // levels of indentation multiplied by the indent count + int currentIndentCount = Top * _indentation; + + if (currentIndentCount > 0) + { + if (_indentChars == null) + { + _indentChars = new string(_indentChar, 10).ToCharArray(); + } + + while (currentIndentCount > 0) + { + int writeCount = Math.Min(currentIndentCount, 10); + + _writer.Write(_indentChars, 0, writeCount); + + currentIndentCount -= writeCount; + } + } + } + + /// + /// Writes the JSON value delimiter. + /// + protected override void WriteValueDelimiter() + { + _writer.Write(','); + } + + /// + /// Writes an indent space. + /// + protected override void WriteIndentSpace() + { + _writer.Write(' '); + } + + private void WriteValueInternal(string value, JsonToken token) + { + _writer.Write(value); + } + + #region WriteValue methods + /// + /// Writes a value. + /// An error will raised if the value cannot be written as a single JSON token. + /// + /// The value to write. + public override void WriteValue(object value) + { +#if !(NET20 || NET35 || PORTABLE || PORTABLE40) + if (value is BigInteger) + { + InternalWriteValue(JsonToken.Integer); + WriteValueInternal(((BigInteger)value).ToString(CultureInfo.InvariantCulture), JsonToken.String); + } + else +#endif + { + base.WriteValue(value); + } + } + + /// + /// Writes a null value. + /// + public override void WriteNull() + { + InternalWriteValue(JsonToken.Null); + WriteValueInternal(JsonConvert.Null, JsonToken.Null); + } + + /// + /// Writes an undefined value. + /// + public override void WriteUndefined() + { + InternalWriteValue(JsonToken.Undefined); + WriteValueInternal(JsonConvert.Undefined, JsonToken.Undefined); + } + + /// + /// Writes raw JSON. + /// + /// The raw JSON to write. + public override void WriteRaw(string json) + { + InternalWriteRaw(); + + _writer.Write(json); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(string value) + { + InternalWriteValue(JsonToken.String); + + if (value == null) + { + WriteValueInternal(JsonConvert.Null, JsonToken.Null); + } + else + { + WriteEscapedString(value, true); + } + } + + private void WriteEscapedString(string value, bool quote) + { + EnsureWriteBuffer(); + JavaScriptUtils.WriteEscapedJavaScriptString(_writer, value, _quoteChar, quote, _charEscapeFlags, StringEscapeHandling, _arrayPool, ref _writeBuffer); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(int value) + { + InternalWriteValue(JsonToken.Integer); + WriteIntegerValue(value); + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public override void WriteValue(uint value) + { + InternalWriteValue(JsonToken.Integer); + WriteIntegerValue(value); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(long value) + { + InternalWriteValue(JsonToken.Integer); + WriteIntegerValue(value); + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public override void WriteValue(ulong value) + { + InternalWriteValue(JsonToken.Integer); + WriteIntegerValue(value); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(float value) + { + InternalWriteValue(JsonToken.Float); + WriteValueInternal(JsonConvert.ToString(value, FloatFormatHandling, QuoteChar, false), JsonToken.Float); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(float? value) + { + if (value == null) + { + WriteNull(); + } + else + { + InternalWriteValue(JsonToken.Float); + WriteValueInternal(JsonConvert.ToString(value.GetValueOrDefault(), FloatFormatHandling, QuoteChar, true), JsonToken.Float); + } + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(double value) + { + InternalWriteValue(JsonToken.Float); + WriteValueInternal(JsonConvert.ToString(value, FloatFormatHandling, QuoteChar, false), JsonToken.Float); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(double? value) + { + if (value == null) + { + WriteNull(); + } + else + { + InternalWriteValue(JsonToken.Float); + WriteValueInternal(JsonConvert.ToString(value.GetValueOrDefault(), FloatFormatHandling, QuoteChar, true), JsonToken.Float); + } + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(bool value) + { + InternalWriteValue(JsonToken.Boolean); + WriteValueInternal(JsonConvert.ToString(value), JsonToken.Boolean); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(short value) + { + InternalWriteValue(JsonToken.Integer); + WriteIntegerValue(value); + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public override void WriteValue(ushort value) + { + InternalWriteValue(JsonToken.Integer); + WriteIntegerValue(value); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(char value) + { + InternalWriteValue(JsonToken.String); + WriteValueInternal(JsonConvert.ToString(value), JsonToken.String); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(byte value) + { + InternalWriteValue(JsonToken.Integer); + WriteIntegerValue(value); + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public override void WriteValue(sbyte value) + { + InternalWriteValue(JsonToken.Integer); + WriteIntegerValue(value); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(decimal value) + { + InternalWriteValue(JsonToken.Float); + WriteValueInternal(JsonConvert.ToString(value), JsonToken.Float); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(DateTime value) + { + InternalWriteValue(JsonToken.Date); + value = DateTimeUtils.EnsureDateTime(value, DateTimeZoneHandling); + + if (string.IsNullOrEmpty(DateFormatString)) + { + EnsureWriteBuffer(); + + int pos = 0; + _writeBuffer[pos++] = _quoteChar; + pos = DateTimeUtils.WriteDateTimeString(_writeBuffer, pos, value, null, value.Kind, DateFormatHandling); + _writeBuffer[pos++] = _quoteChar; + + _writer.Write(_writeBuffer, 0, pos); + } + else + { + _writer.Write(_quoteChar); + _writer.Write(value.ToString(DateFormatString, Culture)); + _writer.Write(_quoteChar); + } + } + + /// + /// Writes a [] value. + /// + /// The [] value to write. + public override void WriteValue(byte[] value) + { + if (value == null) + { + WriteNull(); + } + else + { + InternalWriteValue(JsonToken.Bytes); + _writer.Write(_quoteChar); + Base64Encoder.Encode(value, 0, value.Length); + Base64Encoder.Flush(); + _writer.Write(_quoteChar); + } + } + +#if !NET20 + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(DateTimeOffset value) + { + InternalWriteValue(JsonToken.Date); + + if (string.IsNullOrEmpty(DateFormatString)) + { + EnsureWriteBuffer(); + + int pos = 0; + _writeBuffer[pos++] = _quoteChar; + pos = DateTimeUtils.WriteDateTimeString(_writeBuffer, pos, (DateFormatHandling == DateFormatHandling.IsoDateFormat) ? value.DateTime : value.UtcDateTime, value.Offset, DateTimeKind.Local, DateFormatHandling); + _writeBuffer[pos++] = _quoteChar; + + _writer.Write(_writeBuffer, 0, pos); + } + else + { + _writer.Write(_quoteChar); + _writer.Write(value.ToString(DateFormatString, Culture)); + _writer.Write(_quoteChar); + } + } +#endif + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(Guid value) + { + InternalWriteValue(JsonToken.String); + + string text = null; + +#if !(DOTNET || PORTABLE40 || PORTABLE) + text = value.ToString("D", CultureInfo.InvariantCulture); +#else + text = value.ToString("D"); +#endif + + _writer.Write(_quoteChar); + _writer.Write(text); + _writer.Write(_quoteChar); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(TimeSpan value) + { + InternalWriteValue(JsonToken.String); + + string text; +#if (NET35 || NET20) + text = value.ToString(); +#else + text = value.ToString(null, CultureInfo.InvariantCulture); +#endif + + _writer.Write(_quoteChar); + _writer.Write(text); + _writer.Write(_quoteChar); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(Uri value) + { + if (value == null) + { + WriteNull(); + } + else + { + InternalWriteValue(JsonToken.String); + WriteEscapedString(value.OriginalString, true); + } + } + #endregion + + /// + /// Writes out a comment /*...*/ containing the specified text. + /// + /// Text to place inside the comment. + public override void WriteComment(string text) + { + InternalWriteComment(); + + _writer.Write("/*"); + _writer.Write(text); + _writer.Write("*/"); + } + + /// + /// Writes out the given white space. + /// + /// The string of white space characters. + public override void WriteWhitespace(string ws) + { + InternalWriteWhitespace(ws); + + _writer.Write(ws); + } + + private void EnsureWriteBuffer() + { + if (_writeBuffer == null) + { + // maximum buffer sized used when writing iso date + _writeBuffer = BufferUtils.RentBuffer(_arrayPool, 35); + } + } + + private void WriteIntegerValue(long value) + { + if (value >= 0 && value <= 9) + { + _writer.Write((char)('0' + value)); + } + else + { + ulong uvalue = (value < 0) ? (ulong)-value : (ulong)value; + + if (value < 0) + { + _writer.Write('-'); + } + + WriteIntegerValue(uvalue); + } + } + + private void WriteIntegerValue(ulong uvalue) + { + if (uvalue <= 9) + { + _writer.Write((char)('0' + uvalue)); + } + else + { + EnsureWriteBuffer(); + + int totalLength = MathUtils.IntLength(uvalue); + int length = 0; + + do + { + _writeBuffer[totalLength - ++length] = (char)('0' + (uvalue % 10)); + uvalue /= 10; + } while (uvalue != 0); + + _writer.Write(_writeBuffer, 0, length); + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonToken.cs b/Common/00-1Json8.3/Json8.3/JsonToken.cs new file mode 100644 index 0000000..aa93ce2 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonToken.cs @@ -0,0 +1,127 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Text; + +namespace Newtonsoft.Json +{ + /// + /// Specifies the type of JSON token. + /// + public enum JsonToken + { + /// + /// This is returned by the if a method has not been called. + /// + None = 0, + + /// + /// An object start token. + /// + StartObject = 1, + + /// + /// An array start token. + /// + StartArray = 2, + + /// + /// A constructor start token. + /// + StartConstructor = 3, + + /// + /// An object property name. + /// + PropertyName = 4, + + /// + /// A comment. + /// + Comment = 5, + + /// + /// Raw JSON. + /// + Raw = 6, + + /// + /// An integer. + /// + Integer = 7, + + /// + /// A float. + /// + Float = 8, + + /// + /// A string. + /// + String = 9, + + /// + /// A boolean. + /// + Boolean = 10, + + /// + /// A null token. + /// + Null = 11, + + /// + /// An undefined token. + /// + Undefined = 12, + + /// + /// An object end token. + /// + EndObject = 13, + + /// + /// An array end token. + /// + EndArray = 14, + + /// + /// A constructor end token. + /// + EndConstructor = 15, + + /// + /// A Date. + /// + Date = 16, + + /// + /// Byte data. + /// + Bytes = 17 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonValidatingReader.cs b/Common/00-1Json8.3/Json8.3/JsonValidatingReader.cs new file mode 100644 index 0000000..260791b --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonValidatingReader.cs @@ -0,0 +1,1058 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) +using System.Numerics; +#endif +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Schema; +using Newtonsoft.Json.Utilities; +using System.Globalization; +using System.Text.RegularExpressions; +using System.IO; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json +{ + /// + /// + /// Represents a reader that provides validation. + /// + /// + /// JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. + /// + /// + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + public class JsonValidatingReader : JsonReader, IJsonLineInfo + { + private class SchemaScope + { + private readonly JTokenType _tokenType; + private readonly IList _schemas; + private readonly Dictionary _requiredProperties; + + public string CurrentPropertyName { get; set; } + public int ArrayItemCount { get; set; } + public bool IsUniqueArray { get; set; } + public IList UniqueArrayItems { get; set; } + public JTokenWriter CurrentItemWriter { get; set; } + + public IList Schemas + { + get { return _schemas; } + } + + public Dictionary RequiredProperties + { + get { return _requiredProperties; } + } + + public JTokenType TokenType + { + get { return _tokenType; } + } + + public SchemaScope(JTokenType tokenType, IList schemas) + { + _tokenType = tokenType; + _schemas = schemas; + + _requiredProperties = schemas.SelectMany(GetRequiredProperties).Distinct().ToDictionary(p => p, p => false); + + if (tokenType == JTokenType.Array && schemas.Any(s => s.UniqueItems)) + { + IsUniqueArray = true; + UniqueArrayItems = new List(); + } + } + + private IEnumerable GetRequiredProperties(JsonSchemaModel schema) + { + if (schema == null || schema.Properties == null) + { + return Enumerable.Empty(); + } + + return schema.Properties.Where(p => p.Value.Required).Select(p => p.Key); + } + } + + private readonly JsonReader _reader; + private readonly Stack _stack; + private JsonSchema _schema; + private JsonSchemaModel _model; + private SchemaScope _currentScope; + + /// + /// Sets an event handler for receiving schema validation errors. + /// + public event ValidationEventHandler ValidationEventHandler; + + /// + /// Gets the text value of the current JSON token. + /// + /// + public override object Value + { + get { return _reader.Value; } + } + + /// + /// Gets the depth of the current token in the JSON document. + /// + /// The depth of the current token in the JSON document. + public override int Depth + { + get { return _reader.Depth; } + } + + /// + /// Gets the path of the current JSON token. + /// + public override string Path + { + get { return _reader.Path; } + } + + /// + /// Gets the quotation mark character used to enclose the value of a string. + /// + /// + public override char QuoteChar + { + get { return _reader.QuoteChar; } + protected internal set { } + } + + /// + /// Gets the type of the current JSON token. + /// + /// + public override JsonToken TokenType + { + get { return _reader.TokenType; } + } + + /// + /// Gets the Common Language Runtime (CLR) type for the current JSON token. + /// + /// + public override Type ValueType + { + get { return _reader.ValueType; } + } + + private void Push(SchemaScope scope) + { + _stack.Push(scope); + _currentScope = scope; + } + + private SchemaScope Pop() + { + SchemaScope poppedScope = _stack.Pop(); + _currentScope = (_stack.Count != 0) + ? _stack.Peek() + : null; + + return poppedScope; + } + + private IList CurrentSchemas + { + get { return _currentScope.Schemas; } + } + + private static readonly IList EmptySchemaList = new List(); + + private IList CurrentMemberSchemas + { + get + { + if (_currentScope == null) + { + return new List(new[] { _model }); + } + + if (_currentScope.Schemas == null || _currentScope.Schemas.Count == 0) + { + return EmptySchemaList; + } + + switch (_currentScope.TokenType) + { + case JTokenType.None: + return _currentScope.Schemas; + case JTokenType.Object: + { + if (_currentScope.CurrentPropertyName == null) + { + throw new JsonReaderException("CurrentPropertyName has not been set on scope."); + } + + IList schemas = new List(); + + foreach (JsonSchemaModel schema in CurrentSchemas) + { + JsonSchemaModel propertySchema; + if (schema.Properties != null && schema.Properties.TryGetValue(_currentScope.CurrentPropertyName, out propertySchema)) + { + schemas.Add(propertySchema); + } + if (schema.PatternProperties != null) + { + foreach (KeyValuePair patternProperty in schema.PatternProperties) + { + if (Regex.IsMatch(_currentScope.CurrentPropertyName, patternProperty.Key)) + { + schemas.Add(patternProperty.Value); + } + } + } + + if (schemas.Count == 0 && schema.AllowAdditionalProperties && schema.AdditionalProperties != null) + { + schemas.Add(schema.AdditionalProperties); + } + } + + return schemas; + } + case JTokenType.Array: + { + IList schemas = new List(); + + foreach (JsonSchemaModel schema in CurrentSchemas) + { + if (!schema.PositionalItemsValidation) + { + if (schema.Items != null && schema.Items.Count > 0) + { + schemas.Add(schema.Items[0]); + } + } + else + { + if (schema.Items != null && schema.Items.Count > 0) + { + if (schema.Items.Count > (_currentScope.ArrayItemCount - 1)) + { + schemas.Add(schema.Items[_currentScope.ArrayItemCount - 1]); + } + } + + if (schema.AllowAdditionalItems && schema.AdditionalItems != null) + { + schemas.Add(schema.AdditionalItems); + } + } + } + + return schemas; + } + case JTokenType.Constructor: + return EmptySchemaList; + default: + throw new ArgumentOutOfRangeException("TokenType", "Unexpected token type: {0}".FormatWith(CultureInfo.InvariantCulture, _currentScope.TokenType)); + } + } + } + + private void RaiseError(string message, JsonSchemaModel schema) + { + IJsonLineInfo lineInfo = this; + + string exceptionMessage = (lineInfo.HasLineInfo()) + ? message + " Line {0}, position {1}.".FormatWith(CultureInfo.InvariantCulture, lineInfo.LineNumber, lineInfo.LinePosition) + : message; + + OnValidationEvent(new JsonSchemaException(exceptionMessage, null, Path, lineInfo.LineNumber, lineInfo.LinePosition)); + } + + private void OnValidationEvent(JsonSchemaException exception) + { + ValidationEventHandler handler = ValidationEventHandler; + if (handler != null) + { + handler(this, new ValidationEventArgs(exception)); + } + else + { + throw exception; + } + } + + /// + /// Initializes a new instance of the class that + /// validates the content returned from the given . + /// + /// The to read from while validating. + public JsonValidatingReader(JsonReader reader) + { + ValidationUtils.ArgumentNotNull(reader, nameof(reader)); + _reader = reader; + _stack = new Stack(); + } + + /// + /// Gets or sets the schema. + /// + /// The schema. + public JsonSchema Schema + { + get { return _schema; } + set + { + if (TokenType != JsonToken.None) + { + throw new InvalidOperationException("Cannot change schema while validating JSON."); + } + + _schema = value; + _model = null; + } + } + + /// + /// Gets the used to construct this . + /// + /// The specified in the constructor. + public JsonReader Reader + { + get { return _reader; } + } + + private void ValidateNotDisallowed(JsonSchemaModel schema) + { + if (schema == null) + { + return; + } + + JsonSchemaType? currentNodeType = GetCurrentNodeSchemaType(); + if (currentNodeType != null) + { + if (JsonSchemaGenerator.HasFlag(schema.Disallow, currentNodeType.GetValueOrDefault())) + { + RaiseError("Type {0} is disallowed.".FormatWith(CultureInfo.InvariantCulture, currentNodeType), schema); + } + } + } + + private JsonSchemaType? GetCurrentNodeSchemaType() + { + switch (_reader.TokenType) + { + case JsonToken.StartObject: + return JsonSchemaType.Object; + case JsonToken.StartArray: + return JsonSchemaType.Array; + case JsonToken.Integer: + return JsonSchemaType.Integer; + case JsonToken.Float: + return JsonSchemaType.Float; + case JsonToken.String: + return JsonSchemaType.String; + case JsonToken.Boolean: + return JsonSchemaType.Boolean; + case JsonToken.Null: + return JsonSchemaType.Null; + default: + return null; + } + } + + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . + public override int? ReadAsInt32() + { + int? i = _reader.ReadAsInt32(); + + ValidateCurrentToken(); + return i; + } + + /// + /// Reads the next JSON token from the stream as a []. + /// + /// + /// A [] or a null reference if the next JSON token is null. + /// + public override byte[] ReadAsBytes() + { + byte[] data = _reader.ReadAsBytes(); + + ValidateCurrentToken(); + return data; + } + + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . + public override decimal? ReadAsDecimal() + { + decimal? d = _reader.ReadAsDecimal(); + + ValidateCurrentToken(); + return d; + } + + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . + public override double? ReadAsDouble() + { + double? d = _reader.ReadAsDouble(); + + ValidateCurrentToken(); + return d; + } + + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . + public override bool? ReadAsBoolean() + { + bool? b = _reader.ReadAsBoolean(); + + ValidateCurrentToken(); + return b; + } + + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . This method will return null at the end of an array. + public override string ReadAsString() + { + string s = _reader.ReadAsString(); + + ValidateCurrentToken(); + return s; + } + + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . This method will return null at the end of an array. + public override DateTime? ReadAsDateTime() + { + DateTime? dateTime = _reader.ReadAsDateTime(); + + ValidateCurrentToken(); + return dateTime; + } + +#if !NET20 + /// + /// Reads the next JSON token from the stream as a . + /// + /// A . + public override DateTimeOffset? ReadAsDateTimeOffset() + { + DateTimeOffset? dateTimeOffset = _reader.ReadAsDateTimeOffset(); + + ValidateCurrentToken(); + return dateTimeOffset; + } +#endif + + /// + /// Reads the next JSON token from the stream. + /// + /// + /// true if the next token was read successfully; false if there are no more tokens to read. + /// + public override bool Read() + { + if (!_reader.Read()) + { + return false; + } + + if (_reader.TokenType == JsonToken.Comment) + { + return true; + } + + ValidateCurrentToken(); + return true; + } + + private void ValidateCurrentToken() + { + // first time validate has been called. build model + if (_model == null) + { + JsonSchemaModelBuilder builder = new JsonSchemaModelBuilder(); + _model = builder.Build(_schema); + + if (!JsonTokenUtils.IsStartToken(_reader.TokenType)) + { + Push(new SchemaScope(JTokenType.None, CurrentMemberSchemas)); + } + } + + switch (_reader.TokenType) + { + case JsonToken.StartObject: + ProcessValue(); + IList objectSchemas = CurrentMemberSchemas.Where(ValidateObject).ToList(); + Push(new SchemaScope(JTokenType.Object, objectSchemas)); + WriteToken(CurrentSchemas); + break; + case JsonToken.StartArray: + ProcessValue(); + IList arraySchemas = CurrentMemberSchemas.Where(ValidateArray).ToList(); + Push(new SchemaScope(JTokenType.Array, arraySchemas)); + WriteToken(CurrentSchemas); + break; + case JsonToken.StartConstructor: + ProcessValue(); + Push(new SchemaScope(JTokenType.Constructor, null)); + WriteToken(CurrentSchemas); + break; + case JsonToken.PropertyName: + WriteToken(CurrentSchemas); + foreach (JsonSchemaModel schema in CurrentSchemas) + { + ValidatePropertyName(schema); + } + break; + case JsonToken.Raw: + ProcessValue(); + break; + case JsonToken.Integer: + ProcessValue(); + WriteToken(CurrentMemberSchemas); + foreach (JsonSchemaModel schema in CurrentMemberSchemas) + { + ValidateInteger(schema); + } + break; + case JsonToken.Float: + ProcessValue(); + WriteToken(CurrentMemberSchemas); + foreach (JsonSchemaModel schema in CurrentMemberSchemas) + { + ValidateFloat(schema); + } + break; + case JsonToken.String: + ProcessValue(); + WriteToken(CurrentMemberSchemas); + foreach (JsonSchemaModel schema in CurrentMemberSchemas) + { + ValidateString(schema); + } + break; + case JsonToken.Boolean: + ProcessValue(); + WriteToken(CurrentMemberSchemas); + foreach (JsonSchemaModel schema in CurrentMemberSchemas) + { + ValidateBoolean(schema); + } + break; + case JsonToken.Null: + ProcessValue(); + WriteToken(CurrentMemberSchemas); + foreach (JsonSchemaModel schema in CurrentMemberSchemas) + { + ValidateNull(schema); + } + break; + case JsonToken.EndObject: + WriteToken(CurrentSchemas); + foreach (JsonSchemaModel schema in CurrentSchemas) + { + ValidateEndObject(schema); + } + Pop(); + break; + case JsonToken.EndArray: + WriteToken(CurrentSchemas); + foreach (JsonSchemaModel schema in CurrentSchemas) + { + ValidateEndArray(schema); + } + Pop(); + break; + case JsonToken.EndConstructor: + WriteToken(CurrentSchemas); + Pop(); + break; + case JsonToken.Undefined: + case JsonToken.Date: + case JsonToken.Bytes: + // these have no equivalent in JSON schema + WriteToken(CurrentMemberSchemas); + break; + case JsonToken.None: + // no content, do nothing + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + + private void WriteToken(IList schemas) + { + foreach (SchemaScope schemaScope in _stack) + { + bool isInUniqueArray = (schemaScope.TokenType == JTokenType.Array && schemaScope.IsUniqueArray && schemaScope.ArrayItemCount > 0); + + if (isInUniqueArray || schemas.Any(s => s.Enum != null)) + { + if (schemaScope.CurrentItemWriter == null) + { + if (JsonTokenUtils.IsEndToken(_reader.TokenType)) + { + continue; + } + + schemaScope.CurrentItemWriter = new JTokenWriter(); + } + + schemaScope.CurrentItemWriter.WriteToken(_reader, false); + + // finished writing current item + if (schemaScope.CurrentItemWriter.Top == 0 && _reader.TokenType != JsonToken.PropertyName) + { + JToken finishedItem = schemaScope.CurrentItemWriter.Token; + + // start next item with new writer + schemaScope.CurrentItemWriter = null; + + if (isInUniqueArray) + { + if (schemaScope.UniqueArrayItems.Contains(finishedItem, JToken.EqualityComparer)) + { + RaiseError("Non-unique array item at index {0}.".FormatWith(CultureInfo.InvariantCulture, schemaScope.ArrayItemCount - 1), schemaScope.Schemas.First(s => s.UniqueItems)); + } + + schemaScope.UniqueArrayItems.Add(finishedItem); + } + else if (schemas.Any(s => s.Enum != null)) + { + foreach (JsonSchemaModel schema in schemas) + { + if (schema.Enum != null) + { + if (!schema.Enum.ContainsValue(finishedItem, JToken.EqualityComparer)) + { + StringWriter sw = new StringWriter(CultureInfo.InvariantCulture); + finishedItem.WriteTo(new JsonTextWriter(sw)); + + RaiseError("Value {0} is not defined in enum.".FormatWith(CultureInfo.InvariantCulture, sw.ToString()), schema); + } + } + } + } + } + } + } + } + + private void ValidateEndObject(JsonSchemaModel schema) + { + if (schema == null) + { + return; + } + + Dictionary requiredProperties = _currentScope.RequiredProperties; + + if (requiredProperties != null) + { + List unmatchedRequiredProperties = + requiredProperties.Where(kv => !kv.Value).Select(kv => kv.Key).ToList(); + + if (unmatchedRequiredProperties.Count > 0) + { + RaiseError("Required properties are missing from object: {0}.".FormatWith(CultureInfo.InvariantCulture, string.Join(", ", unmatchedRequiredProperties.ToArray())), schema); + } + } + } + + private void ValidateEndArray(JsonSchemaModel schema) + { + if (schema == null) + { + return; + } + + int arrayItemCount = _currentScope.ArrayItemCount; + + if (schema.MaximumItems != null && arrayItemCount > schema.MaximumItems) + { + RaiseError("Array item count {0} exceeds maximum count of {1}.".FormatWith(CultureInfo.InvariantCulture, arrayItemCount, schema.MaximumItems), schema); + } + + if (schema.MinimumItems != null && arrayItemCount < schema.MinimumItems) + { + RaiseError("Array item count {0} is less than minimum count of {1}.".FormatWith(CultureInfo.InvariantCulture, arrayItemCount, schema.MinimumItems), schema); + } + } + + private void ValidateNull(JsonSchemaModel schema) + { + if (schema == null) + { + return; + } + + if (!TestType(schema, JsonSchemaType.Null)) + { + return; + } + + ValidateNotDisallowed(schema); + } + + private void ValidateBoolean(JsonSchemaModel schema) + { + if (schema == null) + { + return; + } + + if (!TestType(schema, JsonSchemaType.Boolean)) + { + return; + } + + ValidateNotDisallowed(schema); + } + + private void ValidateString(JsonSchemaModel schema) + { + if (schema == null) + { + return; + } + + if (!TestType(schema, JsonSchemaType.String)) + { + return; + } + + ValidateNotDisallowed(schema); + + string value = _reader.Value.ToString(); + + if (schema.MaximumLength != null && value.Length > schema.MaximumLength) + { + RaiseError("String '{0}' exceeds maximum length of {1}.".FormatWith(CultureInfo.InvariantCulture, value, schema.MaximumLength), schema); + } + + if (schema.MinimumLength != null && value.Length < schema.MinimumLength) + { + RaiseError("String '{0}' is less than minimum length of {1}.".FormatWith(CultureInfo.InvariantCulture, value, schema.MinimumLength), schema); + } + + if (schema.Patterns != null) + { + foreach (string pattern in schema.Patterns) + { + if (!Regex.IsMatch(value, pattern)) + { + RaiseError("String '{0}' does not match regex pattern '{1}'.".FormatWith(CultureInfo.InvariantCulture, value, pattern), schema); + } + } + } + } + + private void ValidateInteger(JsonSchemaModel schema) + { + if (schema == null) + { + return; + } + + if (!TestType(schema, JsonSchemaType.Integer)) + { + return; + } + + ValidateNotDisallowed(schema); + + object value = _reader.Value; + + if (schema.Maximum != null) + { + if (JValue.Compare(JTokenType.Integer, value, schema.Maximum) > 0) + { + RaiseError("Integer {0} exceeds maximum value of {1}.".FormatWith(CultureInfo.InvariantCulture, value, schema.Maximum), schema); + } + if (schema.ExclusiveMaximum && JValue.Compare(JTokenType.Integer, value, schema.Maximum) == 0) + { + RaiseError("Integer {0} equals maximum value of {1} and exclusive maximum is true.".FormatWith(CultureInfo.InvariantCulture, value, schema.Maximum), schema); + } + } + + if (schema.Minimum != null) + { + if (JValue.Compare(JTokenType.Integer, value, schema.Minimum) < 0) + { + RaiseError("Integer {0} is less than minimum value of {1}.".FormatWith(CultureInfo.InvariantCulture, value, schema.Minimum), schema); + } + if (schema.ExclusiveMinimum && JValue.Compare(JTokenType.Integer, value, schema.Minimum) == 0) + { + RaiseError("Integer {0} equals minimum value of {1} and exclusive minimum is true.".FormatWith(CultureInfo.InvariantCulture, value, schema.Minimum), schema); + } + } + + if (schema.DivisibleBy != null) + { + bool notDivisible; +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (value is BigInteger) + { + // not that this will lose any decimal point on DivisibleBy + // so manually raise an error if DivisibleBy is not an integer and value is not zero + BigInteger i = (BigInteger)value; + bool divisibleNonInteger = !Math.Abs(schema.DivisibleBy.Value - Math.Truncate(schema.DivisibleBy.Value)).Equals(0); + if (divisibleNonInteger) + { + notDivisible = i != 0; + } + else + { + notDivisible = i % new BigInteger(schema.DivisibleBy.Value) != 0; + } + } + else +#endif + { + notDivisible = !IsZero(Convert.ToInt64(value, CultureInfo.InvariantCulture) % schema.DivisibleBy.GetValueOrDefault()); + } + + if (notDivisible) + { + RaiseError("Integer {0} is not evenly divisible by {1}.".FormatWith(CultureInfo.InvariantCulture, JsonConvert.ToString(value), schema.DivisibleBy), schema); + } + } + } + + private void ProcessValue() + { + if (_currentScope != null && _currentScope.TokenType == JTokenType.Array) + { + _currentScope.ArrayItemCount++; + + foreach (JsonSchemaModel currentSchema in CurrentSchemas) + { + // if there is positional validation and the array index is past the number of item validation schemas and there is no additonal items then error + if (currentSchema != null + && currentSchema.PositionalItemsValidation + && !currentSchema.AllowAdditionalItems + && (currentSchema.Items == null || _currentScope.ArrayItemCount - 1 >= currentSchema.Items.Count)) + { + RaiseError("Index {0} has not been defined and the schema does not allow additional items.".FormatWith(CultureInfo.InvariantCulture, _currentScope.ArrayItemCount), currentSchema); + } + } + } + } + + private void ValidateFloat(JsonSchemaModel schema) + { + if (schema == null) + { + return; + } + + if (!TestType(schema, JsonSchemaType.Float)) + { + return; + } + + ValidateNotDisallowed(schema); + + double value = Convert.ToDouble(_reader.Value, CultureInfo.InvariantCulture); + + if (schema.Maximum != null) + { + if (value > schema.Maximum) + { + RaiseError("Float {0} exceeds maximum value of {1}.".FormatWith(CultureInfo.InvariantCulture, JsonConvert.ToString(value), schema.Maximum), schema); + } + if (schema.ExclusiveMaximum && value == schema.Maximum) + { + RaiseError("Float {0} equals maximum value of {1} and exclusive maximum is true.".FormatWith(CultureInfo.InvariantCulture, JsonConvert.ToString(value), schema.Maximum), schema); + } + } + + if (schema.Minimum != null) + { + if (value < schema.Minimum) + { + RaiseError("Float {0} is less than minimum value of {1}.".FormatWith(CultureInfo.InvariantCulture, JsonConvert.ToString(value), schema.Minimum), schema); + } + if (schema.ExclusiveMinimum && value == schema.Minimum) + { + RaiseError("Float {0} equals minimum value of {1} and exclusive minimum is true.".FormatWith(CultureInfo.InvariantCulture, JsonConvert.ToString(value), schema.Minimum), schema); + } + } + + if (schema.DivisibleBy != null) + { + double remainder = FloatingPointRemainder(value, schema.DivisibleBy.GetValueOrDefault()); + + if (!IsZero(remainder)) + { + RaiseError("Float {0} is not evenly divisible by {1}.".FormatWith(CultureInfo.InvariantCulture, JsonConvert.ToString(value), schema.DivisibleBy), schema); + } + } + } + + private static double FloatingPointRemainder(double dividend, double divisor) + { + return dividend - Math.Floor(dividend / divisor) * divisor; + } + + private static bool IsZero(double value) + { + const double epsilon = 2.2204460492503131e-016; + + return Math.Abs(value) < 20.0 * epsilon; + } + + private void ValidatePropertyName(JsonSchemaModel schema) + { + if (schema == null) + { + return; + } + + string propertyName = Convert.ToString(_reader.Value, CultureInfo.InvariantCulture); + + if (_currentScope.RequiredProperties.ContainsKey(propertyName)) + { + _currentScope.RequiredProperties[propertyName] = true; + } + + if (!schema.AllowAdditionalProperties) + { + bool propertyDefinied = IsPropertyDefinied(schema, propertyName); + + if (!propertyDefinied) + { + RaiseError("Property '{0}' has not been defined and the schema does not allow additional properties.".FormatWith(CultureInfo.InvariantCulture, propertyName), schema); + } + } + + _currentScope.CurrentPropertyName = propertyName; + } + + private bool IsPropertyDefinied(JsonSchemaModel schema, string propertyName) + { + if (schema.Properties != null && schema.Properties.ContainsKey(propertyName)) + { + return true; + } + + if (schema.PatternProperties != null) + { + foreach (string pattern in schema.PatternProperties.Keys) + { + if (Regex.IsMatch(propertyName, pattern)) + { + return true; + } + } + } + + return false; + } + + private bool ValidateArray(JsonSchemaModel schema) + { + if (schema == null) + { + return true; + } + + return (TestType(schema, JsonSchemaType.Array)); + } + + private bool ValidateObject(JsonSchemaModel schema) + { + if (schema == null) + { + return true; + } + + return (TestType(schema, JsonSchemaType.Object)); + } + + private bool TestType(JsonSchemaModel currentSchema, JsonSchemaType currentType) + { + if (!JsonSchemaGenerator.HasFlag(currentSchema.Type, currentType)) + { + RaiseError("Invalid type. Expected {0} but got {1}.".FormatWith(CultureInfo.InvariantCulture, currentSchema.Type, currentType), currentSchema); + return false; + } + + return true; + } + + bool IJsonLineInfo.HasLineInfo() + { + IJsonLineInfo lineInfo = _reader as IJsonLineInfo; + return lineInfo != null && lineInfo.HasLineInfo(); + } + + int IJsonLineInfo.LineNumber + { + get + { + IJsonLineInfo lineInfo = _reader as IJsonLineInfo; + return (lineInfo != null) ? lineInfo.LineNumber : 0; + } + } + + int IJsonLineInfo.LinePosition + { + get + { + IJsonLineInfo lineInfo = _reader as IJsonLineInfo; + return (lineInfo != null) ? lineInfo.LinePosition : 0; + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonWriter.cs b/Common/00-1Json8.3/Json8.3/JsonWriter.cs new file mode 100644 index 0000000..293b153 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonWriter.cs @@ -0,0 +1,1714 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) +using System.Numerics; +#endif +using Newtonsoft.Json.Utilities; +using System.Globalization; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json +{ + /// + /// Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + /// + public abstract class JsonWriter : IDisposable + { + internal enum State + { + Start = 0, + Property = 1, + ObjectStart = 2, + Object = 3, + ArrayStart = 4, + Array = 5, + ConstructorStart = 6, + Constructor = 7, + Closed = 8, + Error = 9 + } + + // array that gives a new state based on the current state an the token being written + private static readonly State[][] StateArray; + + internal static readonly State[][] StateArrayTempate = new[] + { + // Start PropertyName ObjectStart Object ArrayStart Array ConstructorStart Constructor Closed Error + // + /* None */new[] { State.Error, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error }, + /* StartObject */new[] { State.ObjectStart, State.ObjectStart, State.Error, State.Error, State.ObjectStart, State.ObjectStart, State.ObjectStart, State.ObjectStart, State.Error, State.Error }, + /* StartArray */new[] { State.ArrayStart, State.ArrayStart, State.Error, State.Error, State.ArrayStart, State.ArrayStart, State.ArrayStart, State.ArrayStart, State.Error, State.Error }, + /* StartConstructor */new[] { State.ConstructorStart, State.ConstructorStart, State.Error, State.Error, State.ConstructorStart, State.ConstructorStart, State.ConstructorStart, State.ConstructorStart, State.Error, State.Error }, + /* Property */new[] { State.Property, State.Error, State.Property, State.Property, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error }, + /* Comment */new[] { State.Start, State.Property, State.ObjectStart, State.Object, State.ArrayStart, State.Array, State.Constructor, State.Constructor, State.Error, State.Error }, + /* Raw */new[] { State.Start, State.Property, State.ObjectStart, State.Object, State.ArrayStart, State.Array, State.Constructor, State.Constructor, State.Error, State.Error }, + /* Value (this will be copied) */new[] { State.Start, State.Object, State.Error, State.Error, State.Array, State.Array, State.Constructor, State.Constructor, State.Error, State.Error } + }; + + internal static State[][] BuildStateArray() + { + var allStates = StateArrayTempate.ToList(); + var errorStates = StateArrayTempate[0]; + var valueStates = StateArrayTempate[7]; + + foreach (JsonToken valueToken in EnumUtils.GetValues(typeof(JsonToken))) + { + if (allStates.Count <= (int)valueToken) + { + switch (valueToken) + { + case JsonToken.Integer: + case JsonToken.Float: + case JsonToken.String: + case JsonToken.Boolean: + case JsonToken.Null: + case JsonToken.Undefined: + case JsonToken.Date: + case JsonToken.Bytes: + allStates.Add(valueStates); + break; + default: + allStates.Add(errorStates); + break; + } + } + } + + return allStates.ToArray(); + } + + static JsonWriter() + { + StateArray = BuildStateArray(); + } + + private List _stack; + private JsonPosition _currentPosition; + private State _currentState; + private Formatting _formatting; + + /// + /// Gets or sets a value indicating whether the underlying stream or + /// should be closed when the writer is closed. + /// + /// + /// true to close the underlying stream or when + /// the writer is closed; otherwise false. The default is true. + /// + public bool CloseOutput { get; set; } + + /// + /// Gets the top. + /// + /// The top. + protected internal int Top + { + get + { + int depth = (_stack != null) ? _stack.Count : 0; + if (Peek() != JsonContainerType.None) + { + depth++; + } + + return depth; + } + } + + /// + /// Gets the state of the writer. + /// + public WriteState WriteState + { + get + { + switch (_currentState) + { + case State.Error: + return WriteState.Error; + case State.Closed: + return WriteState.Closed; + case State.Object: + case State.ObjectStart: + return WriteState.Object; + case State.Array: + case State.ArrayStart: + return WriteState.Array; + case State.Constructor: + case State.ConstructorStart: + return WriteState.Constructor; + case State.Property: + return WriteState.Property; + case State.Start: + return WriteState.Start; + default: + throw JsonWriterException.Create(this, "Invalid state: " + _currentState, null); + } + } + } + + internal string ContainerPath + { + get + { + if (_currentPosition.Type == JsonContainerType.None || _stack == null) + { + return string.Empty; + } + + return JsonPosition.BuildPath(_stack, null); + } + } + + /// + /// Gets the path of the writer. + /// + public string Path + { + get + { + if (_currentPosition.Type == JsonContainerType.None) + { + return string.Empty; + } + + bool insideContainer = (_currentState != State.ArrayStart + && _currentState != State.ConstructorStart + && _currentState != State.ObjectStart); + + JsonPosition? current = insideContainer ? (JsonPosition?)_currentPosition : null; + + return JsonPosition.BuildPath(_stack, current); + } + } + + private DateFormatHandling _dateFormatHandling; + private DateTimeZoneHandling _dateTimeZoneHandling; + private StringEscapeHandling _stringEscapeHandling; + private FloatFormatHandling _floatFormatHandling; + private string _dateFormatString; + private CultureInfo _culture; + + /// + /// Indicates how JSON text output is formatted. + /// + public Formatting Formatting + { + get { return _formatting; } + set + { + if (value < Formatting.None || value > Formatting.Indented) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _formatting = value; + } + } + + /// + /// Get or set how dates are written to JSON text. + /// + public DateFormatHandling DateFormatHandling + { + get { return _dateFormatHandling; } + set + { + if (value < DateFormatHandling.IsoDateFormat || value > DateFormatHandling.MicrosoftDateFormat) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _dateFormatHandling = value; + } + } + + /// + /// Get or set how time zones are handling when writing JSON text. + /// + public DateTimeZoneHandling DateTimeZoneHandling + { + get { return _dateTimeZoneHandling; } + set + { + if (value < DateTimeZoneHandling.Local || value > DateTimeZoneHandling.RoundtripKind) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _dateTimeZoneHandling = value; + } + } + + /// + /// Get or set how strings are escaped when writing JSON text. + /// + public StringEscapeHandling StringEscapeHandling + { + get { return _stringEscapeHandling; } + set + { + if (value < StringEscapeHandling.Default || value > StringEscapeHandling.EscapeHtml) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _stringEscapeHandling = value; + OnStringEscapeHandlingChanged(); + } + } + + internal virtual void OnStringEscapeHandlingChanged() + { + // hacky but there is a calculated value that relies on StringEscapeHandling + } + + /// + /// Get or set how special floating point numbers, e.g. , + /// and , + /// are written to JSON text. + /// + public FloatFormatHandling FloatFormatHandling + { + get { return _floatFormatHandling; } + set + { + if (value < FloatFormatHandling.String || value > FloatFormatHandling.DefaultValue) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _floatFormatHandling = value; + } + } + + /// + /// Get or set how and values are formatting when writing JSON text. + /// + public string DateFormatString + { + get { return _dateFormatString; } + set { _dateFormatString = value; } + } + + /// + /// Gets or sets the culture used when writing JSON. Defaults to . + /// + public CultureInfo Culture + { + get { return _culture ?? CultureInfo.InvariantCulture; } + set { _culture = value; } + } + + /// + /// Creates an instance of the JsonWriter class. + /// + protected JsonWriter() + { + _currentState = State.Start; + _formatting = Formatting.None; + _dateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; + + CloseOutput = true; + } + + internal void UpdateScopeWithFinishedValue() + { + if (_currentPosition.HasIndex) + { + _currentPosition.Position++; + } + } + + private void Push(JsonContainerType value) + { + if (_currentPosition.Type != JsonContainerType.None) + { + if (_stack == null) + { + _stack = new List(); + } + + _stack.Add(_currentPosition); + } + + _currentPosition = new JsonPosition(value); + } + + private JsonContainerType Pop() + { + JsonPosition oldPosition = _currentPosition; + + if (_stack != null && _stack.Count > 0) + { + _currentPosition = _stack[_stack.Count - 1]; + _stack.RemoveAt(_stack.Count - 1); + } + else + { + _currentPosition = new JsonPosition(); + } + + return oldPosition.Type; + } + + private JsonContainerType Peek() + { + return _currentPosition.Type; + } + + /// + /// Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + /// + public abstract void Flush(); + + /// + /// Closes this stream and the underlying stream. + /// + public virtual void Close() + { + AutoCompleteAll(); + } + + /// + /// Writes the beginning of a JSON object. + /// + public virtual void WriteStartObject() + { + InternalWriteStart(JsonToken.StartObject, JsonContainerType.Object); + } + + /// + /// Writes the end of a JSON object. + /// + public virtual void WriteEndObject() + { + InternalWriteEnd(JsonContainerType.Object); + } + + /// + /// Writes the beginning of a JSON array. + /// + public virtual void WriteStartArray() + { + InternalWriteStart(JsonToken.StartArray, JsonContainerType.Array); + } + + /// + /// Writes the end of an array. + /// + public virtual void WriteEndArray() + { + InternalWriteEnd(JsonContainerType.Array); + } + + /// + /// Writes the start of a constructor with the given name. + /// + /// The name of the constructor. + public virtual void WriteStartConstructor(string name) + { + InternalWriteStart(JsonToken.StartConstructor, JsonContainerType.Constructor); + } + + /// + /// Writes the end constructor. + /// + public virtual void WriteEndConstructor() + { + InternalWriteEnd(JsonContainerType.Constructor); + } + + /// + /// Writes the property name of a name/value pair on a JSON object. + /// + /// The name of the property. + public virtual void WritePropertyName(string name) + { + InternalWritePropertyName(name); + } + + /// + /// Writes the property name of a name/value pair on a JSON object. + /// + /// The name of the property. + /// A flag to indicate whether the text should be escaped when it is written as a JSON property name. + public virtual void WritePropertyName(string name, bool escape) + { + WritePropertyName(name); + } + + /// + /// Writes the end of the current JSON object or array. + /// + public virtual void WriteEnd() + { + WriteEnd(Peek()); + } + + /// + /// Writes the current token and its children. + /// + /// The to read the token from. + public void WriteToken(JsonReader reader) + { + WriteToken(reader, true); + } + + /// + /// Writes the current token. + /// + /// The to read the token from. + /// A flag indicating whether the current token's children should be written. + public void WriteToken(JsonReader reader, bool writeChildren) + { + ValidationUtils.ArgumentNotNull(reader, nameof(reader)); + + WriteToken(reader, writeChildren, true, true); + } + + /// + /// Writes the token and its value. + /// + /// The to write. + /// + /// The value to write. + /// A value is only required for tokens that have an associated value, e.g. the property name for . + /// A null value can be passed to the method for token's that don't have a value, e.g. . + public void WriteToken(JsonToken token, object value) + { + switch (token) + { + case JsonToken.None: + // read to next + break; + case JsonToken.StartObject: + WriteStartObject(); + break; + case JsonToken.StartArray: + WriteStartArray(); + break; + case JsonToken.StartConstructor: + ValidationUtils.ArgumentNotNull(value, nameof(value)); + WriteStartConstructor(value.ToString()); + break; + case JsonToken.PropertyName: + ValidationUtils.ArgumentNotNull(value, nameof(value)); + WritePropertyName(value.ToString()); + break; + case JsonToken.Comment: + WriteComment((value != null) ? value.ToString() : null); + break; + case JsonToken.Integer: + ValidationUtils.ArgumentNotNull(value, nameof(value)); +#if !(NET20 || NET35 || PORTABLE || PORTABLE40) + if (value is BigInteger) + { + WriteValue((BigInteger)value); + } + else +#endif + { + WriteValue(Convert.ToInt64(value, CultureInfo.InvariantCulture)); + } + break; + case JsonToken.Float: + ValidationUtils.ArgumentNotNull(value, nameof(value)); + if (value is decimal) + { + WriteValue((decimal)value); + } + else if (value is double) + { + WriteValue((double)value); + } + else if (value is float) + { + WriteValue((float)value); + } + else + { + WriteValue(Convert.ToDouble(value, CultureInfo.InvariantCulture)); + } + break; + case JsonToken.String: + ValidationUtils.ArgumentNotNull(value, nameof(value)); + WriteValue(value.ToString()); + break; + case JsonToken.Boolean: + ValidationUtils.ArgumentNotNull(value, nameof(value)); + WriteValue(Convert.ToBoolean(value, CultureInfo.InvariantCulture)); + break; + case JsonToken.Null: + WriteNull(); + break; + case JsonToken.Undefined: + WriteUndefined(); + break; + case JsonToken.EndObject: + WriteEndObject(); + break; + case JsonToken.EndArray: + WriteEndArray(); + break; + case JsonToken.EndConstructor: + WriteEndConstructor(); + break; + case JsonToken.Date: + ValidationUtils.ArgumentNotNull(value, nameof(value)); +#if !NET20 + if (value is DateTimeOffset) + { + WriteValue((DateTimeOffset)value); + } + else +#endif + { + WriteValue(Convert.ToDateTime(value, CultureInfo.InvariantCulture)); + } + break; + case JsonToken.Raw: + WriteRawValue((value != null) ? value.ToString() : null); + break; + case JsonToken.Bytes: + ValidationUtils.ArgumentNotNull(value, nameof(value)); + if (value is Guid) + { + WriteValue((Guid)value); + } + else + { + WriteValue((byte[])value); + } + break; + default: + throw MiscellaneousUtils.CreateArgumentOutOfRangeException(nameof(token), token, "Unexpected token type."); + } + } + + /// + /// Writes the token. + /// + /// The to write. + public void WriteToken(JsonToken token) + { + WriteToken(token, null); + } + + internal void WriteToken(JsonReader reader, bool writeChildren, bool writeDateConstructorAsDate, bool writeComments) + { + int initialDepth; + + if (reader.TokenType == JsonToken.None) + { + initialDepth = -1; + } + else if (!JsonTokenUtils.IsStartToken(reader.TokenType)) + { + initialDepth = reader.Depth + 1; + } + else + { + initialDepth = reader.Depth; + } + + WriteToken(reader, initialDepth, writeChildren, writeDateConstructorAsDate, writeComments); + } + + internal void WriteToken(JsonReader reader, int initialDepth, bool writeChildren, bool writeDateConstructorAsDate, bool writeComments) + { + do + { + // write a JValue date when the constructor is for a date + if (writeDateConstructorAsDate && reader.TokenType == JsonToken.StartConstructor && string.Equals(reader.Value.ToString(), "Date", StringComparison.Ordinal)) + { + WriteConstructorDate(reader); + } + else + { + if (reader.TokenType != JsonToken.Comment || writeComments) + { + WriteToken(reader.TokenType, reader.Value); + } + } + } while ( + // stop if we have reached the end of the token being read + initialDepth - 1 < reader.Depth - (JsonTokenUtils.IsEndToken(reader.TokenType) ? 1 : 0) + && writeChildren + && reader.Read()); + } + + private void WriteConstructorDate(JsonReader reader) + { + if (!reader.Read()) + { + throw JsonWriterException.Create(this, "Unexpected end when reading date constructor.", null); + } + if (reader.TokenType != JsonToken.Integer) + { + throw JsonWriterException.Create(this, "Unexpected token when reading date constructor. Expected Integer, got " + reader.TokenType, null); + } + + long ticks = (long)reader.Value; + DateTime date = DateTimeUtils.ConvertJavaScriptTicksToDateTime(ticks); + + if (!reader.Read()) + { + throw JsonWriterException.Create(this, "Unexpected end when reading date constructor.", null); + } + if (reader.TokenType != JsonToken.EndConstructor) + { + throw JsonWriterException.Create(this, "Unexpected token when reading date constructor. Expected EndConstructor, got " + reader.TokenType, null); + } + + WriteValue(date); + } + + private void WriteEnd(JsonContainerType type) + { + switch (type) + { + case JsonContainerType.Object: + WriteEndObject(); + break; + case JsonContainerType.Array: + WriteEndArray(); + break; + case JsonContainerType.Constructor: + WriteEndConstructor(); + break; + default: + throw JsonWriterException.Create(this, "Unexpected type when writing end: " + type, null); + } + } + + private void AutoCompleteAll() + { + while (Top > 0) + { + WriteEnd(); + } + } + + private JsonToken GetCloseTokenForType(JsonContainerType type) + { + switch (type) + { + case JsonContainerType.Object: + return JsonToken.EndObject; + case JsonContainerType.Array: + return JsonToken.EndArray; + case JsonContainerType.Constructor: + return JsonToken.EndConstructor; + default: + throw JsonWriterException.Create(this, "No close token for type: " + type, null); + } + } + + private void AutoCompleteClose(JsonContainerType type) + { + // write closing symbol and calculate new state + int levelsToComplete = 0; + + if (_currentPosition.Type == type) + { + levelsToComplete = 1; + } + else + { + int top = Top - 2; + for (int i = top; i >= 0; i--) + { + int currentLevel = top - i; + + if (_stack[currentLevel].Type == type) + { + levelsToComplete = i + 2; + break; + } + } + } + + if (levelsToComplete == 0) + { + throw JsonWriterException.Create(this, "No token to close.", null); + } + + for (int i = 0; i < levelsToComplete; i++) + { + JsonToken token = GetCloseTokenForType(Pop()); + + if (_currentState == State.Property) + { + WriteNull(); + } + + if (_formatting == Formatting.Indented) + { + if (_currentState != State.ObjectStart && _currentState != State.ArrayStart) + { + WriteIndent(); + } + } + + WriteEnd(token); + + JsonContainerType currentLevelType = Peek(); + + switch (currentLevelType) + { + case JsonContainerType.Object: + _currentState = State.Object; + break; + case JsonContainerType.Array: + _currentState = State.Array; + break; + case JsonContainerType.Constructor: + _currentState = State.Array; + break; + case JsonContainerType.None: + _currentState = State.Start; + break; + default: + throw JsonWriterException.Create(this, "Unknown JsonType: " + currentLevelType, null); + } + } + } + + /// + /// Writes the specified end token. + /// + /// The end token to write. + protected virtual void WriteEnd(JsonToken token) + { + } + + /// + /// Writes indent characters. + /// + protected virtual void WriteIndent() + { + } + + /// + /// Writes the JSON value delimiter. + /// + protected virtual void WriteValueDelimiter() + { + } + + /// + /// Writes an indent space. + /// + protected virtual void WriteIndentSpace() + { + } + + internal void AutoComplete(JsonToken tokenBeingWritten) + { + // gets new state based on the current state and what is being written + State newState = StateArray[(int)tokenBeingWritten][(int)_currentState]; + + if (newState == State.Error) + { + throw JsonWriterException.Create(this, "Token {0} in state {1} would result in an invalid JSON object.".FormatWith(CultureInfo.InvariantCulture, tokenBeingWritten.ToString(), _currentState.ToString()), null); + } + + if ((_currentState == State.Object || _currentState == State.Array || _currentState == State.Constructor) && tokenBeingWritten != JsonToken.Comment) + { + WriteValueDelimiter(); + } + + if (_formatting == Formatting.Indented) + { + if (_currentState == State.Property) + { + WriteIndentSpace(); + } + + // don't indent a property when it is the first token to be written (i.e. at the start) + if ((_currentState == State.Array || _currentState == State.ArrayStart || _currentState == State.Constructor || _currentState == State.ConstructorStart) + || (tokenBeingWritten == JsonToken.PropertyName && _currentState != State.Start)) + { + WriteIndent(); + } + } + + _currentState = newState; + } + + #region WriteValue methods + /// + /// Writes a null value. + /// + public virtual void WriteNull() + { + InternalWriteValue(JsonToken.Null); + } + + /// + /// Writes an undefined value. + /// + public virtual void WriteUndefined() + { + InternalWriteValue(JsonToken.Undefined); + } + + /// + /// Writes raw JSON without changing the writer's state. + /// + /// The raw JSON to write. + public virtual void WriteRaw(string json) + { + InternalWriteRaw(); + } + + /// + /// Writes raw JSON where a value is expected and updates the writer's state. + /// + /// The raw JSON to write. + public virtual void WriteRawValue(string json) + { + // hack. want writer to change state as if a value had been written + UpdateScopeWithFinishedValue(); + AutoComplete(JsonToken.Undefined); + WriteRaw(json); + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(string value) + { + InternalWriteValue(JsonToken.String); + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(int value) + { + InternalWriteValue(JsonToken.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public virtual void WriteValue(uint value) + { + InternalWriteValue(JsonToken.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(long value) + { + InternalWriteValue(JsonToken.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public virtual void WriteValue(ulong value) + { + InternalWriteValue(JsonToken.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(float value) + { + InternalWriteValue(JsonToken.Float); + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(double value) + { + InternalWriteValue(JsonToken.Float); + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(bool value) + { + InternalWriteValue(JsonToken.Boolean); + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(short value) + { + InternalWriteValue(JsonToken.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public virtual void WriteValue(ushort value) + { + InternalWriteValue(JsonToken.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(char value) + { + InternalWriteValue(JsonToken.String); + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(byte value) + { + InternalWriteValue(JsonToken.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public virtual void WriteValue(sbyte value) + { + InternalWriteValue(JsonToken.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(decimal value) + { + InternalWriteValue(JsonToken.Float); + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(DateTime value) + { + InternalWriteValue(JsonToken.Date); + } + +#if !NET20 + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(DateTimeOffset value) + { + InternalWriteValue(JsonToken.Date); + } +#endif + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(Guid value) + { + InternalWriteValue(JsonToken.String); + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(TimeSpan value) + { + InternalWriteValue(JsonToken.String); + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(int? value) + { + if (value == null) + { + WriteNull(); + } + else + { + WriteValue(value.GetValueOrDefault()); + } + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public virtual void WriteValue(uint? value) + { + if (value == null) + { + WriteNull(); + } + else + { + WriteValue(value.GetValueOrDefault()); + } + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(long? value) + { + if (value == null) + { + WriteNull(); + } + else + { + WriteValue(value.GetValueOrDefault()); + } + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public virtual void WriteValue(ulong? value) + { + if (value == null) + { + WriteNull(); + } + else + { + WriteValue(value.GetValueOrDefault()); + } + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(float? value) + { + if (value == null) + { + WriteNull(); + } + else + { + WriteValue(value.GetValueOrDefault()); + } + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(double? value) + { + if (value == null) + { + WriteNull(); + } + else + { + WriteValue(value.GetValueOrDefault()); + } + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(bool? value) + { + if (value == null) + { + WriteNull(); + } + else + { + WriteValue(value.GetValueOrDefault()); + } + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(short? value) + { + if (value == null) + { + WriteNull(); + } + else + { + WriteValue(value.GetValueOrDefault()); + } + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public virtual void WriteValue(ushort? value) + { + if (value == null) + { + WriteNull(); + } + else + { + WriteValue(value.GetValueOrDefault()); + } + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(char? value) + { + if (value == null) + { + WriteNull(); + } + else + { + WriteValue(value.GetValueOrDefault()); + } + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(byte? value) + { + if (value == null) + { + WriteNull(); + } + else + { + WriteValue(value.GetValueOrDefault()); + } + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public virtual void WriteValue(sbyte? value) + { + if (value == null) + { + WriteNull(); + } + else + { + WriteValue(value.GetValueOrDefault()); + } + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(decimal? value) + { + if (value == null) + { + WriteNull(); + } + else + { + WriteValue(value.GetValueOrDefault()); + } + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(DateTime? value) + { + if (value == null) + { + WriteNull(); + } + else + { + WriteValue(value.GetValueOrDefault()); + } + } + +#if !NET20 + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(DateTimeOffset? value) + { + if (value == null) + { + WriteNull(); + } + else + { + WriteValue(value.GetValueOrDefault()); + } + } +#endif + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(Guid? value) + { + if (value == null) + { + WriteNull(); + } + else + { + WriteValue(value.GetValueOrDefault()); + } + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(TimeSpan? value) + { + if (value == null) + { + WriteNull(); + } + else + { + WriteValue(value.GetValueOrDefault()); + } + } + + /// + /// Writes a [] value. + /// + /// The [] value to write. + public virtual void WriteValue(byte[] value) + { + if (value == null) + { + WriteNull(); + } + else + { + InternalWriteValue(JsonToken.Bytes); + } + } + + /// + /// Writes a value. + /// + /// The value to write. + public virtual void WriteValue(Uri value) + { + if (value == null) + { + WriteNull(); + } + else + { + InternalWriteValue(JsonToken.String); + } + } + + /// + /// Writes a value. + /// An error will raised if the value cannot be written as a single JSON token. + /// + /// The value to write. + public virtual void WriteValue(object value) + { + if (value == null) + { + WriteNull(); + } + else + { +#if !(NET20 || NET35 || PORTABLE || PORTABLE40) + // this is here because adding a WriteValue(BigInteger) to JsonWriter will + // mean the user has to add a reference to System.Numerics.dll + if (value is BigInteger) + { + throw CreateUnsupportedTypeException(this, value); + } +#endif + + WriteValue(this, ConvertUtils.GetTypeCode(value.GetType()), value); + } + } + #endregion + + /// + /// Writes out a comment /*...*/ containing the specified text. + /// + /// Text to place inside the comment. + public virtual void WriteComment(string text) + { + InternalWriteComment(); + } + + /// + /// Writes out the given white space. + /// + /// The string of white space characters. + public virtual void WriteWhitespace(string ws) + { + InternalWriteWhitespace(ws); + } + + void IDisposable.Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Releases unmanaged and - optionally - managed resources + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (_currentState != State.Closed && disposing) + { + Close(); + } + } + + internal static void WriteValue(JsonWriter writer, PrimitiveTypeCode typeCode, object value) + { + switch (typeCode) + { + case PrimitiveTypeCode.Char: + writer.WriteValue((char)value); + break; + case PrimitiveTypeCode.CharNullable: + writer.WriteValue((value == null) ? (char?)null : (char)value); + break; + case PrimitiveTypeCode.Boolean: + writer.WriteValue((bool)value); + break; + case PrimitiveTypeCode.BooleanNullable: + writer.WriteValue((value == null) ? (bool?)null : (bool)value); + break; + case PrimitiveTypeCode.SByte: + writer.WriteValue((sbyte)value); + break; + case PrimitiveTypeCode.SByteNullable: + writer.WriteValue((value == null) ? (sbyte?)null : (sbyte)value); + break; + case PrimitiveTypeCode.Int16: + writer.WriteValue((short)value); + break; + case PrimitiveTypeCode.Int16Nullable: + writer.WriteValue((value == null) ? (short?)null : (short)value); + break; + case PrimitiveTypeCode.UInt16: + writer.WriteValue((ushort)value); + break; + case PrimitiveTypeCode.UInt16Nullable: + writer.WriteValue((value == null) ? (ushort?)null : (ushort)value); + break; + case PrimitiveTypeCode.Int32: + writer.WriteValue((int)value); + break; + case PrimitiveTypeCode.Int32Nullable: + writer.WriteValue((value == null) ? (int?)null : (int)value); + break; + case PrimitiveTypeCode.Byte: + writer.WriteValue((byte)value); + break; + case PrimitiveTypeCode.ByteNullable: + writer.WriteValue((value == null) ? (byte?)null : (byte)value); + break; + case PrimitiveTypeCode.UInt32: + writer.WriteValue((uint)value); + break; + case PrimitiveTypeCode.UInt32Nullable: + writer.WriteValue((value == null) ? (uint?)null : (uint)value); + break; + case PrimitiveTypeCode.Int64: + writer.WriteValue((long)value); + break; + case PrimitiveTypeCode.Int64Nullable: + writer.WriteValue((value == null) ? (long?)null : (long)value); + break; + case PrimitiveTypeCode.UInt64: + writer.WriteValue((ulong)value); + break; + case PrimitiveTypeCode.UInt64Nullable: + writer.WriteValue((value == null) ? (ulong?)null : (ulong)value); + break; + case PrimitiveTypeCode.Single: + writer.WriteValue((float)value); + break; + case PrimitiveTypeCode.SingleNullable: + writer.WriteValue((value == null) ? (float?)null : (float)value); + break; + case PrimitiveTypeCode.Double: + writer.WriteValue((double)value); + break; + case PrimitiveTypeCode.DoubleNullable: + writer.WriteValue((value == null) ? (double?)null : (double)value); + break; + case PrimitiveTypeCode.DateTime: + writer.WriteValue((DateTime)value); + break; + case PrimitiveTypeCode.DateTimeNullable: + writer.WriteValue((value == null) ? (DateTime?)null : (DateTime)value); + break; +#if !NET20 + case PrimitiveTypeCode.DateTimeOffset: + writer.WriteValue((DateTimeOffset)value); + break; + case PrimitiveTypeCode.DateTimeOffsetNullable: + writer.WriteValue((value == null) ? (DateTimeOffset?)null : (DateTimeOffset)value); + break; +#endif + case PrimitiveTypeCode.Decimal: + writer.WriteValue((decimal)value); + break; + case PrimitiveTypeCode.DecimalNullable: + writer.WriteValue((value == null) ? (decimal?)null : (decimal)value); + break; + case PrimitiveTypeCode.Guid: + writer.WriteValue((Guid)value); + break; + case PrimitiveTypeCode.GuidNullable: + writer.WriteValue((value == null) ? (Guid?)null : (Guid)value); + break; + case PrimitiveTypeCode.TimeSpan: + writer.WriteValue((TimeSpan)value); + break; + case PrimitiveTypeCode.TimeSpanNullable: + writer.WriteValue((value == null) ? (TimeSpan?)null : (TimeSpan)value); + break; +#if !(PORTABLE || PORTABLE40 || NET35 || NET20) + case PrimitiveTypeCode.BigInteger: + // this will call to WriteValue(object) + writer.WriteValue((BigInteger)value); + break; + case PrimitiveTypeCode.BigIntegerNullable: + // this will call to WriteValue(object) + writer.WriteValue((value == null) ? (BigInteger?)null : (BigInteger)value); + break; +#endif + case PrimitiveTypeCode.Uri: + writer.WriteValue((Uri)value); + break; + case PrimitiveTypeCode.String: + writer.WriteValue((string)value); + break; + case PrimitiveTypeCode.Bytes: + writer.WriteValue((byte[])value); + break; +#if !(PORTABLE || DOTNET) + case PrimitiveTypeCode.DBNull: + writer.WriteNull(); + break; +#endif + default: +#if !PORTABLE + if (value is IConvertible) + { + // the value is a non-standard IConvertible + // convert to the underlying value and retry + IConvertible convertable = (IConvertible)value; + + TypeInformation typeInformation = ConvertUtils.GetTypeInformation(convertable); + + // if convertable has an underlying typecode of Object then attempt to convert it to a string + PrimitiveTypeCode resolvedTypeCode = (typeInformation.TypeCode == PrimitiveTypeCode.Object) ? PrimitiveTypeCode.String : typeInformation.TypeCode; + Type resolvedType = (typeInformation.TypeCode == PrimitiveTypeCode.Object) ? typeof(string) : typeInformation.Type; + + object convertedValue = convertable.ToType(resolvedType, CultureInfo.InvariantCulture); + + WriteValue(writer, resolvedTypeCode, convertedValue); + break; + } + else +#endif + { + throw CreateUnsupportedTypeException(writer, value); + } + } + } + + private static JsonWriterException CreateUnsupportedTypeException(JsonWriter writer, object value) + { + return JsonWriterException.Create(writer, "Unsupported type: {0}. Use the JsonSerializer class to get the object's JSON representation.".FormatWith(CultureInfo.InvariantCulture, value.GetType()), null); + } + + /// + /// Sets the state of the JsonWriter, + /// + /// The JsonToken being written. + /// The value being written. + protected void SetWriteState(JsonToken token, object value) + { + switch (token) + { + case JsonToken.StartObject: + InternalWriteStart(token, JsonContainerType.Object); + break; + case JsonToken.StartArray: + InternalWriteStart(token, JsonContainerType.Array); + break; + case JsonToken.StartConstructor: + InternalWriteStart(token, JsonContainerType.Constructor); + break; + case JsonToken.PropertyName: + if (!(value is string)) + { + throw new ArgumentException("A name is required when setting property name state.", nameof(value)); + } + + InternalWritePropertyName((string)value); + break; + case JsonToken.Comment: + InternalWriteComment(); + break; + case JsonToken.Raw: + InternalWriteRaw(); + break; + case JsonToken.Integer: + case JsonToken.Float: + case JsonToken.String: + case JsonToken.Boolean: + case JsonToken.Date: + case JsonToken.Bytes: + case JsonToken.Null: + case JsonToken.Undefined: + InternalWriteValue(token); + break; + case JsonToken.EndObject: + InternalWriteEnd(JsonContainerType.Object); + break; + case JsonToken.EndArray: + InternalWriteEnd(JsonContainerType.Array); + break; + case JsonToken.EndConstructor: + InternalWriteEnd(JsonContainerType.Constructor); + break; + default: + throw new ArgumentOutOfRangeException(nameof(token)); + } + } + + internal void InternalWriteEnd(JsonContainerType container) + { + AutoCompleteClose(container); + } + + internal void InternalWritePropertyName(string name) + { + _currentPosition.PropertyName = name; + AutoComplete(JsonToken.PropertyName); + } + + internal void InternalWriteRaw() + { + } + + internal void InternalWriteStart(JsonToken token, JsonContainerType container) + { + UpdateScopeWithFinishedValue(); + AutoComplete(token); + Push(container); + } + + internal void InternalWriteValue(JsonToken token) + { + UpdateScopeWithFinishedValue(); + AutoComplete(token); + } + + internal void InternalWriteWhitespace(string ws) + { + if (ws != null) + { + if (!StringUtils.IsWhiteSpace(ws)) + { + throw JsonWriterException.Create(this, "Only white space characters should be used.", null); + } + } + } + + internal void InternalWriteComment() + { + AutoComplete(JsonToken.Comment); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/JsonWriterException.cs b/Common/00-1Json8.3/Json8.3/JsonWriterException.cs new file mode 100644 index 0000000..2bfa78d --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/JsonWriterException.cs @@ -0,0 +1,107 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Text; + +namespace Newtonsoft.Json +{ + /// + /// The exception thrown when an error occurs while reading JSON text. + /// +#if !(DOTNET || PORTABLE40 || PORTABLE) + [Serializable] +#endif + public class JsonWriterException : JsonException + { + /// + /// Gets the path to the JSON where the error occurred. + /// + /// The path to the JSON where the error occurred. + public string Path { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + public JsonWriterException() + { + } + + /// + /// Initializes a new instance of the class + /// with a specified error message. + /// + /// The error message that explains the reason for the exception. + public JsonWriterException(string message) + : base(message) + { + } + + /// + /// Initializes a new instance of the class + /// with a specified error message and a reference to the inner exception that is the cause of this exception. + /// + /// The error message that explains the reason for the exception. + /// The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + public JsonWriterException(string message, Exception innerException) + : base(message, innerException) + { + } + +#if !(DOTNET || PORTABLE40 || PORTABLE) + /// + /// Initializes a new instance of the class. + /// + /// The that holds the serialized object data about the exception being thrown. + /// The that contains contextual information about the source or destination. + /// The parameter is null. + /// The class name is null or is zero (0). + public JsonWriterException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } +#endif + + internal JsonWriterException(string message, Exception innerException, string path) + : base(message, innerException) + { + Path = path; + } + + internal static JsonWriterException Create(JsonWriter writer, string message, Exception ex) + { + return Create(writer.ContainerPath, message, ex); + } + + internal static JsonWriterException Create(string path, string message, Exception ex) + { + message = JsonPosition.FormatMessage(null, path, message); + + return new JsonWriterException(message, ex, path); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/CommentHandling.cs b/Common/00-1Json8.3/Json8.3/Linq/CommentHandling.cs new file mode 100644 index 0000000..d178df8 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/CommentHandling.cs @@ -0,0 +1,34 @@ +namespace Newtonsoft.Json.Linq +{ + /// + /// Specifies how JSON comments are handled when loading JSON. + /// + public enum CommentHandling + { + /// + /// Ignore comments. + /// + Ignore = 0, + + /// + /// Load comments as a with type . + /// + Load = 1 + } + + /// + /// Specifies how line information is handled when loading JSON. + /// + public enum LineInfoHandling + { + /// + /// Ignore line information. + /// + Ignore = 0, + + /// + /// Load line information. + /// + Load = 1 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/Extensions.cs b/Common/00-1Json8.3/Json8.3/Linq/Extensions.cs new file mode 100644 index 0000000..f9f8976 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/Extensions.cs @@ -0,0 +1,332 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using Newtonsoft.Json.Utilities; +using System.Globalization; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Linq +{ + /// + /// Contains the LINQ to JSON extension methods. + /// + public static class Extensions + { + /// + /// Returns a collection of tokens that contains the ancestors of every token in the source collection. + /// + /// The type of the objects in source, constrained to . + /// An of that contains the source collection. + /// An of that contains the ancestors of every token in the source collection. + public static IJEnumerable Ancestors(this IEnumerable source) where T : JToken + { + ValidationUtils.ArgumentNotNull(source, nameof(source)); + + return source.SelectMany(j => j.Ancestors()).AsJEnumerable(); + } + + /// + /// Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + /// + /// The type of the objects in source, constrained to . + /// An of that contains the source collection. + /// An of that contains every token in the source collection, the ancestors of every token in the source collection. + public static IJEnumerable AncestorsAndSelf(this IEnumerable source) where T : JToken + { + ValidationUtils.ArgumentNotNull(source, nameof(source)); + + return source.SelectMany(j => j.AncestorsAndSelf()).AsJEnumerable(); + } + + /// + /// Returns a collection of tokens that contains the descendants of every token in the source collection. + /// + /// The type of the objects in source, constrained to . + /// An of that contains the source collection. + /// An of that contains the descendants of every token in the source collection. + public static IJEnumerable Descendants(this IEnumerable source) where T : JContainer + { + ValidationUtils.ArgumentNotNull(source, nameof(source)); + + return source.SelectMany(j => j.Descendants()).AsJEnumerable(); + } + + /// + /// Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + /// + /// The type of the objects in source, constrained to . + /// An of that contains the source collection. + /// An of that contains every token in the source collection, and the descendants of every token in the source collection. + public static IJEnumerable DescendantsAndSelf(this IEnumerable source) where T : JContainer + { + ValidationUtils.ArgumentNotNull(source, nameof(source)); + + return source.SelectMany(j => j.DescendantsAndSelf()).AsJEnumerable(); + } + + /// + /// Returns a collection of child properties of every object in the source collection. + /// + /// An of that contains the source collection. + /// An of that contains the properties of every object in the source collection. + public static IJEnumerable Properties(this IEnumerable source) + { + ValidationUtils.ArgumentNotNull(source, nameof(source)); + + return source.SelectMany(d => d.Properties()).AsJEnumerable(); + } + + /// + /// Returns a collection of child values of every object in the source collection with the given key. + /// + /// An of that contains the source collection. + /// The token key. + /// An of that contains the values of every token in the source collection with the given key. + public static IJEnumerable Values(this IEnumerable source, object key) + { + return Values(source, key).AsJEnumerable(); + } + + /// + /// Returns a collection of child values of every object in the source collection. + /// + /// An of that contains the source collection. + /// An of that contains the values of every token in the source collection. + public static IJEnumerable Values(this IEnumerable source) + { + return source.Values(null); + } + + /// + /// Returns a collection of converted child values of every object in the source collection with the given key. + /// + /// The type to convert the values to. + /// An of that contains the source collection. + /// The token key. + /// An that contains the converted values of every token in the source collection with the given key. + public static IEnumerable Values(this IEnumerable source, object key) + { + return Values(source, key); + } + + /// + /// Returns a collection of converted child values of every object in the source collection. + /// + /// The type to convert the values to. + /// An of that contains the source collection. + /// An that contains the converted values of every token in the source collection. + public static IEnumerable Values(this IEnumerable source) + { + return Values(source, null); + } + + /// + /// Converts the value. + /// + /// The type to convert the value to. + /// A cast as a of . + /// A converted value. + public static U Value(this IEnumerable value) + { + return value.Value(); + } + + /// + /// Converts the value. + /// + /// The source collection type. + /// The type to convert the value to. + /// A cast as a of . + /// A converted value. + public static U Value(this IEnumerable value) where T : JToken + { + ValidationUtils.ArgumentNotNull(value, nameof(value)); + + JToken token = value as JToken; + if (token == null) + { + throw new ArgumentException("Source value must be a JToken."); + } + + return token.Convert(); + } + + internal static IEnumerable Values(this IEnumerable source, object key) where T : JToken + { + ValidationUtils.ArgumentNotNull(source, nameof(source)); + + foreach (JToken token in source) + { + if (key == null) + { + if (token is JValue) + { + yield return Convert((JValue)token); + } + else + { + foreach (JToken t in token.Children()) + { + yield return t.Convert(); + } + } + } + else + { + JToken value = token[key]; + if (value != null) + { + yield return value.Convert(); + } + } + } + + yield break; + } + + //TODO + //public static IEnumerable InDocumentOrder(this IEnumerable source) where T : JObject; + + /// + /// Returns a collection of child tokens of every array in the source collection. + /// + /// The source collection type. + /// An of that contains the source collection. + /// An of that contains the values of every token in the source collection. + public static IJEnumerable Children(this IEnumerable source) where T : JToken + { + return Children(source).AsJEnumerable(); + } + + /// + /// Returns a collection of converted child tokens of every array in the source collection. + /// + /// An of that contains the source collection. + /// The type to convert the values to. + /// The source collection type. + /// An that contains the converted values of every token in the source collection. + public static IEnumerable Children(this IEnumerable source) where T : JToken + { + ValidationUtils.ArgumentNotNull(source, nameof(source)); + + return source.SelectMany(c => c.Children()).Convert(); + } + + internal static IEnumerable Convert(this IEnumerable source) where T : JToken + { + ValidationUtils.ArgumentNotNull(source, nameof(source)); + + foreach (T token in source) + { + yield return Convert(token); + } + } + + internal static U Convert(this T token) where T : JToken + { + if (token == null) + { + return default(U); + } + + if (token is U + // don't want to cast JValue to its interfaces, want to get the internal value + && typeof(U) != typeof(IComparable) && typeof(U) != typeof(IFormattable)) + { + // HACK + return (U)(object)token; + } + else + { + JValue value = token as JValue; + if (value == null) + { + throw new InvalidCastException("Cannot cast {0} to {1}.".FormatWith(CultureInfo.InvariantCulture, token.GetType(), typeof(T))); + } + + if (value.Value is U) + { + return (U)value.Value; + } + + Type targetType = typeof(U); + + if (ReflectionUtils.IsNullableType(targetType)) + { + if (value.Value == null) + { + return default(U); + } + + targetType = Nullable.GetUnderlyingType(targetType); + } + + return (U)System.Convert.ChangeType(value.Value, targetType, CultureInfo.InvariantCulture); + } + } + + //TODO + //public static void Remove(this IEnumerable source) where T : JContainer; + + /// + /// Returns the input typed as . + /// + /// An of that contains the source collection. + /// The input typed as . + public static IJEnumerable AsJEnumerable(this IEnumerable source) + { + return source.AsJEnumerable(); + } + + /// + /// Returns the input typed as . + /// + /// The source collection type. + /// An of that contains the source collection. + /// The input typed as . + public static IJEnumerable AsJEnumerable(this IEnumerable source) where T : JToken + { + if (source == null) + { + return null; + } + else if (source is IJEnumerable) + { + return (IJEnumerable)source; + } + else + { + return new JEnumerable(source); + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/IJEnumerable.cs b/Common/00-1Json8.3/Json8.3/Linq/IJEnumerable.cs new file mode 100644 index 0000000..fff8c2e --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/IJEnumerable.cs @@ -0,0 +1,46 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System.Collections.Generic; + +namespace Newtonsoft.Json.Linq +{ + /// + /// Represents a collection of objects. + /// + /// The type of token + public interface IJEnumerable< +#if !(NET20 || NET35) + out +#endif + T> : IEnumerable where T : JToken + { + /// + /// Gets the with the specified key. + /// + /// + IJEnumerable this[object key] { get; } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JArray.cs b/Common/00-1Json8.3/Json8.3/Linq/JArray.cs new file mode 100644 index 0000000..5ca9a16 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JArray.cs @@ -0,0 +1,406 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using Newtonsoft.Json.Utilities; +using System.IO; +using System.Globalization; + +namespace Newtonsoft.Json.Linq +{ + /// + /// Represents a JSON array. + /// + /// + /// + /// + public class JArray : JContainer, IList + { + private readonly List _values = new List(); + + /// + /// Gets the container's children tokens. + /// + /// The container's children tokens. + protected override IList ChildrenTokens + { + get { return _values; } + } + + /// + /// Gets the node type for this . + /// + /// The type. + public override JTokenType Type + { + get { return JTokenType.Array; } + } + + /// + /// Initializes a new instance of the class. + /// + public JArray() + { + } + + /// + /// Initializes a new instance of the class from another object. + /// + /// A object to copy from. + public JArray(JArray other) + : base(other) + { + } + + /// + /// Initializes a new instance of the class with the specified content. + /// + /// The contents of the array. + public JArray(params object[] content) + : this((object)content) + { + } + + /// + /// Initializes a new instance of the class with the specified content. + /// + /// The contents of the array. + public JArray(object content) + { + Add(content); + } + + internal override bool DeepEquals(JToken node) + { + JArray t = node as JArray; + return (t != null && ContentsEqual(t)); + } + + internal override JToken CloneToken() + { + return new JArray(this); + } + + /// + /// Loads an from a . + /// + /// A that will be read for the content of the . + /// A that contains the JSON that was read from the specified . + public new static JArray Load(JsonReader reader) + { + return Load(reader, null); + } + + /// + /// Loads an from a . + /// + /// A that will be read for the content of the . + /// The used to load the JSON. + /// If this is null, default load settings will be used. + /// A that contains the JSON that was read from the specified . + public new static JArray Load(JsonReader reader, JsonLoadSettings settings) + { + if (reader.TokenType == JsonToken.None) + { + if (!reader.Read()) + { + throw JsonReaderException.Create(reader, "Error reading JArray from JsonReader."); + } + } + + reader.MoveToContent(); + + if (reader.TokenType != JsonToken.StartArray) + { + throw JsonReaderException.Create(reader, "Error reading JArray from JsonReader. Current JsonReader item is not an array: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + } + + JArray a = new JArray(); + a.SetLineInfo(reader as IJsonLineInfo, settings); + + a.ReadTokenFrom(reader, settings); + + return a; + } + + /// + /// Load a from a string that contains JSON. + /// + /// A that contains JSON. + /// A populated from the string that contains JSON. + /// + /// + /// + public new static JArray Parse(string json) + { + return Parse(json, null); + } + + /// + /// Load a from a string that contains JSON. + /// + /// A that contains JSON. + /// The used to load the JSON. + /// If this is null, default load settings will be used. + /// A populated from the string that contains JSON. + /// + /// + /// + public new static JArray Parse(string json, JsonLoadSettings settings) + { + using (JsonReader reader = new JsonTextReader(new StringReader(json))) + { + JArray a = Load(reader, settings); + + if (reader.Read() && reader.TokenType != JsonToken.Comment) + { + throw JsonReaderException.Create(reader, "Additional text found in JSON string after parsing content."); + } + + return a; + } + } + + /// + /// Creates a from an object. + /// + /// The object that will be used to create . + /// A with the values of the specified object + public new static JArray FromObject(object o) + { + return FromObject(o, JsonSerializer.CreateDefault()); + } + + /// + /// Creates a from an object. + /// + /// The object that will be used to create . + /// The that will be used to read the object. + /// A with the values of the specified object + public new static JArray FromObject(object o, JsonSerializer jsonSerializer) + { + JToken token = FromObjectInternal(o, jsonSerializer); + + if (token.Type != JTokenType.Array) + { + throw new ArgumentException("Object serialized to {0}. JArray instance expected.".FormatWith(CultureInfo.InvariantCulture, token.Type)); + } + + return (JArray)token; + } + + /// + /// Writes this token to a . + /// + /// A into which this method will write. + /// A collection of which will be used when writing the token. + public override void WriteTo(JsonWriter writer, params JsonConverter[] converters) + { + writer.WriteStartArray(); + + for (int i = 0; i < _values.Count; i++) + { + _values[i].WriteTo(writer, converters); + } + + writer.WriteEndArray(); + } + + /// + /// Gets the with the specified key. + /// + /// The with the specified key. + public override JToken this[object key] + { + get + { + ValidationUtils.ArgumentNotNull(key, nameof(key)); + + if (!(key is int)) + { + throw new ArgumentException("Accessed JArray values with invalid key value: {0}. Int32 array index expected.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.ToString(key))); + } + + return GetItem((int)key); + } + set + { + ValidationUtils.ArgumentNotNull(key, nameof(key)); + + if (!(key is int)) + { + throw new ArgumentException("Set JArray values with invalid key value: {0}. Int32 array index expected.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.ToString(key))); + } + + SetItem((int)key, value); + } + } + + /// + /// Gets or sets the at the specified index. + /// + /// + public JToken this[int index] + { + get { return GetItem(index); } + set { SetItem(index, value); } + } + + internal override void MergeItem(object content, JsonMergeSettings settings) + { + IEnumerable a = (IsMultiContent(content) || content is JArray) + ? (IEnumerable)content + : null; + if (a == null) + { + return; + } + + MergeEnumerableContent(this, a, settings); + } + + #region IList Members + /// + /// Determines the index of a specific item in the . + /// + /// The object to locate in the . + /// + /// The index of if found in the list; otherwise, -1. + /// + public int IndexOf(JToken item) + { + return IndexOfItem(item); + } + + /// + /// Inserts an item to the at the specified index. + /// + /// The zero-based index at which should be inserted. + /// The object to insert into the . + /// + /// is not a valid index in the . + /// The is read-only. + public void Insert(int index, JToken item) + { + InsertItem(index, item, false); + } + + /// + /// Removes the item at the specified index. + /// + /// The zero-based index of the item to remove. + /// + /// is not a valid index in the . + /// The is read-only. + public void RemoveAt(int index) + { + RemoveItemAt(index); + } + + /// + /// Returns an enumerator that iterates through the collection. + /// + /// + /// A that can be used to iterate through the collection. + /// + public IEnumerator GetEnumerator() + { + return Children().GetEnumerator(); + } + #endregion + + #region ICollection Members + /// + /// Adds an item to the . + /// + /// The object to add to the . + /// The is read-only. + public void Add(JToken item) + { + Add((object)item); + } + + /// + /// Removes all items from the . + /// + /// The is read-only. + public void Clear() + { + ClearItems(); + } + + /// + /// Determines whether the contains a specific value. + /// + /// The object to locate in the . + /// + /// true if is found in the ; otherwise, false. + /// + public bool Contains(JToken item) + { + return ContainsItem(item); + } + + /// + /// Copies to. + /// + /// The array. + /// Index of the array. + public void CopyTo(JToken[] array, int arrayIndex) + { + CopyItemsTo(array, arrayIndex); + } + + /// + /// Gets a value indicating whether the is read-only. + /// + /// true if the is read-only; otherwise, false. + public bool IsReadOnly + { + get { return false; } + } + + /// + /// Removes the first occurrence of a specific object from the . + /// + /// The object to remove from the . + /// + /// true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + /// + /// The is read-only. + public bool Remove(JToken item) + { + return RemoveItem(item); + } + #endregion + + internal override int GetDeepHashCode() + { + return ContentsHashCode(); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JConstructor.cs b/Common/00-1Json8.3/Json8.3/Linq/JConstructor.cs new file mode 100644 index 0000000..0a49a93 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JConstructor.cs @@ -0,0 +1,247 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using Newtonsoft.Json.Utilities; +using System.Globalization; + +namespace Newtonsoft.Json.Linq +{ + /// + /// Represents a JSON constructor. + /// + public class JConstructor : JContainer + { + private string _name; + private readonly List _values = new List(); + + /// + /// Gets the container's children tokens. + /// + /// The container's children tokens. + protected override IList ChildrenTokens + { + get { return _values; } + } + + internal override void MergeItem(object content, JsonMergeSettings settings) + { + JConstructor c = content as JConstructor; + if (c == null) + { + return; + } + + if (c.Name != null) + { + Name = c.Name; + } + MergeEnumerableContent(this, c, settings); + } + + /// + /// Gets or sets the name of this constructor. + /// + /// The constructor name. + public string Name + { + get { return _name; } + set { _name = value; } + } + + /// + /// Gets the node type for this . + /// + /// The type. + public override JTokenType Type + { + get { return JTokenType.Constructor; } + } + + /// + /// Initializes a new instance of the class. + /// + public JConstructor() + { + } + + /// + /// Initializes a new instance of the class from another object. + /// + /// A object to copy from. + public JConstructor(JConstructor other) + : base(other) + { + _name = other.Name; + } + + /// + /// Initializes a new instance of the class with the specified name and content. + /// + /// The constructor name. + /// The contents of the constructor. + public JConstructor(string name, params object[] content) + : this(name, (object)content) + { + } + + /// + /// Initializes a new instance of the class with the specified name and content. + /// + /// The constructor name. + /// The contents of the constructor. + public JConstructor(string name, object content) + : this(name) + { + Add(content); + } + + /// + /// Initializes a new instance of the class with the specified name. + /// + /// The constructor name. + public JConstructor(string name) + { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (name.Length == 0) + { + throw new ArgumentException("Constructor name cannot be empty.", nameof(name)); + } + + _name = name; + } + + internal override bool DeepEquals(JToken node) + { + JConstructor c = node as JConstructor; + return (c != null && _name == c.Name && ContentsEqual(c)); + } + + internal override JToken CloneToken() + { + return new JConstructor(this); + } + + /// + /// Writes this token to a . + /// + /// A into which this method will write. + /// A collection of which will be used when writing the token. + public override void WriteTo(JsonWriter writer, params JsonConverter[] converters) + { + writer.WriteStartConstructor(_name); + + foreach (JToken token in Children()) + { + token.WriteTo(writer, converters); + } + + writer.WriteEndConstructor(); + } + + /// + /// Gets the with the specified key. + /// + /// The with the specified key. + public override JToken this[object key] + { + get + { + ValidationUtils.ArgumentNotNull(key, nameof(key)); + + if (!(key is int)) + { + throw new ArgumentException("Accessed JConstructor values with invalid key value: {0}. Argument position index expected.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.ToString(key))); + } + + return GetItem((int)key); + } + set + { + ValidationUtils.ArgumentNotNull(key, nameof(key)); + + if (!(key is int)) + { + throw new ArgumentException("Set JConstructor values with invalid key value: {0}. Argument position index expected.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.ToString(key))); + } + + SetItem((int)key, value); + } + } + + internal override int GetDeepHashCode() + { + return _name.GetHashCode() ^ ContentsHashCode(); + } + + /// + /// Loads an from a . + /// + /// A that will be read for the content of the . + /// A that contains the JSON that was read from the specified . + public new static JConstructor Load(JsonReader reader) + { + return Load(reader, null); + } + + /// + /// Loads an from a . + /// + /// A that will be read for the content of the . + /// The used to load the JSON. + /// If this is null, default load settings will be used. + /// A that contains the JSON that was read from the specified . + public new static JConstructor Load(JsonReader reader, JsonLoadSettings settings) + { + if (reader.TokenType == JsonToken.None) + { + if (!reader.Read()) + { + throw JsonReaderException.Create(reader, "Error reading JConstructor from JsonReader."); + } + } + + reader.MoveToContent(); + + if (reader.TokenType != JsonToken.StartConstructor) + { + throw JsonReaderException.Create(reader, "Error reading JConstructor from JsonReader. Current JsonReader item is not a constructor: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + } + + JConstructor c = new JConstructor((string)reader.Value); + c.SetLineInfo(reader as IJsonLineInfo, settings); + + c.ReadTokenFrom(reader, settings); + + return c; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JContainer.cs b/Common/00-1Json8.3/Json8.3/Linq/JContainer.cs new file mode 100644 index 0000000..6e90201 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JContainer.cs @@ -0,0 +1,1256 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +#if !PORTABLE40 +using System.Collections.Specialized; +#endif +using System.Threading; +using Newtonsoft.Json.Utilities; +using System.Collections; +using System.Globalization; +using System.ComponentModel; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Linq +{ + /// + /// Represents a token that can contain other tokens. + /// + public abstract class JContainer : JToken, IList +#if !(DOTNET || PORTABLE || PORTABLE40) + , ITypedList, IBindingList +#endif + , IList +#if !(NET20 || NET35 || PORTABLE40) + , INotifyCollectionChanged +#endif + { +#if !(DOTNET || PORTABLE40 || PORTABLE) + internal ListChangedEventHandler _listChanged; + internal AddingNewEventHandler _addingNew; + + /// + /// Occurs when the list changes or an item in the list changes. + /// + public event ListChangedEventHandler ListChanged + { + add { _listChanged += value; } + remove { _listChanged -= value; } + } + + /// + /// Occurs before an item is added to the collection. + /// + public event AddingNewEventHandler AddingNew + { + add { _addingNew += value; } + remove { _addingNew -= value; } + } +#endif +#if !(NET20 || NET35 || PORTABLE40) + internal NotifyCollectionChangedEventHandler _collectionChanged; + + /// + /// Occurs when the items list of the collection has changed, or the collection is reset. + /// + public event NotifyCollectionChangedEventHandler CollectionChanged + { + add { _collectionChanged += value; } + remove { _collectionChanged -= value; } + } +#endif + + /// + /// Gets the container's children tokens. + /// + /// The container's children tokens. + protected abstract IList ChildrenTokens { get; } + + private object _syncRoot; +#if !(PORTABLE40) + private bool _busy; +#endif + + internal JContainer() + { + } + + internal JContainer(JContainer other) + : this() + { + ValidationUtils.ArgumentNotNull(other, nameof(other)); + + int i = 0; + foreach (JToken child in other) + { + AddInternal(i, child, false); + i++; + } + } + + internal void CheckReentrancy() + { +#if !(PORTABLE40) + if (_busy) + { + throw new InvalidOperationException("Cannot change {0} during a collection change event.".FormatWith(CultureInfo.InvariantCulture, GetType())); + } +#endif + } + + internal virtual IList CreateChildrenCollection() + { + return new List(); + } + +#if !(DOTNET || PORTABLE40 || PORTABLE) + /// + /// Raises the event. + /// + /// The instance containing the event data. + protected virtual void OnAddingNew(AddingNewEventArgs e) + { + AddingNewEventHandler handler = _addingNew; + if (handler != null) + { + handler(this, e); + } + } + + /// + /// Raises the event. + /// + /// The instance containing the event data. + protected virtual void OnListChanged(ListChangedEventArgs e) + { + ListChangedEventHandler handler = _listChanged; + + if (handler != null) + { + _busy = true; + try + { + handler(this, e); + } + finally + { + _busy = false; + } + } + } +#endif +#if !(NET20 || NET35 || PORTABLE40) + /// + /// Raises the event. + /// + /// The instance containing the event data. + protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs e) + { + NotifyCollectionChangedEventHandler handler = _collectionChanged; + + if (handler != null) + { + _busy = true; + try + { + handler(this, e); + } + finally + { + _busy = false; + } + } + } +#endif + + /// + /// Gets a value indicating whether this token has child tokens. + /// + /// + /// true if this token has child values; otherwise, false. + /// + public override bool HasValues + { + get { return ChildrenTokens.Count > 0; } + } + + internal bool ContentsEqual(JContainer container) + { + if (container == this) + { + return true; + } + + IList t1 = ChildrenTokens; + IList t2 = container.ChildrenTokens; + + if (t1.Count != t2.Count) + { + return false; + } + + for (int i = 0; i < t1.Count; i++) + { + if (!t1[i].DeepEquals(t2[i])) + { + return false; + } + } + + return true; + } + + /// + /// Get the first child token of this token. + /// + /// + /// A containing the first child token of the . + /// + public override JToken First + { + get + { + IList children = ChildrenTokens; + return (children.Count > 0) ? children[0] : null; + } + } + + /// + /// Get the last child token of this token. + /// + /// + /// A containing the last child token of the . + /// + public override JToken Last + { + get + { + IList children = ChildrenTokens; + int count = children.Count; + return (count > 0) ? children[count - 1] : null; + } + } + + /// + /// Returns a collection of the child tokens of this token, in document order. + /// + /// + /// An of containing the child tokens of this , in document order. + /// + public override JEnumerable Children() + { + return new JEnumerable(ChildrenTokens); + } + + /// + /// Returns a collection of the child values of this token, in document order. + /// + /// The type to convert the values to. + /// + /// A containing the child values of this , in document order. + /// + public override IEnumerable Values() + { + return ChildrenTokens.Convert(); + } + + /// + /// Returns a collection of the descendant tokens for this token in document order. + /// + /// An containing the descendant tokens of the . + public IEnumerable Descendants() + { + return GetDescendants(false); + } + + /// + /// Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + /// + /// An containing this token, and all the descendant tokens of the . + public IEnumerable DescendantsAndSelf() + { + return GetDescendants(true); + } + + internal IEnumerable GetDescendants(bool self) + { + if (self) + { + yield return this; + } + + foreach (JToken o in ChildrenTokens) + { + yield return o; + JContainer c = o as JContainer; + if (c != null) + { + foreach (JToken d in c.Descendants()) + { + yield return d; + } + } + } + } + + internal bool IsMultiContent(object content) + { + return (content is IEnumerable && !(content is string) && !(content is JToken) && !(content is byte[])); + } + + internal JToken EnsureParentToken(JToken item, bool skipParentCheck) + { + if (item == null) + { + return JValue.CreateNull(); + } + + if (skipParentCheck) + { + return item; + } + + // to avoid a token having multiple parents or creating a recursive loop, create a copy if... + // the item already has a parent + // the item is being added to itself + // the item is being added to the root parent of itself + if (item.Parent != null || item == this || (item.HasValues && Root == item)) + { + item = item.CloneToken(); + } + + return item; + } + + private class JTokenReferenceEqualityComparer : IEqualityComparer + { + public static readonly JTokenReferenceEqualityComparer Instance = new JTokenReferenceEqualityComparer(); + + public bool Equals(JToken x, JToken y) + { + return ReferenceEquals(x, y); + } + + public int GetHashCode(JToken obj) + { + if (obj == null) + { + return 0; + } + + return obj.GetHashCode(); + } + } + + internal int IndexOfItem(JToken item) + { + return ChildrenTokens.IndexOf(item, JTokenReferenceEqualityComparer.Instance); + } + + internal virtual void InsertItem(int index, JToken item, bool skipParentCheck) + { + IList children = ChildrenTokens; + + if (index > children.Count) + { + throw new ArgumentOutOfRangeException(nameof(index), "Index must be within the bounds of the List."); + } + + CheckReentrancy(); + + item = EnsureParentToken(item, skipParentCheck); + + JToken previous = (index == 0) ? null : children[index - 1]; + // haven't inserted new token yet so next token is still at the inserting index + JToken next = (index == children.Count) ? null : children[index]; + + ValidateToken(item, null); + + item.Parent = this; + + item.Previous = previous; + if (previous != null) + { + previous.Next = item; + } + + item.Next = next; + if (next != null) + { + next.Previous = item; + } + + children.Insert(index, item); + +#if !(DOTNET || PORTABLE40 || PORTABLE) + if (_listChanged != null) + { + OnListChanged(new ListChangedEventArgs(ListChangedType.ItemAdded, index)); + } +#endif +#if !(NET20 || NET35 || PORTABLE40) + if (_collectionChanged != null) + { + OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, index)); + } +#endif + } + + internal virtual void RemoveItemAt(int index) + { + IList children = ChildrenTokens; + + if (index < 0) + { + throw new ArgumentOutOfRangeException(nameof(index), "Index is less than 0."); + } + if (index >= children.Count) + { + throw new ArgumentOutOfRangeException(nameof(index), "Index is equal to or greater than Count."); + } + + CheckReentrancy(); + + JToken item = children[index]; + JToken previous = (index == 0) ? null : children[index - 1]; + JToken next = (index == children.Count - 1) ? null : children[index + 1]; + + if (previous != null) + { + previous.Next = next; + } + if (next != null) + { + next.Previous = previous; + } + + item.Parent = null; + item.Previous = null; + item.Next = null; + + children.RemoveAt(index); + +#if !(DOTNET || PORTABLE40 || PORTABLE) + if (_listChanged != null) + { + OnListChanged(new ListChangedEventArgs(ListChangedType.ItemDeleted, index)); + } +#endif +#if !(NET20 || NET35 || PORTABLE40) + if (_collectionChanged != null) + { + OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item, index)); + } +#endif + } + + internal virtual bool RemoveItem(JToken item) + { + int index = IndexOfItem(item); + if (index >= 0) + { + RemoveItemAt(index); + return true; + } + + return false; + } + + internal virtual JToken GetItem(int index) + { + return ChildrenTokens[index]; + } + + internal virtual void SetItem(int index, JToken item) + { + IList children = ChildrenTokens; + + if (index < 0) + { + throw new ArgumentOutOfRangeException(nameof(index), "Index is less than 0."); + } + if (index >= children.Count) + { + throw new ArgumentOutOfRangeException(nameof(index), "Index is equal to or greater than Count."); + } + + JToken existing = children[index]; + + if (IsTokenUnchanged(existing, item)) + { + return; + } + + CheckReentrancy(); + + item = EnsureParentToken(item, false); + + ValidateToken(item, existing); + + JToken previous = (index == 0) ? null : children[index - 1]; + JToken next = (index == children.Count - 1) ? null : children[index + 1]; + + item.Parent = this; + + item.Previous = previous; + if (previous != null) + { + previous.Next = item; + } + + item.Next = next; + if (next != null) + { + next.Previous = item; + } + + children[index] = item; + + existing.Parent = null; + existing.Previous = null; + existing.Next = null; + +#if !(DOTNET || PORTABLE || PORTABLE40) + if (_listChanged != null) + { + OnListChanged(new ListChangedEventArgs(ListChangedType.ItemChanged, index)); + } +#endif +#if !(NET20 || NET35 || PORTABLE40) + if (_collectionChanged != null) + { + OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, item, existing, index)); + } +#endif + } + + internal virtual void ClearItems() + { + CheckReentrancy(); + + IList children = ChildrenTokens; + + foreach (JToken item in children) + { + item.Parent = null; + item.Previous = null; + item.Next = null; + } + + children.Clear(); + +#if !(DOTNET || PORTABLE40 || PORTABLE) + if (_listChanged != null) + { + OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1)); + } +#endif +#if !(NET20 || NET35 || PORTABLE40) + if (_collectionChanged != null) + { + OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); + } +#endif + } + + internal virtual void ReplaceItem(JToken existing, JToken replacement) + { + if (existing == null || existing.Parent != this) + { + return; + } + + int index = IndexOfItem(existing); + SetItem(index, replacement); + } + + internal virtual bool ContainsItem(JToken item) + { + return (IndexOfItem(item) != -1); + } + + internal virtual void CopyItemsTo(Array array, int arrayIndex) + { + if (array == null) + { + throw new ArgumentNullException(nameof(array)); + } + if (arrayIndex < 0) + { + throw new ArgumentOutOfRangeException(nameof(arrayIndex), "arrayIndex is less than 0."); + } + if (arrayIndex >= array.Length && arrayIndex != 0) + { + throw new ArgumentException("arrayIndex is equal to or greater than the length of array."); + } + if (Count > array.Length - arrayIndex) + { + throw new ArgumentException("The number of elements in the source JObject is greater than the available space from arrayIndex to the end of the destination array."); + } + + int index = 0; + foreach (JToken token in ChildrenTokens) + { + array.SetValue(token, arrayIndex + index); + index++; + } + } + + internal static bool IsTokenUnchanged(JToken currentValue, JToken newValue) + { + JValue v1 = currentValue as JValue; + if (v1 != null) + { + // null will get turned into a JValue of type null + if (v1.Type == JTokenType.Null && newValue == null) + { + return true; + } + + return v1.Equals(newValue); + } + + return false; + } + + internal virtual void ValidateToken(JToken o, JToken existing) + { + ValidationUtils.ArgumentNotNull(o, nameof(o)); + + if (o.Type == JTokenType.Property) + { + throw new ArgumentException("Can not add {0} to {1}.".FormatWith(CultureInfo.InvariantCulture, o.GetType(), GetType())); + } + } + + /// + /// Adds the specified content as children of this . + /// + /// The content to be added. + public virtual void Add(object content) + { + AddInternal(ChildrenTokens.Count, content, false); + } + + internal void AddAndSkipParentCheck(JToken token) + { + AddInternal(ChildrenTokens.Count, token, true); + } + + /// + /// Adds the specified content as the first children of this . + /// + /// The content to be added. + public void AddFirst(object content) + { + AddInternal(0, content, false); + } + + internal void AddInternal(int index, object content, bool skipParentCheck) + { + if (IsMultiContent(content)) + { + IEnumerable enumerable = (IEnumerable)content; + + int multiIndex = index; + foreach (object c in enumerable) + { + AddInternal(multiIndex, c, skipParentCheck); + multiIndex++; + } + } + else + { + JToken item = CreateFromContent(content); + + InsertItem(index, item, skipParentCheck); + } + } + + internal static JToken CreateFromContent(object content) + { + if (content is JToken) + { + return (JToken)content; + } + + return new JValue(content); + } + + /// + /// Creates an that can be used to add tokens to the . + /// + /// An that is ready to have content written to it. + public JsonWriter CreateWriter() + { + return new JTokenWriter(this); + } + + /// + /// Replaces the children nodes of this token with the specified content. + /// + /// The content. + public void ReplaceAll(object content) + { + ClearItems(); + Add(content); + } + + /// + /// Removes the child nodes from this token. + /// + public void RemoveAll() + { + ClearItems(); + } + + internal abstract void MergeItem(object content, JsonMergeSettings settings); + + /// + /// Merge the specified content into this . + /// + /// The content to be merged. + public void Merge(object content) + { + MergeItem(content, new JsonMergeSettings()); + } + + /// + /// Merge the specified content into this using . + /// + /// The content to be merged. + /// The used to merge the content. + public void Merge(object content, JsonMergeSettings settings) + { + MergeItem(content, settings); + } + + internal void ReadTokenFrom(JsonReader reader, JsonLoadSettings options) + { + int startDepth = reader.Depth; + + if (!reader.Read()) + { + throw JsonReaderException.Create(reader, "Error reading {0} from JsonReader.".FormatWith(CultureInfo.InvariantCulture, GetType().Name)); + } + + ReadContentFrom(reader, options); + + int endDepth = reader.Depth; + + if (endDepth > startDepth) + { + throw JsonReaderException.Create(reader, "Unexpected end of content while loading {0}.".FormatWith(CultureInfo.InvariantCulture, GetType().Name)); + } + } + + internal void ReadContentFrom(JsonReader r, JsonLoadSettings settings) + { + ValidationUtils.ArgumentNotNull(r, nameof(r)); + IJsonLineInfo lineInfo = r as IJsonLineInfo; + + JContainer parent = this; + + do + { + if (parent is JProperty && ((JProperty)parent).Value != null) + { + if (parent == this) + { + return; + } + + parent = parent.Parent; + } + + switch (r.TokenType) + { + case JsonToken.None: + // new reader. move to actual content + break; + case JsonToken.StartArray: + JArray a = new JArray(); + a.SetLineInfo(lineInfo, settings); + parent.Add(a); + parent = a; + break; + + case JsonToken.EndArray: + if (parent == this) + { + return; + } + + parent = parent.Parent; + break; + case JsonToken.StartObject: + JObject o = new JObject(); + o.SetLineInfo(lineInfo, settings); + parent.Add(o); + parent = o; + break; + case JsonToken.EndObject: + if (parent == this) + { + return; + } + + parent = parent.Parent; + break; + case JsonToken.StartConstructor: + JConstructor constructor = new JConstructor(r.Value.ToString()); + constructor.SetLineInfo(lineInfo, settings); + parent.Add(constructor); + parent = constructor; + break; + case JsonToken.EndConstructor: + if (parent == this) + { + return; + } + + parent = parent.Parent; + break; + case JsonToken.String: + case JsonToken.Integer: + case JsonToken.Float: + case JsonToken.Date: + case JsonToken.Boolean: + case JsonToken.Bytes: + JValue v = new JValue(r.Value); + v.SetLineInfo(lineInfo, settings); + parent.Add(v); + break; + case JsonToken.Comment: + if (settings != null && settings.CommentHandling == CommentHandling.Load) + { + v = JValue.CreateComment(r.Value.ToString()); + v.SetLineInfo(lineInfo, settings); + parent.Add(v); + } + break; + case JsonToken.Null: + v = JValue.CreateNull(); + v.SetLineInfo(lineInfo, settings); + parent.Add(v); + break; + case JsonToken.Undefined: + v = JValue.CreateUndefined(); + v.SetLineInfo(lineInfo, settings); + parent.Add(v); + break; + case JsonToken.PropertyName: + string propertyName = r.Value.ToString(); + JProperty property = new JProperty(propertyName); + property.SetLineInfo(lineInfo, settings); + JObject parentObject = (JObject)parent; + // handle multiple properties with the same name in JSON + JProperty existingPropertyWithName = parentObject.Property(propertyName); + if (existingPropertyWithName == null) + { + parent.Add(property); + } + else + { + existingPropertyWithName.Replace(property); + } + parent = property; + break; + default: + throw new InvalidOperationException("The JsonReader should not be on a token of type {0}.".FormatWith(CultureInfo.InvariantCulture, r.TokenType)); + } + } while (r.Read()); + } + + internal int ContentsHashCode() + { + int hashCode = 0; + foreach (JToken item in ChildrenTokens) + { + hashCode ^= item.GetDeepHashCode(); + } + return hashCode; + } + +#if !(DOTNET || PORTABLE40 || PORTABLE) + string ITypedList.GetListName(PropertyDescriptor[] listAccessors) + { + return string.Empty; + } + + PropertyDescriptorCollection ITypedList.GetItemProperties(PropertyDescriptor[] listAccessors) + { + ICustomTypeDescriptor d = First as ICustomTypeDescriptor; + if (d != null) + { + return d.GetProperties(); + } + + return null; + } +#endif + + #region IList Members + int IList.IndexOf(JToken item) + { + return IndexOfItem(item); + } + + void IList.Insert(int index, JToken item) + { + InsertItem(index, item, false); + } + + void IList.RemoveAt(int index) + { + RemoveItemAt(index); + } + + JToken IList.this[int index] + { + get { return GetItem(index); } + set { SetItem(index, value); } + } + #endregion + + #region ICollection Members + void ICollection.Add(JToken item) + { + Add(item); + } + + void ICollection.Clear() + { + ClearItems(); + } + + bool ICollection.Contains(JToken item) + { + return ContainsItem(item); + } + + void ICollection.CopyTo(JToken[] array, int arrayIndex) + { + CopyItemsTo(array, arrayIndex); + } + + bool ICollection.IsReadOnly + { + get { return false; } + } + + bool ICollection.Remove(JToken item) + { + return RemoveItem(item); + } + #endregion + + private JToken EnsureValue(object value) + { + if (value == null) + { + return null; + } + + if (value is JToken) + { + return (JToken)value; + } + + throw new ArgumentException("Argument is not a JToken."); + } + + #region IList Members + int IList.Add(object value) + { + Add(EnsureValue(value)); + return Count - 1; + } + + void IList.Clear() + { + ClearItems(); + } + + bool IList.Contains(object value) + { + return ContainsItem(EnsureValue(value)); + } + + int IList.IndexOf(object value) + { + return IndexOfItem(EnsureValue(value)); + } + + void IList.Insert(int index, object value) + { + InsertItem(index, EnsureValue(value), false); + } + + bool IList.IsFixedSize + { + get { return false; } + } + + bool IList.IsReadOnly + { + get { return false; } + } + + void IList.Remove(object value) + { + RemoveItem(EnsureValue(value)); + } + + void IList.RemoveAt(int index) + { + RemoveItemAt(index); + } + + object IList.this[int index] + { + get { return GetItem(index); } + set { SetItem(index, EnsureValue(value)); } + } + #endregion + + #region ICollection Members + void ICollection.CopyTo(Array array, int index) + { + CopyItemsTo(array, index); + } + + /// + /// Gets the count of child JSON tokens. + /// + /// The count of child JSON tokens + public int Count + { + get { return ChildrenTokens.Count; } + } + + bool ICollection.IsSynchronized + { + get { return false; } + } + + object ICollection.SyncRoot + { + get + { + if (_syncRoot == null) + { + Interlocked.CompareExchange(ref _syncRoot, new object(), null); + } + + return _syncRoot; + } + } + #endregion + + #region IBindingList Members +#if !(DOTNET || PORTABLE || PORTABLE40) + void IBindingList.AddIndex(PropertyDescriptor property) + { + } + + object IBindingList.AddNew() + { + AddingNewEventArgs args = new AddingNewEventArgs(); + OnAddingNew(args); + + if (args.NewObject == null) + { + throw new JsonException("Could not determine new value to add to '{0}'.".FormatWith(CultureInfo.InvariantCulture, GetType())); + } + + if (!(args.NewObject is JToken)) + { + throw new JsonException("New item to be added to collection must be compatible with {0}.".FormatWith(CultureInfo.InvariantCulture, typeof(JToken))); + } + + JToken newItem = (JToken)args.NewObject; + Add(newItem); + + return newItem; + } + + bool IBindingList.AllowEdit + { + get { return true; } + } + + bool IBindingList.AllowNew + { + get { return true; } + } + + bool IBindingList.AllowRemove + { + get { return true; } + } + + void IBindingList.ApplySort(PropertyDescriptor property, ListSortDirection direction) + { + throw new NotSupportedException(); + } + + int IBindingList.Find(PropertyDescriptor property, object key) + { + throw new NotSupportedException(); + } + + bool IBindingList.IsSorted + { + get { return false; } + } + + void IBindingList.RemoveIndex(PropertyDescriptor property) + { + } + + void IBindingList.RemoveSort() + { + throw new NotSupportedException(); + } + + ListSortDirection IBindingList.SortDirection + { + get { return ListSortDirection.Ascending; } + } + + PropertyDescriptor IBindingList.SortProperty + { + get { return null; } + } + + bool IBindingList.SupportsChangeNotification + { + get { return true; } + } + + bool IBindingList.SupportsSearching + { + get { return false; } + } + + bool IBindingList.SupportsSorting + { + get { return false; } + } +#endif + #endregion + + internal static void MergeEnumerableContent(JContainer target, IEnumerable content, JsonMergeSettings settings) + { + switch (settings.MergeArrayHandling) + { + case MergeArrayHandling.Concat: + foreach (JToken item in content) + { + target.Add(item); + } + break; + case MergeArrayHandling.Union: +#if !NET20 + HashSet items = new HashSet(target, EqualityComparer); + + foreach (JToken item in content) + { + if (items.Add(item)) + { + target.Add(item); + } + } +#else + IDictionary items = new Dictionary(EqualityComparer); + foreach (JToken t in target) + { + items[t] = true; + } + + foreach (JToken item in content) + { + if (!items.ContainsKey(item)) + { + items[item] = true; + target.Add(item); + } + } +#endif + break; + case MergeArrayHandling.Replace: + target.ClearItems(); + foreach (JToken item in content) + { + target.Add(item); + } + break; + case MergeArrayHandling.Merge: + int i = 0; + foreach (object targetItem in content) + { + if (i < target.Count) + { + JToken sourceItem = target[i]; + + JContainer existingContainer = sourceItem as JContainer; + if (existingContainer != null) + { + existingContainer.Merge(targetItem, settings); + } + else + { + if (targetItem != null) + { + JToken contentValue = CreateFromContent(targetItem); + if (contentValue.Type != JTokenType.Null) + { + target[i] = contentValue; + } + } + } + } + else + { + target.Add(targetItem); + } + + i++; + } + break; + default: + throw new ArgumentOutOfRangeException(nameof(settings), "Unexpected merge array handling when merging JSON."); + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JEnumerable.cs b/Common/00-1Json8.3/Json8.3/Linq/JEnumerable.cs new file mode 100644 index 0000000..612d428 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JEnumerable.cs @@ -0,0 +1,151 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; +#endif +using Newtonsoft.Json.Utilities; +using System.Collections; + +namespace Newtonsoft.Json.Linq +{ + /// + /// Represents a collection of objects. + /// + /// The type of token + public struct JEnumerable : IJEnumerable, IEquatable> where T : JToken + { + /// + /// An empty collection of objects. + /// + public static readonly JEnumerable Empty = new JEnumerable(Enumerable.Empty()); + + private readonly IEnumerable _enumerable; + + /// + /// Initializes a new instance of the struct. + /// + /// The enumerable. + public JEnumerable(IEnumerable enumerable) + { + ValidationUtils.ArgumentNotNull(enumerable, nameof(enumerable)); + + _enumerable = enumerable; + } + + /// + /// Returns an enumerator that iterates through the collection. + /// + /// + /// A that can be used to iterate through the collection. + /// + public IEnumerator GetEnumerator() + { + if (_enumerable == null) + { + return Empty.GetEnumerator(); + } + + return _enumerable.GetEnumerator(); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// + /// An object that can be used to iterate through the collection. + /// + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + /// + /// Gets the with the specified key. + /// + /// + public IJEnumerable this[object key] + { + get + { + if (_enumerable == null) + { + return JEnumerable.Empty; + } + + return new JEnumerable(_enumerable.Values(key)); + } + } + + /// + /// Determines whether the specified is equal to this instance. + /// + /// The to compare with this instance. + /// + /// true if the specified is equal to this instance; otherwise, false. + /// + public bool Equals(JEnumerable other) + { + return Equals(_enumerable, other._enumerable); + } + + /// + /// Determines whether the specified is equal to this instance. + /// + /// The to compare with this instance. + /// + /// true if the specified is equal to this instance; otherwise, false. + /// + public override bool Equals(object obj) + { + if (obj is JEnumerable) + { + return Equals((JEnumerable)obj); + } + + return false; + } + + /// + /// Returns a hash code for this instance. + /// + /// + /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + /// + public override int GetHashCode() + { + if (_enumerable == null) + { + return 0; + } + + return _enumerable.GetHashCode(); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JObject.cs b/Common/00-1Json8.3/Json8.3/Linq/JObject.cs new file mode 100644 index 0000000..7e7d49c --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JObject.cs @@ -0,0 +1,905 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +#if !PORTABLE40 +using System.Collections.Specialized; +#endif +using System.ComponentModel; +#if !(NET35 || NET20 || PORTABLE40) +using System.Dynamic; +using System.Linq.Expressions; +#endif +using System.IO; +using Newtonsoft.Json.Utilities; +using System.Globalization; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Linq +{ + /// + /// Represents a JSON object. + /// + /// + /// + /// + public class JObject : JContainer, IDictionary, INotifyPropertyChanged +#if !(DOTNET || PORTABLE40 || PORTABLE) + , ICustomTypeDescriptor +#endif +#if !(NET20 || PORTABLE40 || PORTABLE) + , INotifyPropertyChanging +#endif + { + private readonly JPropertyKeyedCollection _properties = new JPropertyKeyedCollection(); + + /// + /// Gets the container's children tokens. + /// + /// The container's children tokens. + protected override IList ChildrenTokens + { + get { return _properties; } + } + + /// + /// Occurs when a property value changes. + /// + public event PropertyChangedEventHandler PropertyChanged; + +#if !(NET20 || PORTABLE || PORTABLE40) + /// + /// Occurs when a property value is changing. + /// + public event PropertyChangingEventHandler PropertyChanging; +#endif + + /// + /// Initializes a new instance of the class. + /// + public JObject() + { + } + + /// + /// Initializes a new instance of the class from another object. + /// + /// A object to copy from. + public JObject(JObject other) + : base(other) + { + } + + /// + /// Initializes a new instance of the class with the specified content. + /// + /// The contents of the object. + public JObject(params object[] content) + : this((object)content) + { + } + + /// + /// Initializes a new instance of the class with the specified content. + /// + /// The contents of the object. + public JObject(object content) + { + Add(content); + } + + internal override bool DeepEquals(JToken node) + { + JObject t = node as JObject; + if (t == null) + { + return false; + } + + return _properties.Compare(t._properties); + } + + internal override void InsertItem(int index, JToken item, bool skipParentCheck) + { + // don't add comments to JObject, no name to reference comment by + if (item != null && item.Type == JTokenType.Comment) + { + return; + } + + base.InsertItem(index, item, skipParentCheck); + } + + internal override void ValidateToken(JToken o, JToken existing) + { + ValidationUtils.ArgumentNotNull(o, nameof(o)); + + if (o.Type != JTokenType.Property) + { + throw new ArgumentException("Can not add {0} to {1}.".FormatWith(CultureInfo.InvariantCulture, o.GetType(), GetType())); + } + + JProperty newProperty = (JProperty)o; + + if (existing != null) + { + JProperty existingProperty = (JProperty)existing; + + if (newProperty.Name == existingProperty.Name) + { + return; + } + } + + if (_properties.TryGetValue(newProperty.Name, out existing)) + { + throw new ArgumentException("Can not add property {0} to {1}. Property with the same name already exists on object.".FormatWith(CultureInfo.InvariantCulture, newProperty.Name, GetType())); + } + } + + internal override void MergeItem(object content, JsonMergeSettings settings) + { + JObject o = content as JObject; + if (o == null) + { + return; + } + + foreach (KeyValuePair contentItem in o) + { + JProperty existingProperty = Property(contentItem.Key); + + if (existingProperty == null) + { + Add(contentItem.Key, contentItem.Value); + } + else if (contentItem.Value != null) + { + JContainer existingContainer = existingProperty.Value as JContainer; + if (existingContainer == null) + { + if (contentItem.Value.Type != JTokenType.Null || settings?.MergeNullValueHandling == MergeNullValueHandling.Merge) + { + existingProperty.Value = contentItem.Value; + } + } + else if (existingContainer.Type != contentItem.Value.Type) + { + existingProperty.Value = contentItem.Value; + } + else + { + existingContainer.Merge(contentItem.Value, settings); + } + } + } + } + + internal void InternalPropertyChanged(JProperty childProperty) + { + OnPropertyChanged(childProperty.Name); +#if !(DOTNET || PORTABLE40 || PORTABLE) + if (_listChanged != null) + { + OnListChanged(new ListChangedEventArgs(ListChangedType.ItemChanged, IndexOfItem(childProperty))); + } +#endif +#if !(NET20 || NET35 || PORTABLE40) + if (_collectionChanged != null) + { + OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, childProperty, childProperty, IndexOfItem(childProperty))); + } +#endif + } + + internal void InternalPropertyChanging(JProperty childProperty) + { +#if !(NET20 || PORTABLE40 || PORTABLE) + OnPropertyChanging(childProperty.Name); +#endif + } + + internal override JToken CloneToken() + { + return new JObject(this); + } + + /// + /// Gets the node type for this . + /// + /// The type. + public override JTokenType Type + { + get { return JTokenType.Object; } + } + + /// + /// Gets an of this object's properties. + /// + /// An of this object's properties. + public IEnumerable Properties() + { + return _properties.Cast(); + } + + /// + /// Gets a the specified name. + /// + /// The property name. + /// A with the specified name or null. + public JProperty Property(string name) + { + if (name == null) + { + return null; + } + + JToken property; + _properties.TryGetValue(name, out property); + return (JProperty)property; + } + + /// + /// Gets an of this object's property values. + /// + /// An of this object's property values. + public JEnumerable PropertyValues() + { + return new JEnumerable(Properties().Select(p => p.Value)); + } + + /// + /// Gets the with the specified key. + /// + /// The with the specified key. + public override JToken this[object key] + { + get + { + ValidationUtils.ArgumentNotNull(key, nameof(key)); + + string propertyName = key as string; + if (propertyName == null) + { + throw new ArgumentException("Accessed JObject values with invalid key value: {0}. Object property name expected.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.ToString(key))); + } + + return this[propertyName]; + } + set + { + ValidationUtils.ArgumentNotNull(key, nameof(key)); + + string propertyName = key as string; + if (propertyName == null) + { + throw new ArgumentException("Set JObject values with invalid key value: {0}. Object property name expected.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.ToString(key))); + } + + this[propertyName] = value; + } + } + + /// + /// Gets or sets the with the specified property name. + /// + /// + public JToken this[string propertyName] + { + get + { + ValidationUtils.ArgumentNotNull(propertyName, nameof(propertyName)); + + JProperty property = Property(propertyName); + + return (property != null) ? property.Value : null; + } + set + { + JProperty property = Property(propertyName); + if (property != null) + { + property.Value = value; + } + else + { +#if !(NET20 || PORTABLE40 || PORTABLE) + OnPropertyChanging(propertyName); +#endif + Add(new JProperty(propertyName, value)); + OnPropertyChanged(propertyName); + } + } + } + + /// + /// Loads an from a . + /// + /// A that will be read for the content of the . + /// A that contains the JSON that was read from the specified . + public new static JObject Load(JsonReader reader) + { + return Load(reader, null); + } + + /// + /// Loads an from a . + /// + /// A that will be read for the content of the . + /// The used to load the JSON. + /// If this is null, default load settings will be used. + /// A that contains the JSON that was read from the specified . + public new static JObject Load(JsonReader reader, JsonLoadSettings settings) + { + ValidationUtils.ArgumentNotNull(reader, nameof(reader)); + + if (reader.TokenType == JsonToken.None) + { + if (!reader.Read()) + { + throw JsonReaderException.Create(reader, "Error reading JObject from JsonReader."); + } + } + + reader.MoveToContent(); + + if (reader.TokenType != JsonToken.StartObject) + { + throw JsonReaderException.Create(reader, "Error reading JObject from JsonReader. Current JsonReader item is not an object: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + } + + JObject o = new JObject(); + o.SetLineInfo(reader as IJsonLineInfo, settings); + + o.ReadTokenFrom(reader, settings); + + return o; + } + + /// + /// Load a from a string that contains JSON. + /// + /// A that contains JSON. + /// A populated from the string that contains JSON. + /// + /// + /// + public new static JObject Parse(string json) + { + return Parse(json, null); + } + + /// + /// Load a from a string that contains JSON. + /// + /// A that contains JSON. + /// The used to load the JSON. + /// If this is null, default load settings will be used. + /// A populated from the string that contains JSON. + /// + /// + /// + public new static JObject Parse(string json, JsonLoadSettings settings) + { + using (JsonReader reader = new JsonTextReader(new StringReader(json))) + { + JObject o = Load(reader, settings); + + if (reader.Read() && reader.TokenType != JsonToken.Comment) + { + throw JsonReaderException.Create(reader, "Additional text found in JSON string after parsing content."); + } + + return o; + } + } + + /// + /// Creates a from an object. + /// + /// The object that will be used to create . + /// A with the values of the specified object + public new static JObject FromObject(object o) + { + return FromObject(o, JsonSerializer.CreateDefault()); + } + + /// + /// Creates a from an object. + /// + /// The object that will be used to create . + /// The that will be used to read the object. + /// A with the values of the specified object + public new static JObject FromObject(object o, JsonSerializer jsonSerializer) + { + JToken token = FromObjectInternal(o, jsonSerializer); + + if (token != null && token.Type != JTokenType.Object) + { + throw new ArgumentException("Object serialized to {0}. JObject instance expected.".FormatWith(CultureInfo.InvariantCulture, token.Type)); + } + + return (JObject)token; + } + + /// + /// Writes this token to a . + /// + /// A into which this method will write. + /// A collection of which will be used when writing the token. + public override void WriteTo(JsonWriter writer, params JsonConverter[] converters) + { + writer.WriteStartObject(); + + for (int i = 0; i < _properties.Count; i++) + { + _properties[i].WriteTo(writer, converters); + } + + writer.WriteEndObject(); + } + + /// + /// Gets the with the specified property name. + /// + /// Name of the property. + /// The with the specified property name. + public JToken GetValue(string propertyName) + { + return GetValue(propertyName, StringComparison.Ordinal); + } + + /// + /// Gets the with the specified property name. + /// The exact property name will be searched for first and if no matching property is found then + /// the will be used to match a property. + /// + /// Name of the property. + /// One of the enumeration values that specifies how the strings will be compared. + /// The with the specified property name. + public JToken GetValue(string propertyName, StringComparison comparison) + { + if (propertyName == null) + { + return null; + } + + // attempt to get value via dictionary first for performance + JProperty property = Property(propertyName); + if (property != null) + { + return property.Value; + } + + // test above already uses this comparison so no need to repeat + if (comparison != StringComparison.Ordinal) + { + foreach (JProperty p in _properties) + { + if (string.Equals(p.Name, propertyName, comparison)) + { + return p.Value; + } + } + } + + return null; + } + + /// + /// Tries to get the with the specified property name. + /// The exact property name will be searched for first and if no matching property is found then + /// the will be used to match a property. + /// + /// Name of the property. + /// The value. + /// One of the enumeration values that specifies how the strings will be compared. + /// true if a value was successfully retrieved; otherwise, false. + public bool TryGetValue(string propertyName, StringComparison comparison, out JToken value) + { + value = GetValue(propertyName, comparison); + return (value != null); + } + + #region IDictionary Members + /// + /// Adds the specified property name. + /// + /// Name of the property. + /// The value. + public void Add(string propertyName, JToken value) + { + Add(new JProperty(propertyName, value)); + } + + bool IDictionary.ContainsKey(string key) + { + return _properties.Contains(key); + } + + ICollection IDictionary.Keys + { + // todo: make order the collection returned match JObject order + get { return _properties.Keys; } + } + + /// + /// Removes the property with the specified name. + /// + /// Name of the property. + /// true if item was successfully removed; otherwise, false. + public bool Remove(string propertyName) + { + JProperty property = Property(propertyName); + if (property == null) + { + return false; + } + + property.Remove(); + return true; + } + + /// + /// Tries the get value. + /// + /// Name of the property. + /// The value. + /// true if a value was successfully retrieved; otherwise, false. + public bool TryGetValue(string propertyName, out JToken value) + { + JProperty property = Property(propertyName); + if (property == null) + { + value = null; + return false; + } + + value = property.Value; + return true; + } + + ICollection IDictionary.Values + { + get + { + // todo: need to wrap _properties.Values with a collection to get the JProperty value + throw new NotImplementedException(); + } + } + #endregion + + #region ICollection> Members + void ICollection>.Add(KeyValuePair item) + { + Add(new JProperty(item.Key, item.Value)); + } + + void ICollection>.Clear() + { + RemoveAll(); + } + + bool ICollection>.Contains(KeyValuePair item) + { + JProperty property = Property(item.Key); + if (property == null) + { + return false; + } + + return (property.Value == item.Value); + } + + void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) + { + if (array == null) + { + throw new ArgumentNullException(nameof(array)); + } + if (arrayIndex < 0) + { + throw new ArgumentOutOfRangeException(nameof(arrayIndex), "arrayIndex is less than 0."); + } + if (arrayIndex >= array.Length && arrayIndex != 0) + { + throw new ArgumentException("arrayIndex is equal to or greater than the length of array."); + } + if (Count > array.Length - arrayIndex) + { + throw new ArgumentException("The number of elements in the source JObject is greater than the available space from arrayIndex to the end of the destination array."); + } + + int index = 0; + foreach (JProperty property in _properties) + { + array[arrayIndex + index] = new KeyValuePair(property.Name, property.Value); + index++; + } + } + + bool ICollection>.IsReadOnly + { + get { return false; } + } + + bool ICollection>.Remove(KeyValuePair item) + { + if (!((ICollection>)this).Contains(item)) + { + return false; + } + + ((IDictionary)this).Remove(item.Key); + return true; + } + #endregion + + internal override int GetDeepHashCode() + { + return ContentsHashCode(); + } + + /// + /// Returns an enumerator that iterates through the collection. + /// + /// + /// A that can be used to iterate through the collection. + /// + public IEnumerator> GetEnumerator() + { + foreach (JProperty property in _properties) + { + yield return new KeyValuePair(property.Name, property.Value); + } + } + + /// + /// Raises the event with the provided arguments. + /// + /// Name of the property. + protected virtual void OnPropertyChanged(string propertyName) + { + if (PropertyChanged != null) + { + PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); + } + } + +#if !(PORTABLE40 || PORTABLE || NET20) + /// + /// Raises the event with the provided arguments. + /// + /// Name of the property. + protected virtual void OnPropertyChanging(string propertyName) + { + if (PropertyChanging != null) + { + PropertyChanging(this, new PropertyChangingEventArgs(propertyName)); + } + } +#endif + +#if !(DOTNET || PORTABLE40 || PORTABLE) + // include custom type descriptor on JObject rather than use a provider because the properties are specific to a type + + #region ICustomTypeDescriptor + /// + /// Returns the properties for this instance of a component. + /// + /// + /// A that represents the properties for this component instance. + /// + PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties() + { + return ((ICustomTypeDescriptor)this).GetProperties(null); + } + + /// + /// Returns the properties for this instance of a component using the attribute array as a filter. + /// + /// An array of type that is used as a filter. + /// + /// A that represents the filtered properties for this component instance. + /// + PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes) + { + PropertyDescriptorCollection descriptors = new PropertyDescriptorCollection(null); + + foreach (KeyValuePair propertyValue in this) + { + descriptors.Add(new JPropertyDescriptor(propertyValue.Key)); + } + + return descriptors; + } + + /// + /// Returns a collection of custom attributes for this instance of a component. + /// + /// + /// An containing the attributes for this object. + /// + AttributeCollection ICustomTypeDescriptor.GetAttributes() + { + return AttributeCollection.Empty; + } + + /// + /// Returns the class name of this instance of a component. + /// + /// + /// The class name of the object, or null if the class does not have a name. + /// + string ICustomTypeDescriptor.GetClassName() + { + return null; + } + + /// + /// Returns the name of this instance of a component. + /// + /// + /// The name of the object, or null if the object does not have a name. + /// + string ICustomTypeDescriptor.GetComponentName() + { + return null; + } + + /// + /// Returns a type converter for this instance of a component. + /// + /// + /// A that is the converter for this object, or null if there is no for this object. + /// + TypeConverter ICustomTypeDescriptor.GetConverter() + { + return new TypeConverter(); + } + + /// + /// Returns the default event for this instance of a component. + /// + /// + /// An that represents the default event for this object, or null if this object does not have events. + /// + EventDescriptor ICustomTypeDescriptor.GetDefaultEvent() + { + return null; + } + + /// + /// Returns the default property for this instance of a component. + /// + /// + /// A that represents the default property for this object, or null if this object does not have properties. + /// + PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty() + { + return null; + } + + /// + /// Returns an editor of the specified type for this instance of a component. + /// + /// A that represents the editor for this object. + /// + /// An of the specified type that is the editor for this object, or null if the editor cannot be found. + /// + object ICustomTypeDescriptor.GetEditor(Type editorBaseType) + { + return null; + } + + /// + /// Returns the events for this instance of a component using the specified attribute array as a filter. + /// + /// An array of type that is used as a filter. + /// + /// An that represents the filtered events for this component instance. + /// + EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes) + { + return EventDescriptorCollection.Empty; + } + + /// + /// Returns the events for this instance of a component. + /// + /// + /// An that represents the events for this component instance. + /// + EventDescriptorCollection ICustomTypeDescriptor.GetEvents() + { + return EventDescriptorCollection.Empty; + } + + /// + /// Returns an object that contains the property described by the specified property descriptor. + /// + /// A that represents the property whose owner is to be found. + /// + /// An that represents the owner of the specified property. + /// + object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd) + { + return null; + } + #endregion + +#endif + +#if !(NET35 || NET20 || PORTABLE40) + /// + /// Returns the responsible for binding operations performed on this object. + /// + /// The expression tree representation of the runtime value. + /// + /// The to bind this object. + /// + protected override DynamicMetaObject GetMetaObject(Expression parameter) + { + return new DynamicProxyMetaObject(parameter, this, new JObjectDynamicProxy(), true); + } + + private class JObjectDynamicProxy : DynamicProxy + { + public override bool TryGetMember(JObject instance, GetMemberBinder binder, out object result) + { + // result can be null + result = instance[binder.Name]; + return true; + } + + public override bool TrySetMember(JObject instance, SetMemberBinder binder, object value) + { + JToken v = value as JToken; + + // this can throw an error if value isn't a valid for a JValue + if (v == null) + { + v = new JValue(value); + } + + instance[binder.Name] = v; + return true; + } + + public override IEnumerable GetDynamicMemberNames(JObject instance) + { + return instance.Properties().Select(p => p.Name); + } + } +#endif + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JProperty.cs b/Common/00-1Json8.3/Json8.3/Linq/JProperty.cs new file mode 100644 index 0000000..a1049cf --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JProperty.cs @@ -0,0 +1,400 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using Newtonsoft.Json.Utilities; +using System.Diagnostics; +using System.Globalization; + +namespace Newtonsoft.Json.Linq +{ + /// + /// Represents a JSON property. + /// + public class JProperty : JContainer + { + #region JPropertyList + private class JPropertyList : IList + { + internal JToken _token; + + public IEnumerator GetEnumerator() + { + if (_token != null) + { + yield return _token; + } + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Add(JToken item) + { + _token = item; + } + + public void Clear() + { + _token = null; + } + + public bool Contains(JToken item) + { + return (_token == item); + } + + public void CopyTo(JToken[] array, int arrayIndex) + { + if (_token != null) + { + array[arrayIndex] = _token; + } + } + + public bool Remove(JToken item) + { + if (_token == item) + { + _token = null; + return true; + } + return false; + } + + public int Count + { + get { return (_token != null) ? 1 : 0; } + } + + public bool IsReadOnly + { + get { return false; } + } + + public int IndexOf(JToken item) + { + return (_token == item) ? 0 : -1; + } + + public void Insert(int index, JToken item) + { + if (index == 0) + { + _token = item; + } + } + + public void RemoveAt(int index) + { + if (index == 0) + { + _token = null; + } + } + + public JToken this[int index] + { + get { return (index == 0) ? _token : null; } + set + { + if (index == 0) + { + _token = value; + } + } + } + } + #endregion + + private readonly JPropertyList _content = new JPropertyList(); + private readonly string _name; + + /// + /// Gets the container's children tokens. + /// + /// The container's children tokens. + protected override IList ChildrenTokens + { + get { return _content; } + } + + /// + /// Gets the property name. + /// + /// The property name. + public string Name + { + [DebuggerStepThrough] + get { return _name; } + } + + /// + /// Gets or sets the property value. + /// + /// The property value. + public JToken Value + { + [DebuggerStepThrough] + get { return _content._token; } + set + { + CheckReentrancy(); + + JToken newValue = value ?? JValue.CreateNull(); + + if (_content._token == null) + { + InsertItem(0, newValue, false); + } + else + { + SetItem(0, newValue); + } + } + } + + /// + /// Initializes a new instance of the class from another object. + /// + /// A object to copy from. + public JProperty(JProperty other) + : base(other) + { + _name = other.Name; + } + + internal override JToken GetItem(int index) + { + if (index != 0) + { + throw new ArgumentOutOfRangeException(); + } + + return Value; + } + + internal override void SetItem(int index, JToken item) + { + if (index != 0) + { + throw new ArgumentOutOfRangeException(); + } + + if (IsTokenUnchanged(Value, item)) + { + return; + } + + if (Parent != null) + { + ((JObject)Parent).InternalPropertyChanging(this); + } + + base.SetItem(0, item); + + if (Parent != null) + { + ((JObject)Parent).InternalPropertyChanged(this); + } + } + + internal override bool RemoveItem(JToken item) + { + throw new JsonException("Cannot add or remove items from {0}.".FormatWith(CultureInfo.InvariantCulture, typeof(JProperty))); + } + + internal override void RemoveItemAt(int index) + { + throw new JsonException("Cannot add or remove items from {0}.".FormatWith(CultureInfo.InvariantCulture, typeof(JProperty))); + } + + internal override void InsertItem(int index, JToken item, bool skipParentCheck) + { + // don't add comments to JProperty + if (item != null && item.Type == JTokenType.Comment) + { + return; + } + + if (Value != null) + { + throw new JsonException("{0} cannot have multiple values.".FormatWith(CultureInfo.InvariantCulture, typeof(JProperty))); + } + + base.InsertItem(0, item, false); + } + + internal override bool ContainsItem(JToken item) + { + return (Value == item); + } + + internal override void MergeItem(object content, JsonMergeSettings settings) + { + JProperty p = content as JProperty; + if (p == null) + { + return; + } + + if (p.Value != null && p.Value.Type != JTokenType.Null) + { + Value = p.Value; + } + } + + internal override void ClearItems() + { + throw new JsonException("Cannot add or remove items from {0}.".FormatWith(CultureInfo.InvariantCulture, typeof(JProperty))); + } + + internal override bool DeepEquals(JToken node) + { + JProperty t = node as JProperty; + return (t != null && _name == t.Name && ContentsEqual(t)); + } + + internal override JToken CloneToken() + { + return new JProperty(this); + } + + /// + /// Gets the node type for this . + /// + /// The type. + public override JTokenType Type + { + [DebuggerStepThrough] + get { return JTokenType.Property; } + } + + internal JProperty(string name) + { + // called from JTokenWriter + ValidationUtils.ArgumentNotNull(name, nameof(name)); + + _name = name; + } + + /// + /// Initializes a new instance of the class. + /// + /// The property name. + /// The property content. + public JProperty(string name, params object[] content) + : this(name, (object)content) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The property name. + /// The property content. + public JProperty(string name, object content) + { + ValidationUtils.ArgumentNotNull(name, nameof(name)); + + _name = name; + + Value = IsMultiContent(content) + ? new JArray(content) + : CreateFromContent(content); + } + + /// + /// Writes this token to a . + /// + /// A into which this method will write. + /// A collection of which will be used when writing the token. + public override void WriteTo(JsonWriter writer, params JsonConverter[] converters) + { + writer.WritePropertyName(_name); + + JToken value = Value; + if (value != null) + { + value.WriteTo(writer, converters); + } + else + { + writer.WriteNull(); + } + } + + internal override int GetDeepHashCode() + { + return _name.GetHashCode() ^ ((Value != null) ? Value.GetDeepHashCode() : 0); + } + + /// + /// Loads an from a . + /// + /// A that will be read for the content of the . + /// A that contains the JSON that was read from the specified . + public new static JProperty Load(JsonReader reader) + { + return Load(reader, null); + } + + /// + /// Loads an from a . + /// + /// A that will be read for the content of the . + /// The used to load the JSON. + /// If this is null, default load settings will be used. + /// A that contains the JSON that was read from the specified . + public new static JProperty Load(JsonReader reader, JsonLoadSettings settings) + { + if (reader.TokenType == JsonToken.None) + { + if (!reader.Read()) + { + throw JsonReaderException.Create(reader, "Error reading JProperty from JsonReader."); + } + } + + reader.MoveToContent(); + + if (reader.TokenType != JsonToken.PropertyName) + { + throw JsonReaderException.Create(reader, "Error reading JProperty from JsonReader. Current JsonReader item is not a property: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + } + + JProperty p = new JProperty((string)reader.Value); + p.SetLineInfo(reader as IJsonLineInfo, settings); + + p.ReadTokenFrom(reader, settings); + + return p; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JPropertyDescriptor.cs b/Common/00-1Json8.3/Json8.3/Linq/JPropertyDescriptor.cs new file mode 100644 index 0000000..00eb857 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JPropertyDescriptor.cs @@ -0,0 +1,166 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(DOTNET || PORTABLE || PORTABLE40) +using System; +using System.ComponentModel; + +namespace Newtonsoft.Json.Linq +{ + /// + /// Represents a view of a . + /// + public class JPropertyDescriptor : PropertyDescriptor + { + /// + /// Initializes a new instance of the class. + /// + /// The name. + public JPropertyDescriptor(string name) + : base(name, null) + { + } + + private static JObject CastInstance(object instance) + { + return (JObject)instance; + } + + /// + /// When overridden in a derived class, returns whether resetting an object changes its value. + /// + /// + /// true if resetting the component changes its value; otherwise, false. + /// + /// The component to test for reset capability. + /// + public override bool CanResetValue(object component) + { + return false; + } + + /// + /// When overridden in a derived class, gets the current value of the property on a component. + /// + /// + /// The value of a property for a given component. + /// + /// The component with the property for which to retrieve the value. + /// + public override object GetValue(object component) + { + JToken token = CastInstance(component)[Name]; + + return token; + } + + /// + /// When overridden in a derived class, resets the value for this property of the component to the default value. + /// + /// The component with the property value that is to be reset to the default value. + /// + public override void ResetValue(object component) + { + } + + /// + /// When overridden in a derived class, sets the value of the component to a different value. + /// + /// The component with the property value that is to be set. + /// The new value. + /// + public override void SetValue(object component, object value) + { + JToken token = (value is JToken) ? (JToken)value : new JValue(value); + + CastInstance(component)[Name] = token; + } + + /// + /// When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + /// + /// + /// true if the property should be persisted; otherwise, false. + /// + /// The component with the property to be examined for persistence. + /// + public override bool ShouldSerializeValue(object component) + { + return false; + } + + /// + /// When overridden in a derived class, gets the type of the component this property is bound to. + /// + /// + /// A that represents the type of component this property is bound to. When the or methods are invoked, the object specified might be an instance of this type. + /// + public override Type ComponentType + { + get { return typeof(JObject); } + } + + /// + /// When overridden in a derived class, gets a value indicating whether this property is read-only. + /// + /// + /// true if the property is read-only; otherwise, false. + /// + public override bool IsReadOnly + { + get { return false; } + } + + /// + /// When overridden in a derived class, gets the type of the property. + /// + /// + /// A that represents the type of the property. + /// + public override Type PropertyType + { + get { return typeof(object); } + } + + /// + /// Gets the hash code for the name of the member. + /// + /// + /// + /// The hash code for the name of the member. + /// + protected override int NameHashCode + { + get + { + // override property to fix up an error in its documentation + int nameHashCode = base.NameHashCode; + return nameHashCode; + } + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JPropertyKeyedCollection.cs b/Common/00-1Json8.3/Json8.3/Linq/JPropertyKeyedCollection.cs new file mode 100644 index 0000000..867d741 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JPropertyKeyedCollection.cs @@ -0,0 +1,280 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace Newtonsoft.Json.Linq +{ + internal class JPropertyKeyedCollection : Collection + { + private static readonly IEqualityComparer Comparer = StringComparer.Ordinal; + + private Dictionary _dictionary; + + private void AddKey(string key, JToken item) + { + EnsureDictionary(); + _dictionary[key] = item; + } + + protected void ChangeItemKey(JToken item, string newKey) + { + if (!ContainsItem(item)) + { + throw new ArgumentException("The specified item does not exist in this KeyedCollection."); + } + + string keyForItem = GetKeyForItem(item); + if (!Comparer.Equals(keyForItem, newKey)) + { + if (newKey != null) + { + AddKey(newKey, item); + } + + if (keyForItem != null) + { + RemoveKey(keyForItem); + } + } + } + + protected override void ClearItems() + { + base.ClearItems(); + + if (_dictionary != null) + { + _dictionary.Clear(); + } + } + + public bool Contains(string key) + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + if (_dictionary != null) + { + return _dictionary.ContainsKey(key); + } + + return false; + } + + private bool ContainsItem(JToken item) + { + if (_dictionary == null) + { + return false; + } + + string key = GetKeyForItem(item); + JToken value; + return _dictionary.TryGetValue(key, out value); + } + + private void EnsureDictionary() + { + if (_dictionary == null) + { + _dictionary = new Dictionary(Comparer); + } + } + + private string GetKeyForItem(JToken item) + { + return ((JProperty)item).Name; + } + + protected override void InsertItem(int index, JToken item) + { + AddKey(GetKeyForItem(item), item); + base.InsertItem(index, item); + } + + public bool Remove(string key) + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + if (_dictionary != null) + { + return _dictionary.ContainsKey(key) && Remove(_dictionary[key]); + } + + return false; + } + + protected override void RemoveItem(int index) + { + string keyForItem = GetKeyForItem(Items[index]); + RemoveKey(keyForItem); + base.RemoveItem(index); + } + + private void RemoveKey(string key) + { + if (_dictionary != null) + { + _dictionary.Remove(key); + } + } + + protected override void SetItem(int index, JToken item) + { + string keyForItem = GetKeyForItem(item); + string keyAtIndex = GetKeyForItem(Items[index]); + + if (Comparer.Equals(keyAtIndex, keyForItem)) + { + if (_dictionary != null) + { + _dictionary[keyForItem] = item; + } + } + else + { + AddKey(keyForItem, item); + + if (keyAtIndex != null) + { + RemoveKey(keyAtIndex); + } + } + base.SetItem(index, item); + } + + public JToken this[string key] + { + get + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + if (_dictionary != null) + { + return _dictionary[key]; + } + + throw new KeyNotFoundException(); + } + } + + public bool TryGetValue(string key, out JToken value) + { + if (_dictionary == null) + { + value = null; + return false; + } + + return _dictionary.TryGetValue(key, out value); + } + + public ICollection Keys + { + get + { + EnsureDictionary(); + return _dictionary.Keys; + } + } + + public ICollection Values + { + get + { + EnsureDictionary(); + return _dictionary.Values; + } + } + + public bool Compare(JPropertyKeyedCollection other) + { + if (this == other) + { + return true; + } + + // dictionaries in JavaScript aren't ordered + // ignore order when comparing properties + Dictionary d1 = _dictionary; + Dictionary d2 = other._dictionary; + + if (d1 == null && d2 == null) + { + return true; + } + + if (d1 == null) + { + return (d2.Count == 0); + } + + if (d2 == null) + { + return (d1.Count == 0); + } + + if (d1.Count != d2.Count) + { + return false; + } + + foreach (KeyValuePair keyAndProperty in d1) + { + JToken secondValue; + if (!d2.TryGetValue(keyAndProperty.Key, out secondValue)) + { + return false; + } + + JProperty p1 = (JProperty)keyAndProperty.Value; + JProperty p2 = (JProperty)secondValue; + + if (p1.Value == null) + { + return (p2.Value == null); + } + + if (!p1.Value.DeepEquals(p2.Value)) + { + return false; + } + } + + return true; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JRaw.cs b/Common/00-1Json8.3/Json8.3/Linq/JRaw.cs new file mode 100644 index 0000000..fec5a57 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JRaw.cs @@ -0,0 +1,75 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System.Globalization; +using System.IO; + +namespace Newtonsoft.Json.Linq +{ + /// + /// Represents a raw JSON string. + /// + public class JRaw : JValue + { + /// + /// Initializes a new instance of the class from another object. + /// + /// A object to copy from. + public JRaw(JRaw other) + : base(other) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The raw json. + public JRaw(object rawJson) + : base(rawJson, JTokenType.Raw) + { + } + + /// + /// Creates an instance of with the content of the reader's current token. + /// + /// The reader. + /// An instance of with the content of the reader's current token. + public static JRaw Create(JsonReader reader) + { + using (StringWriter sw = new StringWriter(CultureInfo.InvariantCulture)) + using (JsonTextWriter jsonWriter = new JsonTextWriter(sw)) + { + jsonWriter.WriteToken(reader); + + return new JRaw(sw.ToString()); + } + } + + internal override JToken CloneToken() + { + return new JRaw(this); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JToken.cs b/Common/00-1Json8.3/Json8.3/Linq/JToken.cs new file mode 100644 index 0000000..7a16284 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JToken.cs @@ -0,0 +1,2704 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using Newtonsoft.Json.Linq.JsonPath; +#if !(NET35 || NET20 || PORTABLE40) +using System.Dynamic; +using System.Linq.Expressions; +#endif +using System.IO; +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) +using System.Numerics; +#endif +using System.Text; +using Newtonsoft.Json.Utilities; +using System.Diagnostics; +using System.Globalization; +using System.Collections; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Linq +{ + /// + /// Represents an abstract JSON token. + /// + public abstract class JToken : IJEnumerable, IJsonLineInfo +#if !(DOTNET || PORTABLE40 || PORTABLE) + , ICloneable +#endif +#if !(NET35 || NET20 || PORTABLE40) + , IDynamicMetaObjectProvider +#endif + { + private static JTokenEqualityComparer _equalityComparer; + + private JContainer _parent; + private JToken _previous; + private JToken _next; + private object _annotations; + + private static readonly JTokenType[] BooleanTypes = new[] { JTokenType.Integer, JTokenType.Float, JTokenType.String, JTokenType.Comment, JTokenType.Raw, JTokenType.Boolean }; + private static readonly JTokenType[] NumberTypes = new[] { JTokenType.Integer, JTokenType.Float, JTokenType.String, JTokenType.Comment, JTokenType.Raw, JTokenType.Boolean }; +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + private static readonly JTokenType[] BigIntegerTypes = new[] { JTokenType.Integer, JTokenType.Float, JTokenType.String, JTokenType.Comment, JTokenType.Raw, JTokenType.Boolean, JTokenType.Bytes }; +#endif + private static readonly JTokenType[] StringTypes = new[] { JTokenType.Date, JTokenType.Integer, JTokenType.Float, JTokenType.String, JTokenType.Comment, JTokenType.Raw, JTokenType.Boolean, JTokenType.Bytes, JTokenType.Guid, JTokenType.TimeSpan, JTokenType.Uri }; + private static readonly JTokenType[] GuidTypes = new[] { JTokenType.String, JTokenType.Comment, JTokenType.Raw, JTokenType.Guid, JTokenType.Bytes }; + private static readonly JTokenType[] TimeSpanTypes = new[] { JTokenType.String, JTokenType.Comment, JTokenType.Raw, JTokenType.TimeSpan }; + private static readonly JTokenType[] UriTypes = new[] { JTokenType.String, JTokenType.Comment, JTokenType.Raw, JTokenType.Uri }; + private static readonly JTokenType[] CharTypes = new[] { JTokenType.Integer, JTokenType.Float, JTokenType.String, JTokenType.Comment, JTokenType.Raw }; + private static readonly JTokenType[] DateTimeTypes = new[] { JTokenType.Date, JTokenType.String, JTokenType.Comment, JTokenType.Raw }; + private static readonly JTokenType[] BytesTypes = new[] { JTokenType.Bytes, JTokenType.String, JTokenType.Comment, JTokenType.Raw, JTokenType.Integer }; + + /// + /// Gets a comparer that can compare two tokens for value equality. + /// + /// A that can compare two nodes for value equality. + public static JTokenEqualityComparer EqualityComparer + { + get + { + if (_equalityComparer == null) + { + _equalityComparer = new JTokenEqualityComparer(); + } + + return _equalityComparer; + } + } + + /// + /// Gets or sets the parent. + /// + /// The parent. + public JContainer Parent + { + [DebuggerStepThrough] + get { return _parent; } + internal set { _parent = value; } + } + + /// + /// Gets the root of this . + /// + /// The root of this . + public JToken Root + { + get + { + JContainer parent = Parent; + if (parent == null) + { + return this; + } + + while (parent.Parent != null) + { + parent = parent.Parent; + } + + return parent; + } + } + + internal abstract JToken CloneToken(); + internal abstract bool DeepEquals(JToken node); + + /// + /// Gets the node type for this . + /// + /// The type. + public abstract JTokenType Type { get; } + + /// + /// Gets a value indicating whether this token has child tokens. + /// + /// + /// true if this token has child values; otherwise, false. + /// + public abstract bool HasValues { get; } + + /// + /// Compares the values of two tokens, including the values of all descendant tokens. + /// + /// The first to compare. + /// The second to compare. + /// true if the tokens are equal; otherwise false. + public static bool DeepEquals(JToken t1, JToken t2) + { + return (t1 == t2 || (t1 != null && t2 != null && t1.DeepEquals(t2))); + } + + /// + /// Gets the next sibling token of this node. + /// + /// The that contains the next sibling token. + public JToken Next + { + get { return _next; } + internal set { _next = value; } + } + + /// + /// Gets the previous sibling token of this node. + /// + /// The that contains the previous sibling token. + public JToken Previous + { + get { return _previous; } + internal set { _previous = value; } + } + + /// + /// Gets the path of the JSON token. + /// + public string Path + { + get + { + if (Parent == null) + { + return string.Empty; + } + + IList ancestors = AncestorsAndSelf().Reverse().ToList(); + + List positions = new List(); + for (int i = 0; i < ancestors.Count; i++) + { + JToken current = ancestors[i]; + JToken next = null; + if (i + 1 < ancestors.Count) + { + next = ancestors[i + 1]; + } + else if (ancestors[i].Type == JTokenType.Property) + { + next = ancestors[i]; + } + + if (next != null) + { + switch (current.Type) + { + case JTokenType.Property: + JProperty property = (JProperty)current; + positions.Add(new JsonPosition(JsonContainerType.Object) { PropertyName = property.Name }); + break; + case JTokenType.Array: + case JTokenType.Constructor: + int index = ((IList)current).IndexOf(next); + + positions.Add(new JsonPosition(JsonContainerType.Array) { Position = index }); + break; + } + } + } + + return JsonPosition.BuildPath(positions, null); + } + } + + internal JToken() + { + } + + /// + /// Adds the specified content immediately after this token. + /// + /// A content object that contains simple content or a collection of content objects to be added after this token. + public void AddAfterSelf(object content) + { + if (_parent == null) + { + throw new InvalidOperationException("The parent is missing."); + } + + int index = _parent.IndexOfItem(this); + _parent.AddInternal(index + 1, content, false); + } + + /// + /// Adds the specified content immediately before this token. + /// + /// A content object that contains simple content or a collection of content objects to be added before this token. + public void AddBeforeSelf(object content) + { + if (_parent == null) + { + throw new InvalidOperationException("The parent is missing."); + } + + int index = _parent.IndexOfItem(this); + _parent.AddInternal(index, content, false); + } + + /// + /// Returns a collection of the ancestor tokens of this token. + /// + /// A collection of the ancestor tokens of this token. + public IEnumerable Ancestors() + { + return GetAncestors(false); + } + + /// + /// Returns a collection of tokens that contain this token, and the ancestors of this token. + /// + /// A collection of tokens that contain this token, and the ancestors of this token. + public IEnumerable AncestorsAndSelf() + { + return GetAncestors(true); + } + + internal IEnumerable GetAncestors(bool self) + { + for (JToken current = self ? this : Parent; current != null; current = current.Parent) + { + yield return current; + } + } + + /// + /// Returns a collection of the sibling tokens after this token, in document order. + /// + /// A collection of the sibling tokens after this tokens, in document order. + public IEnumerable AfterSelf() + { + if (Parent == null) + { + yield break; + } + + for (JToken o = Next; o != null; o = o.Next) + { + yield return o; + } + } + + /// + /// Returns a collection of the sibling tokens before this token, in document order. + /// + /// A collection of the sibling tokens before this token, in document order. + public IEnumerable BeforeSelf() + { + for (JToken o = Parent.First; o != this; o = o.Next) + { + yield return o; + } + } + + /// + /// Gets the with the specified key. + /// + /// The with the specified key. + public virtual JToken this[object key] + { + get { throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType())); } + set { throw new InvalidOperationException("Cannot set child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType())); } + } + + /// + /// Gets the with the specified key converted to the specified type. + /// + /// The type to convert the token to. + /// The token key. + /// The converted token value. + public virtual T Value(object key) + { + JToken token = this[key]; + + // null check to fix MonoTouch issue - https://github.com/dolbz/Newtonsoft.Json/commit/a24e3062846b30ee505f3271ac08862bb471b822 + return token == null ? default(T) : Extensions.Convert(token); + } + + /// + /// Get the first child token of this token. + /// + /// A containing the first child token of the . + public virtual JToken First + { + get { throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType())); } + } + + /// + /// Get the last child token of this token. + /// + /// A containing the last child token of the . + public virtual JToken Last + { + get { throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType())); } + } + + /// + /// Returns a collection of the child tokens of this token, in document order. + /// + /// An of containing the child tokens of this , in document order. + public virtual JEnumerable Children() + { + return JEnumerable.Empty; + } + + /// + /// Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + /// + /// The type to filter the child tokens on. + /// A containing the child tokens of this , in document order. + public JEnumerable Children() where T : JToken + { + return new JEnumerable(Children().OfType()); + } + + /// + /// Returns a collection of the child values of this token, in document order. + /// + /// The type to convert the values to. + /// A containing the child values of this , in document order. + public virtual IEnumerable Values() + { + throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType())); + } + + /// + /// Removes this token from its parent. + /// + public void Remove() + { + if (_parent == null) + { + throw new InvalidOperationException("The parent is missing."); + } + + _parent.RemoveItem(this); + } + + /// + /// Replaces this token with the specified token. + /// + /// The value. + public void Replace(JToken value) + { + if (_parent == null) + { + throw new InvalidOperationException("The parent is missing."); + } + + _parent.ReplaceItem(this, value); + } + + /// + /// Writes this token to a . + /// + /// A into which this method will write. + /// A collection of which will be used when writing the token. + public abstract void WriteTo(JsonWriter writer, params JsonConverter[] converters); + + /// + /// Returns the indented JSON for this token. + /// + /// + /// The indented JSON for this token. + /// + public override string ToString() + { + return ToString(Formatting.Indented); + } + + /// + /// Returns the JSON for this token using the given formatting and converters. + /// + /// Indicates how the output is formatted. + /// A collection of which will be used when writing the token. + /// The JSON for this token using the given formatting and converters. + public string ToString(Formatting formatting, params JsonConverter[] converters) + { + using (StringWriter sw = new StringWriter(CultureInfo.InvariantCulture)) + { + JsonTextWriter jw = new JsonTextWriter(sw); + jw.Formatting = formatting; + + WriteTo(jw, converters); + + return sw.ToString(); + } + } + + private static JValue EnsureValue(JToken value) + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (value is JProperty) + { + value = ((JProperty)value).Value; + } + + JValue v = value as JValue; + + return v; + } + + private static string GetType(JToken token) + { + ValidationUtils.ArgumentNotNull(token, nameof(token)); + + if (token is JProperty) + { + token = ((JProperty)token).Value; + } + + return token.Type.ToString(); + } + + private static bool ValidateToken(JToken o, JTokenType[] validTypes, bool nullable) + { + return (Array.IndexOf(validTypes, o.Type) != -1) || (nullable && (o.Type == JTokenType.Null || o.Type == JTokenType.Undefined)); + } + + #region Cast from operators + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator bool(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, BooleanTypes, false)) + { + throw new ArgumentException("Can not convert {0} to Boolean.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return Convert.ToBoolean((int)(BigInteger)v.Value); + } +#endif + + return Convert.ToBoolean(v.Value, CultureInfo.InvariantCulture); + } + +#if !NET20 + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator DateTimeOffset(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, DateTimeTypes, false)) + { + throw new ArgumentException("Can not convert {0} to DateTimeOffset.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + + if (v.Value is DateTimeOffset) + { + return (DateTimeOffset)v.Value; + } + if (v.Value is string) + { + return DateTimeOffset.Parse((string)v.Value, CultureInfo.InvariantCulture); + } + return new DateTimeOffset(Convert.ToDateTime(v.Value, CultureInfo.InvariantCulture)); + } +#endif + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator bool?(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, BooleanTypes, true)) + { + throw new ArgumentException("Can not convert {0} to Boolean.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return Convert.ToBoolean((int)(BigInteger)v.Value); + } +#endif + + return (v.Value != null) ? (bool?)Convert.ToBoolean(v.Value, CultureInfo.InvariantCulture) : null; + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator long(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, false)) + { + throw new ArgumentException("Can not convert {0} to Int64.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (long)(BigInteger)v.Value; + } +#endif + + return Convert.ToInt64(v.Value, CultureInfo.InvariantCulture); + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator DateTime?(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, DateTimeTypes, true)) + { + throw new ArgumentException("Can not convert {0} to DateTime.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !NET20 + if (v.Value is DateTimeOffset) + { + return ((DateTimeOffset)v.Value).DateTime; + } +#endif + + return (v.Value != null) ? (DateTime?)Convert.ToDateTime(v.Value, CultureInfo.InvariantCulture) : null; + } + +#if !NET20 + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator DateTimeOffset?(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, DateTimeTypes, true)) + { + throw new ArgumentException("Can not convert {0} to DateTimeOffset.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + + if (v.Value == null) + { + return null; + } + if (v.Value is DateTimeOffset) + { + return (DateTimeOffset?)v.Value; + } + if (v.Value is string) + { + return DateTimeOffset.Parse((string)v.Value, CultureInfo.InvariantCulture); + } + return new DateTimeOffset(Convert.ToDateTime(v.Value, CultureInfo.InvariantCulture)); + } +#endif + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator decimal?(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, true)) + { + throw new ArgumentException("Can not convert {0} to Decimal.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (decimal?)(BigInteger)v.Value; + } +#endif + + return (v.Value != null) ? (decimal?)Convert.ToDecimal(v.Value, CultureInfo.InvariantCulture) : null; + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator double?(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, true)) + { + throw new ArgumentException("Can not convert {0} to Double.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (double?)(BigInteger)v.Value; + } +#endif + + return (v.Value != null) ? (double?)Convert.ToDouble(v.Value, CultureInfo.InvariantCulture) : null; + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator char?(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, CharTypes, true)) + { + throw new ArgumentException("Can not convert {0} to Char.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (char?)(BigInteger)v.Value; + } +#endif + + return (v.Value != null) ? (char?)Convert.ToChar(v.Value, CultureInfo.InvariantCulture) : null; + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator int(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, false)) + { + throw new ArgumentException("Can not convert {0} to Int32.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (int)(BigInteger)v.Value; + } +#endif + + return Convert.ToInt32(v.Value, CultureInfo.InvariantCulture); + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator short(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, false)) + { + throw new ArgumentException("Can not convert {0} to Int16.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (short)(BigInteger)v.Value; + } +#endif + + return Convert.ToInt16(v.Value, CultureInfo.InvariantCulture); + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + [CLSCompliant(false)] + public static explicit operator ushort(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, false)) + { + throw new ArgumentException("Can not convert {0} to UInt16.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (ushort)(BigInteger)v.Value; + } +#endif + + return Convert.ToUInt16(v.Value, CultureInfo.InvariantCulture); + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + [CLSCompliant(false)] + public static explicit operator char(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, CharTypes, false)) + { + throw new ArgumentException("Can not convert {0} to Char.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (char)(BigInteger)v.Value; + } +#endif + + return Convert.ToChar(v.Value, CultureInfo.InvariantCulture); + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator byte(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, false)) + { + throw new ArgumentException("Can not convert {0} to Byte.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (byte)(BigInteger)v.Value; + } +#endif + + return Convert.ToByte(v.Value, CultureInfo.InvariantCulture); + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + [CLSCompliant(false)] + public static explicit operator sbyte(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, false)) + { + throw new ArgumentException("Can not convert {0} to SByte.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (sbyte)(BigInteger)v.Value; + } +#endif + + return Convert.ToSByte(v.Value, CultureInfo.InvariantCulture); + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator int?(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, true)) + { + throw new ArgumentException("Can not convert {0} to Int32.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (int?)(BigInteger)v.Value; + } +#endif + + return (v.Value != null) ? (int?)Convert.ToInt32(v.Value, CultureInfo.InvariantCulture) : null; + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator short?(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, true)) + { + throw new ArgumentException("Can not convert {0} to Int16.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (short?)(BigInteger)v.Value; + } +#endif + + return (v.Value != null) ? (short?)Convert.ToInt16(v.Value, CultureInfo.InvariantCulture) : null; + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + [CLSCompliant(false)] + public static explicit operator ushort?(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, true)) + { + throw new ArgumentException("Can not convert {0} to UInt16.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (ushort?)(BigInteger)v.Value; + } +#endif + + return (v.Value != null) ? (ushort?)Convert.ToUInt16(v.Value, CultureInfo.InvariantCulture) : null; + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator byte?(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, true)) + { + throw new ArgumentException("Can not convert {0} to Byte.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (byte?)(BigInteger)v.Value; + } +#endif + + return (v.Value != null) ? (byte?)Convert.ToByte(v.Value, CultureInfo.InvariantCulture) : null; + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + [CLSCompliant(false)] + public static explicit operator sbyte?(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, true)) + { + throw new ArgumentException("Can not convert {0} to SByte.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (sbyte?)(BigInteger)v.Value; + } +#endif + + return (v.Value != null) ? (sbyte?)Convert.ToSByte(v.Value, CultureInfo.InvariantCulture) : null; + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator DateTime(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, DateTimeTypes, false)) + { + throw new ArgumentException("Can not convert {0} to DateTime.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !NET20 + if (v.Value is DateTimeOffset) + { + return ((DateTimeOffset)v.Value).DateTime; + } +#endif + + return Convert.ToDateTime(v.Value, CultureInfo.InvariantCulture); + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator long?(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, true)) + { + throw new ArgumentException("Can not convert {0} to Int64.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (long?)(BigInteger)v.Value; + } +#endif + + return (v.Value != null) ? (long?)Convert.ToInt64(v.Value, CultureInfo.InvariantCulture) : null; + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator float?(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, true)) + { + throw new ArgumentException("Can not convert {0} to Single.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (float?)(BigInteger)v.Value; + } +#endif + + return (v.Value != null) ? (float?)Convert.ToSingle(v.Value, CultureInfo.InvariantCulture) : null; + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator decimal(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, false)) + { + throw new ArgumentException("Can not convert {0} to Decimal.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (decimal)(BigInteger)v.Value; + } +#endif + + return Convert.ToDecimal(v.Value, CultureInfo.InvariantCulture); + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + [CLSCompliant(false)] + public static explicit operator uint?(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, true)) + { + throw new ArgumentException("Can not convert {0} to UInt32.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (uint?)(BigInteger)v.Value; + } +#endif + + return (v.Value != null) ? (uint?)Convert.ToUInt32(v.Value, CultureInfo.InvariantCulture) : null; + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + [CLSCompliant(false)] + public static explicit operator ulong?(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, true)) + { + throw new ArgumentException("Can not convert {0} to UInt64.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (ulong?)(BigInteger)v.Value; + } +#endif + + return (v.Value != null) ? (ulong?)Convert.ToUInt64(v.Value, CultureInfo.InvariantCulture) : null; + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator double(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, false)) + { + throw new ArgumentException("Can not convert {0} to Double.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (double)(BigInteger)v.Value; + } +#endif + + return Convert.ToDouble(v.Value, CultureInfo.InvariantCulture); + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator float(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, false)) + { + throw new ArgumentException("Can not convert {0} to Single.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (float)(BigInteger)v.Value; + } +#endif + + return Convert.ToSingle(v.Value, CultureInfo.InvariantCulture); + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator string(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, StringTypes, true)) + { + throw new ArgumentException("Can not convert {0} to String.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + + if (v.Value == null) + { + return null; + } + if (v.Value is byte[]) + { + return Convert.ToBase64String((byte[])v.Value); + } +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return ((BigInteger)v.Value).ToString(CultureInfo.InvariantCulture); + } +#endif + + return Convert.ToString(v.Value, CultureInfo.InvariantCulture); + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + [CLSCompliant(false)] + public static explicit operator uint(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, false)) + { + throw new ArgumentException("Can not convert {0} to UInt32.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (uint)(BigInteger)v.Value; + } +#endif + + return Convert.ToUInt32(v.Value, CultureInfo.InvariantCulture); + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + [CLSCompliant(false)] + public static explicit operator ulong(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, NumberTypes, false)) + { + throw new ArgumentException("Can not convert {0} to UInt64.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return (ulong)(BigInteger)v.Value; + } +#endif + + return Convert.ToUInt64(v.Value, CultureInfo.InvariantCulture); + } + + /// + /// Performs an explicit conversion from to []. + /// + /// The value. + /// The result of the conversion. + public static explicit operator byte[](JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, BytesTypes, false)) + { + throw new ArgumentException("Can not convert {0} to byte array.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + + if (v.Value is string) + { + return Convert.FromBase64String(Convert.ToString(v.Value, CultureInfo.InvariantCulture)); + } +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (v.Value is BigInteger) + { + return ((BigInteger)v.Value).ToByteArray(); + } +#endif + + if (v.Value is byte[]) + { + return (byte[])v.Value; + } + + throw new ArgumentException("Can not convert {0} to byte array.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator Guid(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, GuidTypes, false)) + { + throw new ArgumentException("Can not convert {0} to Guid.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + + if (v.Value is byte[]) + { + return new Guid((byte[])v.Value); + } + + return (v.Value is Guid) ? (Guid)v.Value : new Guid(Convert.ToString(v.Value, CultureInfo.InvariantCulture)); + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator Guid?(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, GuidTypes, true)) + { + throw new ArgumentException("Can not convert {0} to Guid.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + + if (v.Value == null) + { + return null; + } + + if (v.Value is byte[]) + { + return new Guid((byte[])v.Value); + } + + return (v.Value is Guid) ? (Guid)v.Value : new Guid(Convert.ToString(v.Value, CultureInfo.InvariantCulture)); + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator TimeSpan(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, TimeSpanTypes, false)) + { + throw new ArgumentException("Can not convert {0} to TimeSpan.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + + return (v.Value is TimeSpan) ? (TimeSpan)v.Value : ConvertUtils.ParseTimeSpan(Convert.ToString(v.Value, CultureInfo.InvariantCulture)); + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator TimeSpan?(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, TimeSpanTypes, true)) + { + throw new ArgumentException("Can not convert {0} to TimeSpan.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + + if (v.Value == null) + { + return null; + } + + return (v.Value is TimeSpan) ? (TimeSpan)v.Value : ConvertUtils.ParseTimeSpan(Convert.ToString(v.Value, CultureInfo.InvariantCulture)); + } + + /// + /// Performs an explicit conversion from to . + /// + /// The value. + /// The result of the conversion. + public static explicit operator Uri(JToken value) + { + if (value == null) + { + return null; + } + + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, UriTypes, true)) + { + throw new ArgumentException("Can not convert {0} to Uri.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + + if (v.Value == null) + { + return null; + } + + return (v.Value is Uri) ? (Uri)v.Value : new Uri(Convert.ToString(v.Value, CultureInfo.InvariantCulture)); + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + private static BigInteger ToBigInteger(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, BigIntegerTypes, false)) + { + throw new ArgumentException("Can not convert {0} to BigInteger.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + + return ConvertUtils.ToBigInteger(v.Value); + } + + private static BigInteger? ToBigIntegerNullable(JToken value) + { + JValue v = EnsureValue(value); + if (v == null || !ValidateToken(v, BigIntegerTypes, true)) + { + throw new ArgumentException("Can not convert {0} to BigInteger.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); + } + + if (v.Value == null) + { + return null; + } + + return ConvertUtils.ToBigInteger(v.Value); + } +#endif + #endregion + + #region Cast to operators + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(bool value) + { + return new JValue(value); + } + +#if !NET20 + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(DateTimeOffset value) + { + return new JValue(value); + } +#endif + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(byte value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(byte? value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + [CLSCompliant(false)] + public static implicit operator JToken(sbyte value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + [CLSCompliant(false)] + public static implicit operator JToken(sbyte? value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(bool? value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(long value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(DateTime? value) + { + return new JValue(value); + } + +#if !NET20 + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(DateTimeOffset? value) + { + return new JValue(value); + } +#endif + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(decimal? value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(double? value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + [CLSCompliant(false)] + public static implicit operator JToken(short value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + [CLSCompliant(false)] + public static implicit operator JToken(ushort value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(int value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(int? value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(DateTime value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(long? value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(float? value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(decimal value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + [CLSCompliant(false)] + public static implicit operator JToken(short? value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + [CLSCompliant(false)] + public static implicit operator JToken(ushort? value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + [CLSCompliant(false)] + public static implicit operator JToken(uint? value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + [CLSCompliant(false)] + public static implicit operator JToken(ulong? value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(double value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(float value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(string value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + [CLSCompliant(false)] + public static implicit operator JToken(uint value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + [CLSCompliant(false)] + public static implicit operator JToken(ulong value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from [] to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(byte[] value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(Uri value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(TimeSpan value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(TimeSpan? value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(Guid value) + { + return new JValue(value); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The value to create a from. + /// The initialized with the specified value. + public static implicit operator JToken(Guid? value) + { + return new JValue(value); + } + #endregion + + IEnumerator IEnumerable.GetEnumerator() + { + return ((IEnumerable)this).GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return Children().GetEnumerator(); + } + + internal abstract int GetDeepHashCode(); + + IJEnumerable IJEnumerable.this[object key] + { + get { return this[key]; } + } + + /// + /// Creates an for this token. + /// + /// An that can be used to read this token and its descendants. + public JsonReader CreateReader() + { + return new JTokenReader(this, Path); + } + + internal static JToken FromObjectInternal(object o, JsonSerializer jsonSerializer) + { + ValidationUtils.ArgumentNotNull(o, nameof(o)); + ValidationUtils.ArgumentNotNull(jsonSerializer, nameof(jsonSerializer)); + + JToken token; + using (JTokenWriter jsonWriter = new JTokenWriter()) + { + jsonSerializer.Serialize(jsonWriter, o); + token = jsonWriter.Token; + } + + return token; + } + + /// + /// Creates a from an object. + /// + /// The object that will be used to create . + /// A with the value of the specified object + public static JToken FromObject(object o) + { + return FromObjectInternal(o, JsonSerializer.CreateDefault()); + } + + /// + /// Creates a from an object using the specified . + /// + /// The object that will be used to create . + /// The that will be used when reading the object. + /// A with the value of the specified object + public static JToken FromObject(object o, JsonSerializer jsonSerializer) + { + return FromObjectInternal(o, jsonSerializer); + } + + /// + /// Creates the specified .NET type from the . + /// + /// The object type that the token will be deserialized to. + /// The new object created from the JSON value. + public T ToObject() + { + return (T)ToObject(typeof(T)); + } + + /// + /// Creates the specified .NET type from the . + /// + /// The object type that the token will be deserialized to. + /// The new object created from the JSON value. + public object ToObject(Type objectType) + { + if (JsonConvert.DefaultSettings == null) + { + bool isEnum; + PrimitiveTypeCode typeCode = ConvertUtils.GetTypeCode(objectType, out isEnum); + + if (isEnum) + { + if (Type == JTokenType.String) + { + try + { + // use serializer so JsonConverter(typeof(StringEnumConverter)) + EnumMemberAttributes are respected + return ToObject(objectType, JsonSerializer.CreateDefault()); + } + catch (Exception ex) + { + Type enumType = objectType.IsEnum() ? objectType : Nullable.GetUnderlyingType(objectType); + throw new ArgumentException("Could not convert '{0}' to {1}.".FormatWith(CultureInfo.InvariantCulture, (string)this, enumType.Name), ex); + } + } + + if (Type == JTokenType.Integer) + { + Type enumType = objectType.IsEnum() ? objectType : Nullable.GetUnderlyingType(objectType); + return Enum.ToObject(enumType, ((JValue)this).Value); + } + } + + switch (typeCode) + { + case PrimitiveTypeCode.BooleanNullable: + return (bool?)this; + case PrimitiveTypeCode.Boolean: + return (bool)this; + case PrimitiveTypeCode.CharNullable: + return (char?)this; + case PrimitiveTypeCode.Char: + return (char)this; + case PrimitiveTypeCode.SByte: + return (sbyte?)this; + case PrimitiveTypeCode.SByteNullable: + return (sbyte)this; + case PrimitiveTypeCode.ByteNullable: + return (byte?)this; + case PrimitiveTypeCode.Byte: + return (byte)this; + case PrimitiveTypeCode.Int16Nullable: + return (short?)this; + case PrimitiveTypeCode.Int16: + return (short)this; + case PrimitiveTypeCode.UInt16Nullable: + return (ushort?)this; + case PrimitiveTypeCode.UInt16: + return (ushort)this; + case PrimitiveTypeCode.Int32Nullable: + return (int?)this; + case PrimitiveTypeCode.Int32: + return (int)this; + case PrimitiveTypeCode.UInt32Nullable: + return (uint?)this; + case PrimitiveTypeCode.UInt32: + return (uint)this; + case PrimitiveTypeCode.Int64Nullable: + return (long?)this; + case PrimitiveTypeCode.Int64: + return (long)this; + case PrimitiveTypeCode.UInt64Nullable: + return (ulong?)this; + case PrimitiveTypeCode.UInt64: + return (ulong)this; + case PrimitiveTypeCode.SingleNullable: + return (float?)this; + case PrimitiveTypeCode.Single: + return (float)this; + case PrimitiveTypeCode.DoubleNullable: + return (double?)this; + case PrimitiveTypeCode.Double: + return (double)this; + case PrimitiveTypeCode.DecimalNullable: + return (decimal?)this; + case PrimitiveTypeCode.Decimal: + return (decimal)this; + case PrimitiveTypeCode.DateTimeNullable: + return (DateTime?)this; + case PrimitiveTypeCode.DateTime: + return (DateTime)this; +#if !NET20 + case PrimitiveTypeCode.DateTimeOffsetNullable: + return (DateTimeOffset?)this; + case PrimitiveTypeCode.DateTimeOffset: + return (DateTimeOffset)this; +#endif + case PrimitiveTypeCode.String: + return (string)this; + case PrimitiveTypeCode.GuidNullable: + return (Guid?)this; + case PrimitiveTypeCode.Guid: + return (Guid)this; + case PrimitiveTypeCode.Uri: + return (Uri)this; + case PrimitiveTypeCode.TimeSpanNullable: + return (TimeSpan?)this; + case PrimitiveTypeCode.TimeSpan: + return (TimeSpan)this; +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + case PrimitiveTypeCode.BigIntegerNullable: + return ToBigIntegerNullable(this); + case PrimitiveTypeCode.BigInteger: + return ToBigInteger(this); +#endif + } + } + + return ToObject(objectType, JsonSerializer.CreateDefault()); + } + + /// + /// Creates the specified .NET type from the using the specified . + /// + /// The object type that the token will be deserialized to. + /// The that will be used when creating the object. + /// The new object created from the JSON value. + public T ToObject(JsonSerializer jsonSerializer) + { + return (T)ToObject(typeof(T), jsonSerializer); + } + + /// + /// Creates the specified .NET type from the using the specified . + /// + /// The object type that the token will be deserialized to. + /// The that will be used when creating the object. + /// The new object created from the JSON value. + public object ToObject(Type objectType, JsonSerializer jsonSerializer) + { + ValidationUtils.ArgumentNotNull(jsonSerializer, nameof(jsonSerializer)); + + using (JTokenReader jsonReader = new JTokenReader(this)) + { + return jsonSerializer.Deserialize(jsonReader, objectType); + } + } + + /// + /// Creates a from a . + /// + /// An positioned at the token to read into this . + /// + /// An that contains the token and its descendant tokens + /// that were read from the reader. The runtime type of the token is determined + /// by the token type of the first token encountered in the reader. + /// + public static JToken ReadFrom(JsonReader reader) + { + return ReadFrom(reader, null); + } + + /// + /// Creates a from a . + /// + /// An positioned at the token to read into this . + /// The used to load the JSON. + /// If this is null, default load settings will be used. + /// + /// An that contains the token and its descendant tokens + /// that were read from the reader. The runtime type of the token is determined + /// by the token type of the first token encountered in the reader. + /// + public static JToken ReadFrom(JsonReader reader, JsonLoadSettings settings) + { + ValidationUtils.ArgumentNotNull(reader, nameof(reader)); + + if (reader.TokenType == JsonToken.None) + { + bool hasContent = (settings != null && settings.CommentHandling == CommentHandling.Ignore) + ? reader.ReadAndMoveToContent() + : reader.Read(); + + if (!hasContent) + { + throw JsonReaderException.Create(reader, "Error reading JToken from JsonReader."); + } + } + + IJsonLineInfo lineInfo = reader as IJsonLineInfo; + + switch (reader.TokenType) + { + case JsonToken.StartObject: + return JObject.Load(reader, settings); + case JsonToken.StartArray: + return JArray.Load(reader, settings); + case JsonToken.StartConstructor: + return JConstructor.Load(reader, settings); + case JsonToken.PropertyName: + return JProperty.Load(reader, settings); + case JsonToken.String: + case JsonToken.Integer: + case JsonToken.Float: + case JsonToken.Date: + case JsonToken.Boolean: + case JsonToken.Bytes: + JValue v = new JValue(reader.Value); + v.SetLineInfo(lineInfo, settings); + return v; + case JsonToken.Comment: + v = JValue.CreateComment(reader.Value.ToString()); + v.SetLineInfo(lineInfo, settings); + return v; + case JsonToken.Null: + v = JValue.CreateNull(); + v.SetLineInfo(lineInfo, settings); + return v; + case JsonToken.Undefined: + v = JValue.CreateUndefined(); + v.SetLineInfo(lineInfo, settings); + return v; + default: + throw JsonReaderException.Create(reader, "Error reading JToken from JsonReader. Unexpected token: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + } + } + + /// + /// Load a from a string that contains JSON. + /// + /// A that contains JSON. + /// A populated from the string that contains JSON. + public static JToken Parse(string json) + { + return Parse(json, null); + } + + /// + /// Load a from a string that contains JSON. + /// + /// A that contains JSON. + /// The used to load the JSON. + /// If this is null, default load settings will be used. + /// A populated from the string that contains JSON. + public static JToken Parse(string json, JsonLoadSettings settings) + { + using (JsonReader reader = new JsonTextReader(new StringReader(json))) + { + JToken t = Load(reader, settings); + + if (reader.Read() && reader.TokenType != JsonToken.Comment) + { + throw JsonReaderException.Create(reader, "Additional text found in JSON string after parsing content."); + } + + return t; + } + } + + /// + /// Creates a from a . + /// + /// An positioned at the token to read into this . + /// The used to load the JSON. + /// If this is null, default load settings will be used. + /// + /// An that contains the token and its descendant tokens + /// that were read from the reader. The runtime type of the token is determined + /// by the token type of the first token encountered in the reader. + /// + public static JToken Load(JsonReader reader, JsonLoadSettings settings) + { + return ReadFrom(reader, settings); + } + + /// + /// Creates a from a . + /// + /// An positioned at the token to read into this . + /// + /// An that contains the token and its descendant tokens + /// that were read from the reader. The runtime type of the token is determined + /// by the token type of the first token encountered in the reader. + /// + public static JToken Load(JsonReader reader) + { + return Load(reader, null); + } + + internal void SetLineInfo(IJsonLineInfo lineInfo, JsonLoadSettings settings) + { + if (settings != null && settings.LineInfoHandling == LineInfoHandling.Load) + { + return; + } + + if (lineInfo == null || !lineInfo.HasLineInfo()) + { + return; + } + + SetLineInfo(lineInfo.LineNumber, lineInfo.LinePosition); + } + + private class LineInfoAnnotation + { + internal readonly int LineNumber; + internal readonly int LinePosition; + + public LineInfoAnnotation(int lineNumber, int linePosition) + { + LineNumber = lineNumber; + LinePosition = linePosition; + } + } + + internal void SetLineInfo(int lineNumber, int linePosition) + { + AddAnnotation(new LineInfoAnnotation(lineNumber, linePosition)); + } + + bool IJsonLineInfo.HasLineInfo() + { + return (Annotation() != null); + } + + int IJsonLineInfo.LineNumber + { + get + { + LineInfoAnnotation annotation = Annotation(); + if (annotation != null) + { + return annotation.LineNumber; + } + + return 0; + } + } + + int IJsonLineInfo.LinePosition + { + get + { + LineInfoAnnotation annotation = Annotation(); + if (annotation != null) + { + return annotation.LinePosition; + } + + return 0; + } + } + + /// + /// Selects a using a JPath expression. Selects the token that matches the object path. + /// + /// + /// A that contains a JPath expression. + /// + /// A , or null. + public JToken SelectToken(string path) + { + return SelectToken(path, false); + } + + /// + /// Selects a using a JPath expression. Selects the token that matches the object path. + /// + /// + /// A that contains a JPath expression. + /// + /// A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + /// A . + public JToken SelectToken(string path, bool errorWhenNoMatch) + { + JPath p = new JPath(path); + + JToken token = null; + foreach (JToken t in p.Evaluate(this, errorWhenNoMatch)) + { + if (token != null) + { + throw new JsonException("Path returned multiple tokens."); + } + + token = t; + } + + return token; + } + + /// + /// Selects a collection of elements using a JPath expression. + /// + /// + /// A that contains a JPath expression. + /// + /// An that contains the selected elements. + public IEnumerable SelectTokens(string path) + { + return SelectTokens(path, false); + } + + /// + /// Selects a collection of elements using a JPath expression. + /// + /// + /// A that contains a JPath expression. + /// + /// A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + /// An that contains the selected elements. + public IEnumerable SelectTokens(string path, bool errorWhenNoMatch) + { + JPath p = new JPath(path); + return p.Evaluate(this, errorWhenNoMatch); + } + +#if !(NET35 || NET20 || PORTABLE40) + /// + /// Returns the responsible for binding operations performed on this object. + /// + /// The expression tree representation of the runtime value. + /// + /// The to bind this object. + /// + protected virtual DynamicMetaObject GetMetaObject(Expression parameter) + { + return new DynamicProxyMetaObject(parameter, this, new DynamicProxy(), true); + } + + /// + /// Returns the responsible for binding operations performed on this object. + /// + /// The expression tree representation of the runtime value. + /// + /// The to bind this object. + /// + DynamicMetaObject IDynamicMetaObjectProvider.GetMetaObject(Expression parameter) + { + return GetMetaObject(parameter); + } +#endif + +#if !(DOTNET || PORTABLE || PORTABLE40) + object ICloneable.Clone() + { + return DeepClone(); + } +#endif + + /// + /// Creates a new instance of the . All child tokens are recursively cloned. + /// + /// A new instance of the . + public JToken DeepClone() + { + return CloneToken(); + } + + /// + /// Adds an object to the annotation list of this . + /// + /// The annotation to add. + public void AddAnnotation(object annotation) + { + if (annotation == null) + { + throw new ArgumentNullException(nameof(annotation)); + } + + if (_annotations == null) + { + _annotations = (annotation is object[]) ? new[] { annotation } : annotation; + } + else + { + object[] annotations = _annotations as object[]; + if (annotations == null) + { + _annotations = new[] { _annotations, annotation }; + } + else + { + int index = 0; + while (index < annotations.Length && annotations[index] != null) + { + index++; + } + if (index == annotations.Length) + { + Array.Resize(ref annotations, index * 2); + _annotations = annotations; + } + annotations[index] = annotation; + } + } + } + + /// + /// Get the first annotation object of the specified type from this . + /// + /// The type of the annotation to retrieve. + /// The first annotation object that matches the specified type, or null if no annotation is of the specified type. + public T Annotation() where T : class + { + if (_annotations != null) + { + object[] annotations = _annotations as object[]; + if (annotations == null) + { + return (_annotations as T); + } + for (int i = 0; i < annotations.Length; i++) + { + object annotation = annotations[i]; + if (annotation == null) + { + break; + } + + T local = annotation as T; + if (local != null) + { + return local; + } + } + } + + return default(T); + } + + /// + /// Gets the first annotation object of the specified type from this . + /// + /// The of the annotation to retrieve. + /// The first annotation object that matches the specified type, or null if no annotation is of the specified type. + public object Annotation(Type type) + { + if (type == null) + { + throw new ArgumentNullException(nameof(type)); + } + + if (_annotations != null) + { + object[] annotations = _annotations as object[]; + if (annotations == null) + { + if (type.IsInstanceOfType(_annotations)) + { + return _annotations; + } + } + else + { + for (int i = 0; i < annotations.Length; i++) + { + object o = annotations[i]; + if (o == null) + { + break; + } + + if (type.IsInstanceOfType(o)) + { + return o; + } + } + } + } + + return null; + } + + /// + /// Gets a collection of annotations of the specified type for this . + /// + /// The type of the annotations to retrieve. + /// An that contains the annotations for this . + public IEnumerable Annotations() where T : class + { + if (_annotations == null) + { + yield break; + } + + object[] annotations = _annotations as object[]; + if (annotations != null) + { + for (int i = 0; i < annotations.Length; i++) + { + object o = annotations[i]; + if (o == null) + { + break; + } + + T casted = o as T; + if (casted != null) + { + yield return casted; + } + } + yield break; + } + + T annotation = _annotations as T; + if (annotation == null) + { + yield break; + } + + yield return annotation; + } + + /// + /// Gets a collection of annotations of the specified type for this . + /// + /// The of the annotations to retrieve. + /// An of that contains the annotations that match the specified type for this . + public IEnumerable Annotations(Type type) + { + if (type == null) + { + throw new ArgumentNullException(nameof(type)); + } + + if (_annotations == null) + { + yield break; + } + + object[] annotations = _annotations as object[]; + if (annotations != null) + { + for (int i = 0; i < annotations.Length; i++) + { + object o = annotations[i]; + if (o == null) + { + break; + } + + if (type.IsInstanceOfType(o)) + { + yield return o; + } + } + yield break; + } + + if (!type.IsInstanceOfType(_annotations)) + { + yield break; + } + + yield return _annotations; + } + + /// + /// Removes the annotations of the specified type from this . + /// + /// The type of annotations to remove. + public void RemoveAnnotations() where T : class + { + if (_annotations != null) + { + object[] annotations = _annotations as object[]; + if (annotations == null) + { + if (_annotations is T) + { + _annotations = null; + } + } + else + { + int index = 0; + int keepCount = 0; + while (index < annotations.Length) + { + object obj2 = annotations[index]; + if (obj2 == null) + { + break; + } + + if (!(obj2 is T)) + { + annotations[keepCount++] = obj2; + } + + index++; + } + + if (keepCount != 0) + { + while (keepCount < index) + { + annotations[keepCount++] = null; + } + } + else + { + _annotations = null; + } + } + } + } + + /// + /// Removes the annotations of the specified type from this . + /// + /// The of annotations to remove. + public void RemoveAnnotations(Type type) + { + if (type == null) + { + throw new ArgumentNullException(nameof(type)); + } + + if (_annotations != null) + { + object[] annotations = _annotations as object[]; + if (annotations == null) + { + if (type.IsInstanceOfType(_annotations)) + { + _annotations = null; + } + } + else + { + int index = 0; + int keepCount = 0; + while (index < annotations.Length) + { + object o = annotations[index]; + if (o == null) + { + break; + } + + if (!type.IsInstanceOfType(o)) + { + annotations[keepCount++] = o; + } + + index++; + } + + if (keepCount != 0) + { + while (keepCount < index) + { + annotations[keepCount++] = null; + } + } + else + { + _annotations = null; + } + } + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JTokenEqualityComparer.cs b/Common/00-1Json8.3/Json8.3/Linq/JTokenEqualityComparer.cs new file mode 100644 index 0000000..fd10537 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JTokenEqualityComparer.cs @@ -0,0 +1,64 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System.Collections.Generic; + +namespace Newtonsoft.Json.Linq +{ + /// + /// Compares tokens to determine whether they are equal. + /// + public class JTokenEqualityComparer : IEqualityComparer + { + /// + /// Determines whether the specified objects are equal. + /// + /// The first object of type to compare. + /// The second object of type to compare. + /// + /// true if the specified objects are equal; otherwise, false. + /// + public bool Equals(JToken x, JToken y) + { + return JToken.DeepEquals(x, y); + } + + /// + /// Returns a hash code for the specified object. + /// + /// The for which a hash code is to be returned. + /// A hash code for the specified object. + /// The type of is a reference type and is null. + public int GetHashCode(JToken obj) + { + if (obj == null) + { + return 0; + } + + return obj.GetDeepHashCode(); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JTokenReader.cs b/Common/00-1Json8.3/Json8.3/Linq/JTokenReader.cs new file mode 100644 index 0000000..5f0ca87 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JTokenReader.cs @@ -0,0 +1,330 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Linq +{ + /// + /// Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + /// + public class JTokenReader : JsonReader, IJsonLineInfo + { + private readonly string _initialPath; + private readonly JToken _root; + private JToken _parent; + private JToken _current; + + /// + /// Gets the at the reader's current position. + /// + public JToken CurrentToken + { + get { return _current; } + } + + /// + /// Initializes a new instance of the class. + /// + /// The token to read from. + public JTokenReader(JToken token) + { + ValidationUtils.ArgumentNotNull(token, nameof(token)); + + _root = token; + } + + internal JTokenReader(JToken token, string initialPath) + : this(token) + { + _initialPath = initialPath; + } + + /// + /// Reads the next JSON token from the stream. + /// + /// + /// true if the next token was read successfully; false if there are no more tokens to read. + /// + public override bool Read() + { + if (CurrentState != State.Start) + { + if (_current == null) + { + return false; + } + + JContainer container = _current as JContainer; + if (container != null && _parent != container) + { + return ReadInto(container); + } + else + { + return ReadOver(_current); + } + } + + _current = _root; + SetToken(_current); + return true; + } + + private bool ReadOver(JToken t) + { + if (t == _root) + { + return ReadToEnd(); + } + + JToken next = t.Next; + if ((next == null || next == t) || t == t.Parent.Last) + { + if (t.Parent == null) + { + return ReadToEnd(); + } + + return SetEnd(t.Parent); + } + else + { + _current = next; + SetToken(_current); + return true; + } + } + + private bool ReadToEnd() + { + _current = null; + SetToken(JsonToken.None); + return false; + } + + private JsonToken? GetEndToken(JContainer c) + { + switch (c.Type) + { + case JTokenType.Object: + return JsonToken.EndObject; + case JTokenType.Array: + return JsonToken.EndArray; + case JTokenType.Constructor: + return JsonToken.EndConstructor; + case JTokenType.Property: + return null; + default: + throw MiscellaneousUtils.CreateArgumentOutOfRangeException("Type", c.Type, "Unexpected JContainer type."); + } + } + + private bool ReadInto(JContainer c) + { + JToken firstChild = c.First; + if (firstChild == null) + { + return SetEnd(c); + } + else + { + SetToken(firstChild); + _current = firstChild; + _parent = c; + return true; + } + } + + private bool SetEnd(JContainer c) + { + JsonToken? endToken = GetEndToken(c); + if (endToken != null) + { + SetToken(endToken.GetValueOrDefault()); + _current = c; + _parent = c; + return true; + } + else + { + return ReadOver(c); + } + } + + private void SetToken(JToken token) + { + switch (token.Type) + { + case JTokenType.Object: + SetToken(JsonToken.StartObject); + break; + case JTokenType.Array: + SetToken(JsonToken.StartArray); + break; + case JTokenType.Constructor: + SetToken(JsonToken.StartConstructor, ((JConstructor)token).Name); + break; + case JTokenType.Property: + SetToken(JsonToken.PropertyName, ((JProperty)token).Name); + break; + case JTokenType.Comment: + SetToken(JsonToken.Comment, ((JValue)token).Value); + break; + case JTokenType.Integer: + SetToken(JsonToken.Integer, ((JValue)token).Value); + break; + case JTokenType.Float: + SetToken(JsonToken.Float, ((JValue)token).Value); + break; + case JTokenType.String: + SetToken(JsonToken.String, ((JValue)token).Value); + break; + case JTokenType.Boolean: + SetToken(JsonToken.Boolean, ((JValue)token).Value); + break; + case JTokenType.Null: + SetToken(JsonToken.Null, ((JValue)token).Value); + break; + case JTokenType.Undefined: + SetToken(JsonToken.Undefined, ((JValue)token).Value); + break; + case JTokenType.Date: + SetToken(JsonToken.Date, ((JValue)token).Value); + break; + case JTokenType.Raw: + SetToken(JsonToken.Raw, ((JValue)token).Value); + break; + case JTokenType.Bytes: + SetToken(JsonToken.Bytes, ((JValue)token).Value); + break; + case JTokenType.Guid: + SetToken(JsonToken.String, SafeToString(((JValue)token).Value)); + break; + case JTokenType.Uri: + object v = ((JValue)token).Value; + if (v is Uri) + { + SetToken(JsonToken.String, ((Uri)v).OriginalString); + } + else + { + SetToken(JsonToken.String, SafeToString(v)); + } + break; + case JTokenType.TimeSpan: + SetToken(JsonToken.String, SafeToString(((JValue)token).Value)); + break; + default: + throw MiscellaneousUtils.CreateArgumentOutOfRangeException("Type", token.Type, "Unexpected JTokenType."); + } + } + + private string SafeToString(object value) + { + return (value != null) ? value.ToString() : null; + } + + bool IJsonLineInfo.HasLineInfo() + { + if (CurrentState == State.Start) + { + return false; + } + + IJsonLineInfo info = _current; + return (info != null && info.HasLineInfo()); + } + + int IJsonLineInfo.LineNumber + { + get + { + if (CurrentState == State.Start) + { + return 0; + } + + IJsonLineInfo info = _current; + if (info != null) + { + return info.LineNumber; + } + + return 0; + } + } + + int IJsonLineInfo.LinePosition + { + get + { + if (CurrentState == State.Start) + { + return 0; + } + + IJsonLineInfo info = _current; + if (info != null) + { + return info.LinePosition; + } + + return 0; + } + } + + /// + /// Gets the path of the current JSON token. + /// + public override string Path + { + get + { + string path = base.Path; + + if (!string.IsNullOrEmpty(_initialPath)) + { + if (string.IsNullOrEmpty(path)) + { + return _initialPath; + } + + if (path.StartsWith('[')) + { + path = _initialPath + path; + } + else + { + path = _initialPath + "." + path; + } + } + + return path; + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JTokenType.cs b/Common/00-1Json8.3/Json8.3/Linq/JTokenType.cs new file mode 100644 index 0000000..3691873 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JTokenType.cs @@ -0,0 +1,123 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +namespace Newtonsoft.Json.Linq +{ + /// + /// Specifies the type of token. + /// + public enum JTokenType + { + /// + /// No token type has been set. + /// + None = 0, + + /// + /// A JSON object. + /// + Object = 1, + + /// + /// A JSON array. + /// + Array = 2, + + /// + /// A JSON constructor. + /// + Constructor = 3, + + /// + /// A JSON object property. + /// + Property = 4, + + /// + /// A comment. + /// + Comment = 5, + + /// + /// An integer value. + /// + Integer = 6, + + /// + /// A float value. + /// + Float = 7, + + /// + /// A string value. + /// + String = 8, + + /// + /// A boolean value. + /// + Boolean = 9, + + /// + /// A null value. + /// + Null = 10, + + /// + /// An undefined value. + /// + Undefined = 11, + + /// + /// A date value. + /// + Date = 12, + + /// + /// A raw JSON value. + /// + Raw = 13, + + /// + /// A collection of bytes value. + /// + Bytes = 14, + + /// + /// A Guid value. + /// + Guid = 15, + + /// + /// A Uri value. + /// + Uri = 16, + + /// + /// A TimeSpan value. + /// + TimeSpan = 17 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JTokenWriter.cs b/Common/00-1Json8.3/Json8.3/Linq/JTokenWriter.cs new file mode 100644 index 0000000..0331850 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JTokenWriter.cs @@ -0,0 +1,489 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Globalization; +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) +using System.Numerics; +#endif +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Linq +{ + /// + /// Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + /// + public class JTokenWriter : JsonWriter + { + private JContainer _token; + private JContainer _parent; + // used when writer is writing single value and the value has no containing parent + private JValue _value; + private JToken _current; + + /// + /// Gets the at the writer's current position. + /// + public JToken CurrentToken + { + get { return _current; } + } + + /// + /// Gets the token being writen. + /// + /// The token being writen. + public JToken Token + { + get + { + if (_token != null) + { + return _token; + } + + return _value; + } + } + + /// + /// Initializes a new instance of the class writing to the given . + /// + /// The container being written to. + public JTokenWriter(JContainer container) + { + ValidationUtils.ArgumentNotNull(container, nameof(container)); + + _token = container; + _parent = container; + } + + /// + /// Initializes a new instance of the class. + /// + public JTokenWriter() + { + } + + /// + /// Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + /// + public override void Flush() + { + } + + /// + /// Closes this stream and the underlying stream. + /// + public override void Close() + { + base.Close(); + } + + /// + /// Writes the beginning of a JSON object. + /// + public override void WriteStartObject() + { + base.WriteStartObject(); + + AddParent(new JObject()); + } + + private void AddParent(JContainer container) + { + if (_parent == null) + { + _token = container; + } + else + { + _parent.AddAndSkipParentCheck(container); + } + + _parent = container; + _current = container; + } + + private void RemoveParent() + { + _current = _parent; + _parent = _parent.Parent; + + if (_parent != null && _parent.Type == JTokenType.Property) + { + _parent = _parent.Parent; + } + } + + /// + /// Writes the beginning of a JSON array. + /// + public override void WriteStartArray() + { + base.WriteStartArray(); + + AddParent(new JArray()); + } + + /// + /// Writes the start of a constructor with the given name. + /// + /// The name of the constructor. + public override void WriteStartConstructor(string name) + { + base.WriteStartConstructor(name); + + AddParent(new JConstructor(name)); + } + + /// + /// Writes the end. + /// + /// The token. + protected override void WriteEnd(JsonToken token) + { + RemoveParent(); + } + + /// + /// Writes the property name of a name/value pair on a JSON object. + /// + /// The name of the property. + public override void WritePropertyName(string name) + { + JObject o = _parent as JObject; + if (o != null) + { + // avoid duplicate property name exception + // last property name wins + o.Remove(name); + } + + AddParent(new JProperty(name)); + + // don't set state until after in case of an error + // incorrect state will cause issues if writer is disposed when closing open properties + base.WritePropertyName(name); + } + + private void AddValue(object value, JsonToken token) + { + AddValue(new JValue(value), token); + } + + internal void AddValue(JValue value, JsonToken token) + { + if (_parent != null) + { + _parent.Add(value); + _current = _parent.Last; + + if (_parent.Type == JTokenType.Property) + { + _parent = _parent.Parent; + } + } + else + { + _value = value ?? JValue.CreateNull(); + _current = _value; + } + } + + #region WriteValue methods + /// + /// Writes a value. + /// An error will raised if the value cannot be written as a single JSON token. + /// + /// The value to write. + public override void WriteValue(object value) + { +#if !(NET20 || NET35 || PORTABLE || PORTABLE40) + if (value is BigInteger) + { + InternalWriteValue(JsonToken.Integer); + AddValue(value, JsonToken.Integer); + } + else +#endif + { + base.WriteValue(value); + } + } + + /// + /// Writes a null value. + /// + public override void WriteNull() + { + base.WriteNull(); + AddValue(null, JsonToken.Null); + } + + /// + /// Writes an undefined value. + /// + public override void WriteUndefined() + { + base.WriteUndefined(); + AddValue(null, JsonToken.Undefined); + } + + /// + /// Writes raw JSON. + /// + /// The raw JSON to write. + public override void WriteRaw(string json) + { + base.WriteRaw(json); + AddValue(new JRaw(json), JsonToken.Raw); + } + + /// + /// Writes out a comment /*...*/ containing the specified text. + /// + /// Text to place inside the comment. + public override void WriteComment(string text) + { + base.WriteComment(text); + AddValue(JValue.CreateComment(text), JsonToken.Comment); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(string value) + { + base.WriteValue(value); + AddValue(value, JsonToken.String); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(int value) + { + base.WriteValue(value); + AddValue(value, JsonToken.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public override void WriteValue(uint value) + { + base.WriteValue(value); + AddValue(value, JsonToken.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(long value) + { + base.WriteValue(value); + AddValue(value, JsonToken.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public override void WriteValue(ulong value) + { + base.WriteValue(value); + AddValue(value, JsonToken.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(float value) + { + base.WriteValue(value); + AddValue(value, JsonToken.Float); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(double value) + { + base.WriteValue(value); + AddValue(value, JsonToken.Float); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(bool value) + { + base.WriteValue(value); + AddValue(value, JsonToken.Boolean); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(short value) + { + base.WriteValue(value); + AddValue(value, JsonToken.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public override void WriteValue(ushort value) + { + base.WriteValue(value); + AddValue(value, JsonToken.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(char value) + { + base.WriteValue(value); + string s = null; +#if !(DOTNET || PORTABLE40 || PORTABLE) + s = value.ToString(CultureInfo.InvariantCulture); +#else + s = value.ToString(); +#endif + AddValue(s, JsonToken.String); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(byte value) + { + base.WriteValue(value); + AddValue(value, JsonToken.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + [CLSCompliant(false)] + public override void WriteValue(sbyte value) + { + base.WriteValue(value); + AddValue(value, JsonToken.Integer); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(decimal value) + { + base.WriteValue(value); + AddValue(value, JsonToken.Float); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(DateTime value) + { + base.WriteValue(value); + value = DateTimeUtils.EnsureDateTime(value, DateTimeZoneHandling); + AddValue(value, JsonToken.Date); + } + +#if !NET20 + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(DateTimeOffset value) + { + base.WriteValue(value); + AddValue(value, JsonToken.Date); + } +#endif + + /// + /// Writes a [] value. + /// + /// The [] value to write. + public override void WriteValue(byte[] value) + { + base.WriteValue(value); + AddValue(value, JsonToken.Bytes); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(TimeSpan value) + { + base.WriteValue(value); + AddValue(value, JsonToken.String); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(Guid value) + { + base.WriteValue(value); + AddValue(value, JsonToken.String); + } + + /// + /// Writes a value. + /// + /// The value to write. + public override void WriteValue(Uri value) + { + base.WriteValue(value); + AddValue(value, JsonToken.String); + } + #endregion + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JValue.cs b/Common/00-1Json8.3/Json8.3/Linq/JValue.cs new file mode 100644 index 0000000..8dd1297 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JValue.cs @@ -0,0 +1,1186 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using Newtonsoft.Json.Utilities; +using System.Globalization; +#if !(NET35 || NET20 || PORTABLE40) +using System.Dynamic; +using System.Linq.Expressions; +#endif +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) +using System.Numerics; + +#endif + +namespace Newtonsoft.Json.Linq +{ + /// + /// Represents a value in JSON (string, integer, date, etc). + /// + public class JValue : JToken, IEquatable, IFormattable, IComparable, IComparable +#if !PORTABLE + , IConvertible +#endif + { + private JTokenType _valueType; + private object _value; + + internal JValue(object value, JTokenType type) + { + _value = value; + _valueType = type; + } + + /// + /// Initializes a new instance of the class from another object. + /// + /// A object to copy from. + public JValue(JValue other) + : this(other.Value, other.Type) + { + } + + /// + /// Initializes a new instance of the class with the given value. + /// + /// The value. + public JValue(long value) + : this(value, JTokenType.Integer) + { + } + + /// + /// Initializes a new instance of the class with the given value. + /// + /// The value. + public JValue(decimal value) + : this(value, JTokenType.Float) + { + } + + /// + /// Initializes a new instance of the class with the given value. + /// + /// The value. + public JValue(char value) + : this(value, JTokenType.String) + { + } + + /// + /// Initializes a new instance of the class with the given value. + /// + /// The value. + [CLSCompliant(false)] + public JValue(ulong value) + : this(value, JTokenType.Integer) + { + } + + /// + /// Initializes a new instance of the class with the given value. + /// + /// The value. + public JValue(double value) + : this(value, JTokenType.Float) + { + } + + /// + /// Initializes a new instance of the class with the given value. + /// + /// The value. + public JValue(float value) + : this(value, JTokenType.Float) + { + } + + /// + /// Initializes a new instance of the class with the given value. + /// + /// The value. + public JValue(DateTime value) + : this(value, JTokenType.Date) + { + } + +#if !NET20 + /// + /// Initializes a new instance of the class with the given value. + /// + /// The value. + public JValue(DateTimeOffset value) + : this(value, JTokenType.Date) + { + } +#endif + + /// + /// Initializes a new instance of the class with the given value. + /// + /// The value. + public JValue(bool value) + : this(value, JTokenType.Boolean) + { + } + + /// + /// Initializes a new instance of the class with the given value. + /// + /// The value. + public JValue(string value) + : this(value, JTokenType.String) + { + } + + /// + /// Initializes a new instance of the class with the given value. + /// + /// The value. + public JValue(Guid value) + : this(value, JTokenType.Guid) + { + } + + /// + /// Initializes a new instance of the class with the given value. + /// + /// The value. + public JValue(Uri value) + : this(value, (value != null) ? JTokenType.Uri : JTokenType.Null) + { + } + + /// + /// Initializes a new instance of the class with the given value. + /// + /// The value. + public JValue(TimeSpan value) + : this(value, JTokenType.TimeSpan) + { + } + + /// + /// Initializes a new instance of the class with the given value. + /// + /// The value. + public JValue(object value) + : this(value, GetValueType(null, value)) + { + } + + internal override bool DeepEquals(JToken node) + { + JValue other = node as JValue; + if (other == null) + { + return false; + } + if (other == this) + { + return true; + } + + return ValuesEquals(this, other); + } + + /// + /// Gets a value indicating whether this token has child tokens. + /// + /// + /// true if this token has child values; otherwise, false. + /// + public override bool HasValues + { + get { return false; } + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + private static int CompareBigInteger(BigInteger i1, object i2) + { + int result = i1.CompareTo(ConvertUtils.ToBigInteger(i2)); + + if (result != 0) + { + return result; + } + + // converting a fractional number to a BigInteger will lose the fraction + // check for fraction if result is two numbers are equal + if (i2 is decimal) + { + decimal d = (decimal)i2; + return (0m).CompareTo(Math.Abs(d - Math.Truncate(d))); + } + else if (i2 is double || i2 is float) + { + double d = Convert.ToDouble(i2, CultureInfo.InvariantCulture); + return (0d).CompareTo(Math.Abs(d - Math.Truncate(d))); + } + + return result; + } +#endif + + internal static int Compare(JTokenType valueType, object objA, object objB) + { + if (objA == null && objB == null) + { + return 0; + } + if (objA != null && objB == null) + { + return 1; + } + if (objA == null && objB != null) + { + return -1; + } + + switch (valueType) + { + case JTokenType.Integer: +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (objA is BigInteger) + { + return CompareBigInteger((BigInteger)objA, objB); + } + if (objB is BigInteger) + { + return -CompareBigInteger((BigInteger)objB, objA); + } +#endif + if (objA is ulong || objB is ulong || objA is decimal || objB is decimal) + { + return Convert.ToDecimal(objA, CultureInfo.InvariantCulture).CompareTo(Convert.ToDecimal(objB, CultureInfo.InvariantCulture)); + } + else if (objA is float || objB is float || objA is double || objB is double) + { + return CompareFloat(objA, objB); + } + else + { + return Convert.ToInt64(objA, CultureInfo.InvariantCulture).CompareTo(Convert.ToInt64(objB, CultureInfo.InvariantCulture)); + } + case JTokenType.Float: +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (objA is BigInteger) + { + return CompareBigInteger((BigInteger)objA, objB); + } + if (objB is BigInteger) + { + return -CompareBigInteger((BigInteger)objB, objA); + } +#endif + return CompareFloat(objA, objB); + case JTokenType.Comment: + case JTokenType.String: + case JTokenType.Raw: + string s1 = Convert.ToString(objA, CultureInfo.InvariantCulture); + string s2 = Convert.ToString(objB, CultureInfo.InvariantCulture); + + return string.CompareOrdinal(s1, s2); + case JTokenType.Boolean: + bool b1 = Convert.ToBoolean(objA, CultureInfo.InvariantCulture); + bool b2 = Convert.ToBoolean(objB, CultureInfo.InvariantCulture); + + return b1.CompareTo(b2); + case JTokenType.Date: +#if !NET20 + if (objA is DateTime) + { +#endif + DateTime date1 = (DateTime)objA; + DateTime date2; + +#if !NET20 + if (objB is DateTimeOffset) + { + date2 = ((DateTimeOffset)objB).DateTime; + } + else +#endif + { + date2 = Convert.ToDateTime(objB, CultureInfo.InvariantCulture); + } + + return date1.CompareTo(date2); +#if !NET20 + } + else + { + DateTimeOffset date1 = (DateTimeOffset)objA; + DateTimeOffset date2; + + if (objB is DateTimeOffset) + { + date2 = (DateTimeOffset)objB; + } + else + { + date2 = new DateTimeOffset(Convert.ToDateTime(objB, CultureInfo.InvariantCulture)); + } + + return date1.CompareTo(date2); + } +#endif + case JTokenType.Bytes: + if (!(objB is byte[])) + { + throw new ArgumentException("Object must be of type byte[]."); + } + + byte[] bytes1 = objA as byte[]; + byte[] bytes2 = objB as byte[]; + if (bytes1 == null) + { + return -1; + } + if (bytes2 == null) + { + return 1; + } + + return MiscellaneousUtils.ByteArrayCompare(bytes1, bytes2); + case JTokenType.Guid: + if (!(objB is Guid)) + { + throw new ArgumentException("Object must be of type Guid."); + } + + Guid guid1 = (Guid)objA; + Guid guid2 = (Guid)objB; + + return guid1.CompareTo(guid2); + case JTokenType.Uri: + if (!(objB is Uri)) + { + throw new ArgumentException("Object must be of type Uri."); + } + + Uri uri1 = (Uri)objA; + Uri uri2 = (Uri)objB; + + return Comparer.Default.Compare(uri1.ToString(), uri2.ToString()); + case JTokenType.TimeSpan: + if (!(objB is TimeSpan)) + { + throw new ArgumentException("Object must be of type TimeSpan."); + } + + TimeSpan ts1 = (TimeSpan)objA; + TimeSpan ts2 = (TimeSpan)objB; + + return ts1.CompareTo(ts2); + default: + throw MiscellaneousUtils.CreateArgumentOutOfRangeException("valueType", valueType, "Unexpected value type: {0}".FormatWith(CultureInfo.InvariantCulture, valueType)); + } + } + + private static int CompareFloat(object objA, object objB) + { + double d1 = Convert.ToDouble(objA, CultureInfo.InvariantCulture); + double d2 = Convert.ToDouble(objB, CultureInfo.InvariantCulture); + + // take into account possible floating point errors + if (MathUtils.ApproxEquals(d1, d2)) + { + return 0; + } + + return d1.CompareTo(d2); + } + +#if !(NET35 || NET20 || PORTABLE40) + private static bool Operation(ExpressionType operation, object objA, object objB, out object result) + { + if (objA is string || objB is string) + { + if (operation == ExpressionType.Add || operation == ExpressionType.AddAssign) + { + result = ((objA != null) ? objA.ToString() : null) + ((objB != null) ? objB.ToString() : null); + return true; + } + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (objA is BigInteger || objB is BigInteger) + { + if (objA == null || objB == null) + { + result = null; + return true; + } + + // not that this will lose the fraction + // BigInteger doesn't have operators with non-integer types + BigInteger i1 = ConvertUtils.ToBigInteger(objA); + BigInteger i2 = ConvertUtils.ToBigInteger(objB); + + switch (operation) + { + case ExpressionType.Add: + case ExpressionType.AddAssign: + result = i1 + i2; + return true; + case ExpressionType.Subtract: + case ExpressionType.SubtractAssign: + result = i1 - i2; + return true; + case ExpressionType.Multiply: + case ExpressionType.MultiplyAssign: + result = i1 * i2; + return true; + case ExpressionType.Divide: + case ExpressionType.DivideAssign: + result = i1 / i2; + return true; + } + } + else +#endif + if (objA is ulong || objB is ulong || objA is decimal || objB is decimal) + { + if (objA == null || objB == null) + { + result = null; + return true; + } + + decimal d1 = Convert.ToDecimal(objA, CultureInfo.InvariantCulture); + decimal d2 = Convert.ToDecimal(objB, CultureInfo.InvariantCulture); + + switch (operation) + { + case ExpressionType.Add: + case ExpressionType.AddAssign: + result = d1 + d2; + return true; + case ExpressionType.Subtract: + case ExpressionType.SubtractAssign: + result = d1 - d2; + return true; + case ExpressionType.Multiply: + case ExpressionType.MultiplyAssign: + result = d1 * d2; + return true; + case ExpressionType.Divide: + case ExpressionType.DivideAssign: + result = d1 / d2; + return true; + } + } + else if (objA is float || objB is float || objA is double || objB is double) + { + if (objA == null || objB == null) + { + result = null; + return true; + } + + double d1 = Convert.ToDouble(objA, CultureInfo.InvariantCulture); + double d2 = Convert.ToDouble(objB, CultureInfo.InvariantCulture); + + switch (operation) + { + case ExpressionType.Add: + case ExpressionType.AddAssign: + result = d1 + d2; + return true; + case ExpressionType.Subtract: + case ExpressionType.SubtractAssign: + result = d1 - d2; + return true; + case ExpressionType.Multiply: + case ExpressionType.MultiplyAssign: + result = d1 * d2; + return true; + case ExpressionType.Divide: + case ExpressionType.DivideAssign: + result = d1 / d2; + return true; + } + } + else if (objA is int || objA is uint || objA is long || objA is short || objA is ushort || objA is sbyte || objA is byte || + objB is int || objB is uint || objB is long || objB is short || objB is ushort || objB is sbyte || objB is byte) + { + if (objA == null || objB == null) + { + result = null; + return true; + } + + long l1 = Convert.ToInt64(objA, CultureInfo.InvariantCulture); + long l2 = Convert.ToInt64(objB, CultureInfo.InvariantCulture); + + switch (operation) + { + case ExpressionType.Add: + case ExpressionType.AddAssign: + result = l1 + l2; + return true; + case ExpressionType.Subtract: + case ExpressionType.SubtractAssign: + result = l1 - l2; + return true; + case ExpressionType.Multiply: + case ExpressionType.MultiplyAssign: + result = l1 * l2; + return true; + case ExpressionType.Divide: + case ExpressionType.DivideAssign: + result = l1 / l2; + return true; + } + } + + result = null; + return false; + } +#endif + + internal override JToken CloneToken() + { + return new JValue(this); + } + + /// + /// Creates a comment with the given value. + /// + /// The value. + /// A comment with the given value. + public static JValue CreateComment(string value) + { + return new JValue(value, JTokenType.Comment); + } + + /// + /// Creates a string with the given value. + /// + /// The value. + /// A string with the given value. + public static JValue CreateString(string value) + { + return new JValue(value, JTokenType.String); + } + + /// + /// Creates a null value. + /// + /// A null value. + public static JValue CreateNull() + { + return new JValue(null, JTokenType.Null); + } + + /// + /// Creates a undefined value. + /// + /// A undefined value. + public static JValue CreateUndefined() + { + return new JValue(null, JTokenType.Undefined); + } + + private static JTokenType GetValueType(JTokenType? current, object value) + { + if (value == null) + { + return JTokenType.Null; + } +#if !(DOTNET || PORTABLE40 || PORTABLE) + else if (value == DBNull.Value) + { + return JTokenType.Null; + } +#endif + else if (value is string) + { + return GetStringValueType(current); + } + else if (value is long || value is int || value is short || value is sbyte + || value is ulong || value is uint || value is ushort || value is byte) + { + return JTokenType.Integer; + } + else if (value is Enum) + { + return JTokenType.Integer; + } +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + else if (value is BigInteger) + { + return JTokenType.Integer; + } +#endif + else if (value is double || value is float || value is decimal) + { + return JTokenType.Float; + } + else if (value is DateTime) + { + return JTokenType.Date; + } +#if !NET20 + else if (value is DateTimeOffset) + { + return JTokenType.Date; + } +#endif + else if (value is byte[]) + { + return JTokenType.Bytes; + } + else if (value is bool) + { + return JTokenType.Boolean; + } + else if (value is Guid) + { + return JTokenType.Guid; + } + else if (value is Uri) + { + return JTokenType.Uri; + } + else if (value is TimeSpan) + { + return JTokenType.TimeSpan; + } + + throw new ArgumentException("Could not determine JSON object type for type {0}.".FormatWith(CultureInfo.InvariantCulture, value.GetType())); + } + + private static JTokenType GetStringValueType(JTokenType? current) + { + if (current == null) + { + return JTokenType.String; + } + + switch (current.GetValueOrDefault()) + { + case JTokenType.Comment: + case JTokenType.String: + case JTokenType.Raw: + return current.GetValueOrDefault(); + default: + return JTokenType.String; + } + } + + /// + /// Gets the node type for this . + /// + /// The type. + public override JTokenType Type + { + get { return _valueType; } + } + + /// + /// Gets or sets the underlying token value. + /// + /// The underlying token value. + public object Value + { + get { return _value; } + set + { + Type currentType = (_value != null) ? _value.GetType() : null; + Type newType = (value != null) ? value.GetType() : null; + + if (currentType != newType) + { + _valueType = GetValueType(_valueType, value); + } + + _value = value; + } + } + + /// + /// Writes this token to a . + /// + /// A into which this method will write. + /// A collection of which will be used when writing the token. + public override void WriteTo(JsonWriter writer, params JsonConverter[] converters) + { + if (converters != null && converters.Length > 0 && _value != null) + { + JsonConverter matchingConverter = JsonSerializer.GetMatchingConverter(converters, _value.GetType()); + if (matchingConverter != null && matchingConverter.CanWrite) + { + matchingConverter.WriteJson(writer, _value, JsonSerializer.CreateDefault()); + return; + } + } + + switch (_valueType) + { + case JTokenType.Comment: + writer.WriteComment((_value != null) ? _value.ToString() : null); + return; + case JTokenType.Raw: + writer.WriteRawValue((_value != null) ? _value.ToString() : null); + return; + case JTokenType.Null: + writer.WriteNull(); + return; + case JTokenType.Undefined: + writer.WriteUndefined(); + return; + case JTokenType.Integer: + if (_value is int) + { + writer.WriteValue((int)_value); + } + else if (_value is long) + { + writer.WriteValue((long)_value); + } + else if (_value is ulong) + { + writer.WriteValue((ulong)_value); + } +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + else if (_value is BigInteger) + { + writer.WriteValue((BigInteger)_value); + } +#endif + else + { + writer.WriteValue(Convert.ToInt64(_value, CultureInfo.InvariantCulture)); + } + return; + case JTokenType.Float: + if (_value is decimal) + { + writer.WriteValue((decimal)_value); + } + else if (_value is double) + { + writer.WriteValue((double)_value); + } + else if (_value is float) + { + writer.WriteValue((float)_value); + } + else + { + writer.WriteValue(Convert.ToDouble(_value, CultureInfo.InvariantCulture)); + } + return; + case JTokenType.String: + writer.WriteValue((_value != null) ? _value.ToString() : null); + return; + case JTokenType.Boolean: + writer.WriteValue(Convert.ToBoolean(_value, CultureInfo.InvariantCulture)); + return; + case JTokenType.Date: +#if !NET20 + if (_value is DateTimeOffset) + { + writer.WriteValue((DateTimeOffset)_value); + } + else +#endif + { + writer.WriteValue(Convert.ToDateTime(_value, CultureInfo.InvariantCulture)); + } + return; + case JTokenType.Bytes: + writer.WriteValue((byte[])_value); + return; + case JTokenType.Guid: + case JTokenType.TimeSpan: + writer.WriteValue((_value != null) ? _value.ToString() : null); + return; + case JTokenType.Uri: + writer.WriteValue((_value != null) ? ((Uri)_value).OriginalString : null); + return; + } + + throw MiscellaneousUtils.CreateArgumentOutOfRangeException("TokenType", _valueType, "Unexpected token type."); + } + + internal override int GetDeepHashCode() + { + int valueHashCode = (_value != null) ? _value.GetHashCode() : 0; + + // GetHashCode on an enum boxes so cast to int + return ((int)_valueType).GetHashCode() ^ valueHashCode; + } + + private static bool ValuesEquals(JValue v1, JValue v2) + { + return (v1 == v2 || (v1._valueType == v2._valueType && Compare(v1._valueType, v1._value, v2._value) == 0)); + } + + /// + /// Indicates whether the current object is equal to another object of the same type. + /// + /// + /// true if the current object is equal to the parameter; otherwise, false. + /// + /// An object to compare with this object. + public bool Equals(JValue other) + { + if (other == null) + { + return false; + } + + return ValuesEquals(this, other); + } + + /// + /// Determines whether the specified is equal to the current . + /// + /// The to compare with the current . + /// + /// true if the specified is equal to the current ; otherwise, false. + /// + /// + /// The parameter is null. + /// + public override bool Equals(object obj) + { + if (obj == null) + { + return false; + } + + JValue otherValue = obj as JValue; + if (otherValue != null) + { + return Equals(otherValue); + } + + return base.Equals(obj); + } + + /// + /// Serves as a hash function for a particular type. + /// + /// + /// A hash code for the current . + /// + public override int GetHashCode() + { + if (_value == null) + { + return 0; + } + + return _value.GetHashCode(); + } + + /// + /// Returns a that represents this instance. + /// + /// + /// A that represents this instance. + /// + public override string ToString() + { + if (_value == null) + { + return string.Empty; + } + + return _value.ToString(); + } + + /// + /// Returns a that represents this instance. + /// + /// The format. + /// + /// A that represents this instance. + /// + public string ToString(string format) + { + return ToString(format, CultureInfo.CurrentCulture); + } + + /// + /// Returns a that represents this instance. + /// + /// The format provider. + /// + /// A that represents this instance. + /// + public string ToString(IFormatProvider formatProvider) + { + return ToString(null, formatProvider); + } + + /// + /// Returns a that represents this instance. + /// + /// The format. + /// The format provider. + /// + /// A that represents this instance. + /// + public string ToString(string format, IFormatProvider formatProvider) + { + if (_value == null) + { + return string.Empty; + } + + IFormattable formattable = _value as IFormattable; + if (formattable != null) + { + return formattable.ToString(format, formatProvider); + } + else + { + return _value.ToString(); + } + } + +#if !(NET35 || NET20 || PORTABLE40) + /// + /// Returns the responsible for binding operations performed on this object. + /// + /// The expression tree representation of the runtime value. + /// + /// The to bind this object. + /// + protected override DynamicMetaObject GetMetaObject(Expression parameter) + { + return new DynamicProxyMetaObject(parameter, this, new JValueDynamicProxy(), true); + } + + private class JValueDynamicProxy : DynamicProxy + { + public override bool TryConvert(JValue instance, ConvertBinder binder, out object result) + { + if (binder.Type == typeof(JValue) || binder.Type == typeof(JToken)) + { + result = instance; + return true; + } + + object value = instance.Value; + + if (value == null) + { + result = null; + return ReflectionUtils.IsNullable(binder.Type); + } + + result = ConvertUtils.Convert(value, CultureInfo.InvariantCulture, binder.Type); + return true; + } + + public override bool TryBinaryOperation(JValue instance, BinaryOperationBinder binder, object arg, out object result) + { + object compareValue = (arg is JValue) ? ((JValue)arg).Value : arg; + + switch (binder.Operation) + { + case ExpressionType.Equal: + result = (Compare(instance.Type, instance.Value, compareValue) == 0); + return true; + case ExpressionType.NotEqual: + result = (Compare(instance.Type, instance.Value, compareValue) != 0); + return true; + case ExpressionType.GreaterThan: + result = (Compare(instance.Type, instance.Value, compareValue) > 0); + return true; + case ExpressionType.GreaterThanOrEqual: + result = (Compare(instance.Type, instance.Value, compareValue) >= 0); + return true; + case ExpressionType.LessThan: + result = (Compare(instance.Type, instance.Value, compareValue) < 0); + return true; + case ExpressionType.LessThanOrEqual: + result = (Compare(instance.Type, instance.Value, compareValue) <= 0); + return true; + case ExpressionType.Add: + case ExpressionType.AddAssign: + case ExpressionType.Subtract: + case ExpressionType.SubtractAssign: + case ExpressionType.Multiply: + case ExpressionType.MultiplyAssign: + case ExpressionType.Divide: + case ExpressionType.DivideAssign: + if (Operation(binder.Operation, instance.Value, compareValue, out result)) + { + result = new JValue(result); + return true; + } + break; + } + + result = null; + return false; + } + } +#endif + + int IComparable.CompareTo(object obj) + { + if (obj == null) + { + return 1; + } + + object otherValue = (obj is JValue) ? ((JValue)obj).Value : obj; + + return Compare(_valueType, _value, otherValue); + } + + /// + /// Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + /// + /// An object to compare with this instance. + /// + /// A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings: + /// Value + /// Meaning + /// Less than zero + /// This instance is less than . + /// Zero + /// This instance is equal to . + /// Greater than zero + /// This instance is greater than . + /// + /// + /// is not the same type as this instance. + /// + public int CompareTo(JValue obj) + { + if (obj == null) + { + return 1; + } + + return Compare(_valueType, _value, obj._value); + } + +#if !PORTABLE + TypeCode IConvertible.GetTypeCode() + { + if (_value == null) + { + return TypeCode.Empty; + } + + IConvertible convertable = _value as IConvertible; + + if (convertable == null) + { + return TypeCode.Object; + } + + return convertable.GetTypeCode(); + } + + bool IConvertible.ToBoolean(IFormatProvider provider) + { + return (bool)this; + } + + char IConvertible.ToChar(IFormatProvider provider) + { + return (char)this; + } + + sbyte IConvertible.ToSByte(IFormatProvider provider) + { + return (sbyte)this; + } + + byte IConvertible.ToByte(IFormatProvider provider) + { + return (byte)this; + } + + short IConvertible.ToInt16(IFormatProvider provider) + { + return (short)this; + } + + ushort IConvertible.ToUInt16(IFormatProvider provider) + { + return (ushort)this; + } + + int IConvertible.ToInt32(IFormatProvider provider) + { + return (int)this; + } + + uint IConvertible.ToUInt32(IFormatProvider provider) + { + return (uint)this; + } + + long IConvertible.ToInt64(IFormatProvider provider) + { + return (long)this; + } + + ulong IConvertible.ToUInt64(IFormatProvider provider) + { + return (ulong)this; + } + + float IConvertible.ToSingle(IFormatProvider provider) + { + return (float)this; + } + + double IConvertible.ToDouble(IFormatProvider provider) + { + return (double)this; + } + + decimal IConvertible.ToDecimal(IFormatProvider provider) + { + return (decimal)this; + } + + DateTime IConvertible.ToDateTime(IFormatProvider provider) + { + return (DateTime)this; + } + + object IConvertible.ToType(Type conversionType, IFormatProvider provider) + { + return ToObject(conversionType); + } +#endif + } +} diff --git a/Common/00-1Json8.3/Json8.3/Linq/JsonLoadSettings.cs b/Common/00-1Json8.3/Json8.3/Linq/JsonLoadSettings.cs new file mode 100644 index 0000000..5f2e70f --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JsonLoadSettings.cs @@ -0,0 +1,49 @@ +using System; + +namespace Newtonsoft.Json.Linq +{ + /// + /// Specifies the settings used when loading JSON. + /// + public class JsonLoadSettings + { + private CommentHandling _commentHandling; + private LineInfoHandling _lineInfoHandling; + + /// + /// Gets or sets how JSON comments are handled when loading JSON. + /// + /// The JSON comment handling. + public CommentHandling CommentHandling + { + get { return _commentHandling; } + set + { + if (value < CommentHandling.Ignore || value > CommentHandling.Load) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _commentHandling = value; + } + } + + /// + /// Gets or sets how JSON line info is handled when loading JSON. + /// + /// The JSON line info handling. + public LineInfoHandling LineInfoHandling + { + get { return _lineInfoHandling; } + set + { + if (value < LineInfoHandling.Ignore || value > LineInfoHandling.Load) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _lineInfoHandling = value; + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JsonMergeSettings.cs b/Common/00-1Json8.3/Json8.3/Linq/JsonMergeSettings.cs new file mode 100644 index 0000000..9542095 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JsonMergeSettings.cs @@ -0,0 +1,49 @@ +using System; + +namespace Newtonsoft.Json.Linq +{ + /// + /// Specifies the settings used when merging JSON. + /// + public class JsonMergeSettings + { + private MergeArrayHandling _mergeArrayHandling; + private MergeNullValueHandling _mergeNullValueHandling; + + /// + /// Gets or sets the method used when merging JSON arrays. + /// + /// The method used when merging JSON arrays. + public MergeArrayHandling MergeArrayHandling + { + get { return _mergeArrayHandling; } + set + { + if (value < MergeArrayHandling.Concat || value > MergeArrayHandling.Merge) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _mergeArrayHandling = value; + } + } + + /// + /// Gets or sets how how null value properties are merged. + /// + /// How null value properties are merged. + public MergeNullValueHandling MergeNullValueHandling + { + get { return _mergeNullValueHandling; } + set + { + if (value < MergeNullValueHandling.Ignore || value > MergeNullValueHandling.Merge) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + _mergeNullValueHandling = value; + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JsonPath/ArrayIndexFilter.cs b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/ArrayIndexFilter.cs new file mode 100644 index 0000000..05537a4 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/ArrayIndexFilter.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; +using System.Globalization; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Linq.JsonPath +{ + internal class ArrayIndexFilter : PathFilter + { + public int? Index { get; set; } + + public override IEnumerable ExecuteFilter(IEnumerable current, bool errorWhenNoMatch) + { + foreach (JToken t in current) + { + if (Index != null) + { + JToken v = GetTokenIndex(t, errorWhenNoMatch, Index.GetValueOrDefault()); + + if (v != null) + { + yield return v; + } + } + else + { + if (t is JArray || t is JConstructor) + { + foreach (JToken v in t) + { + yield return v; + } + } + else + { + if (errorWhenNoMatch) + { + throw new JsonException("Index * not valid on {0}.".FormatWith(CultureInfo.InvariantCulture, t.GetType().Name)); + } + } + } + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JsonPath/ArrayMultipleIndexFilter.cs b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/ArrayMultipleIndexFilter.cs new file mode 100644 index 0000000..81d64e3 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/ArrayMultipleIndexFilter.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; + +namespace Newtonsoft.Json.Linq.JsonPath +{ + internal class ArrayMultipleIndexFilter : PathFilter + { + public List Indexes { get; set; } + + public override IEnumerable ExecuteFilter(IEnumerable current, bool errorWhenNoMatch) + { + foreach (JToken t in current) + { + foreach (int i in Indexes) + { + JToken v = GetTokenIndex(t, errorWhenNoMatch, i); + + if (v != null) + { + yield return v; + } + } + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JsonPath/ArraySliceFilter.cs b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/ArraySliceFilter.cs new file mode 100644 index 0000000..65139d2 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/ArraySliceFilter.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Linq.JsonPath +{ + internal class ArraySliceFilter : PathFilter + { + public int? Start { get; set; } + public int? End { get; set; } + public int? Step { get; set; } + + public override IEnumerable ExecuteFilter(IEnumerable current, bool errorWhenNoMatch) + { + if (Step == 0) + { + throw new JsonException("Step cannot be zero."); + } + + foreach (JToken t in current) + { + JArray a = t as JArray; + if (a != null) + { + // set defaults for null arguments + int stepCount = Step ?? 1; + int startIndex = Start ?? ((stepCount > 0) ? 0 : a.Count - 1); + int stopIndex = End ?? ((stepCount > 0) ? a.Count : -1); + + // start from the end of the list if start is negitive + if (Start < 0) + { + startIndex = a.Count + startIndex; + } + + // end from the start of the list if stop is negitive + if (End < 0) + { + stopIndex = a.Count + stopIndex; + } + + // ensure indexes keep within collection bounds + startIndex = Math.Max(startIndex, (stepCount > 0) ? 0 : int.MinValue); + startIndex = Math.Min(startIndex, (stepCount > 0) ? a.Count : a.Count - 1); + stopIndex = Math.Max(stopIndex, -1); + stopIndex = Math.Min(stopIndex, a.Count); + + bool positiveStep = (stepCount > 0); + + if (IsValid(startIndex, stopIndex, positiveStep)) + { + for (int i = startIndex; IsValid(i, stopIndex, positiveStep); i += stepCount) + { + yield return a[i]; + } + } + else + { + if (errorWhenNoMatch) + { + throw new JsonException("Array slice of {0} to {1} returned no results.".FormatWith(CultureInfo.InvariantCulture, + Start != null ? Start.GetValueOrDefault().ToString(CultureInfo.InvariantCulture) : "*", + End != null ? End.GetValueOrDefault().ToString(CultureInfo.InvariantCulture) : "*")); + } + } + } + else + { + if (errorWhenNoMatch) + { + throw new JsonException("Array slice is not valid on {0}.".FormatWith(CultureInfo.InvariantCulture, t.GetType().Name)); + } + } + } + } + + private bool IsValid(int index, int stopIndex, bool positiveStep) + { + if (positiveStep) + { + return (index < stopIndex); + } + + return (index > stopIndex); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JsonPath/FieldFilter.cs b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/FieldFilter.cs new file mode 100644 index 0000000..e349466 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/FieldFilter.cs @@ -0,0 +1,49 @@ +using System.Collections.Generic; +using System.Globalization; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Linq.JsonPath +{ + internal class FieldFilter : PathFilter + { + public string Name { get; set; } + + public override IEnumerable ExecuteFilter(IEnumerable current, bool errorWhenNoMatch) + { + foreach (JToken t in current) + { + JObject o = t as JObject; + if (o != null) + { + if (Name != null) + { + JToken v = o[Name]; + + if (v != null) + { + yield return v; + } + else if (errorWhenNoMatch) + { + throw new JsonException("Property '{0}' does not exist on JObject.".FormatWith(CultureInfo.InvariantCulture, Name)); + } + } + else + { + foreach (KeyValuePair p in o) + { + yield return p.Value; + } + } + } + else + { + if (errorWhenNoMatch) + { + throw new JsonException("Property '{0}' not valid on {1}.".FormatWith(CultureInfo.InvariantCulture, Name ?? "*", t.GetType().Name)); + } + } + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JsonPath/FieldMultipleFilter.cs b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/FieldMultipleFilter.cs new file mode 100644 index 0000000..940818a --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/FieldMultipleFilter.cs @@ -0,0 +1,48 @@ +using System.Collections.Generic; +using System.Globalization; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; +#endif +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Linq.JsonPath +{ + internal class FieldMultipleFilter : PathFilter + { + public List Names { get; set; } + + public override IEnumerable ExecuteFilter(IEnumerable current, bool errorWhenNoMatch) + { + foreach (JToken t in current) + { + JObject o = t as JObject; + if (o != null) + { + foreach (string name in Names) + { + JToken v = o[name]; + + if (v != null) + { + yield return v; + } + + if (errorWhenNoMatch) + { + throw new JsonException("Property '{0}' does not exist on JObject.".FormatWith(CultureInfo.InvariantCulture, name)); + } + } + } + else + { + if (errorWhenNoMatch) + { + throw new JsonException("Properties {0} not valid on {1}.".FormatWith(CultureInfo.InvariantCulture, string.Join(", ", Names.Select(n => "'" + n + "'").ToArray()), t.GetType().Name)); + } + } + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JsonPath/JPath.cs b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/JPath.cs new file mode 100644 index 0000000..a8346a1 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/JPath.cs @@ -0,0 +1,777 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Linq.JsonPath +{ + internal class JPath + { + private readonly string _expression; + public List Filters { get; private set; } + + private int _currentIndex; + + public JPath(string expression) + { + ValidationUtils.ArgumentNotNull(expression, nameof(expression)); + _expression = expression; + Filters = new List(); + + ParseMain(); + } + + private void ParseMain() + { + int currentPartStartIndex = _currentIndex; + + EatWhitespace(); + + if (_expression.Length == _currentIndex) + { + return; + } + + if (_expression[_currentIndex] == '$') + { + if (_expression.Length == 1) + { + return; + } + + // only increment position for "$." or "$[" + // otherwise assume property that starts with $ + char c = _expression[_currentIndex + 1]; + if (c == '.' || c == '[') + { + _currentIndex++; + currentPartStartIndex = _currentIndex; + } + } + + if (!ParsePath(Filters, currentPartStartIndex, false)) + { + int lastCharacterIndex = _currentIndex; + + EatWhitespace(); + + if (_currentIndex < _expression.Length) + { + throw new JsonException("Unexpected character while parsing path: " + _expression[lastCharacterIndex]); + } + } + } + + private bool ParsePath(List filters, int currentPartStartIndex, bool query) + { + bool scan = false; + bool followingIndexer = false; + bool followingDot = false; + + bool ended = false; + while (_currentIndex < _expression.Length && !ended) + { + char currentChar = _expression[_currentIndex]; + + switch (currentChar) + { + case '[': + case '(': + if (_currentIndex > currentPartStartIndex) + { + string member = _expression.Substring(currentPartStartIndex, _currentIndex - currentPartStartIndex); + if (member == "*") + { + member = null; + } + + PathFilter filter = (scan) ? (PathFilter)new ScanFilter { Name = member } : new FieldFilter { Name = member }; + filters.Add(filter); + scan = false; + } + + filters.Add(ParseIndexer(currentChar)); + _currentIndex++; + currentPartStartIndex = _currentIndex; + followingIndexer = true; + followingDot = false; + break; + case ']': + case ')': + ended = true; + break; + case ' ': + if (_currentIndex < _expression.Length) + { + ended = true; + } + break; + case '.': + if (_currentIndex > currentPartStartIndex) + { + string member = _expression.Substring(currentPartStartIndex, _currentIndex - currentPartStartIndex); + if (member == "*") + { + member = null; + } + + PathFilter filter = (scan) ? (PathFilter)new ScanFilter { Name = member } : new FieldFilter { Name = member }; + filters.Add(filter); + scan = false; + } + if (_currentIndex + 1 < _expression.Length && _expression[_currentIndex + 1] == '.') + { + scan = true; + _currentIndex++; + } + _currentIndex++; + currentPartStartIndex = _currentIndex; + followingIndexer = false; + followingDot = true; + break; + default: + if (query && (currentChar == '=' || currentChar == '<' || currentChar == '!' || currentChar == '>' || currentChar == '|' || currentChar == '&')) + { + ended = true; + } + else + { + if (followingIndexer) + { + throw new JsonException("Unexpected character following indexer: " + currentChar); + } + + _currentIndex++; + } + break; + } + } + + bool atPathEnd = (_currentIndex == _expression.Length); + + if (_currentIndex > currentPartStartIndex) + { + string member = _expression.Substring(currentPartStartIndex, _currentIndex - currentPartStartIndex).TrimEnd(); + if (member == "*") + { + member = null; + } + PathFilter filter = (scan) ? (PathFilter)new ScanFilter { Name = member } : new FieldFilter { Name = member }; + filters.Add(filter); + } + else + { + // no field name following dot in path and at end of base path/query + if (followingDot && (atPathEnd || query)) + { + throw new JsonException("Unexpected end while parsing path."); + } + } + + return atPathEnd; + } + + private PathFilter ParseIndexer(char indexerOpenChar) + { + _currentIndex++; + + char indexerCloseChar = (indexerOpenChar == '[') ? ']' : ')'; + + EnsureLength("Path ended with open indexer."); + + EatWhitespace(); + + if (_expression[_currentIndex] == '\'') + { + return ParseQuotedField(indexerCloseChar); + } + else if (_expression[_currentIndex] == '?') + { + return ParseQuery(indexerCloseChar); + } + else + { + return ParseArrayIndexer(indexerCloseChar); + } + } + + private PathFilter ParseArrayIndexer(char indexerCloseChar) + { + int start = _currentIndex; + int? end = null; + List indexes = null; + int colonCount = 0; + int? startIndex = null; + int? endIndex = null; + int? step = null; + + while (_currentIndex < _expression.Length) + { + char currentCharacter = _expression[_currentIndex]; + + if (currentCharacter == ' ') + { + end = _currentIndex; + EatWhitespace(); + continue; + } + + if (currentCharacter == indexerCloseChar) + { + int length = (end ?? _currentIndex) - start; + + if (indexes != null) + { + if (length == 0) + { + throw new JsonException("Array index expected."); + } + + string indexer = _expression.Substring(start, length); + int index = Convert.ToInt32(indexer, CultureInfo.InvariantCulture); + + indexes.Add(index); + return new ArrayMultipleIndexFilter { Indexes = indexes }; + } + else if (colonCount > 0) + { + if (length > 0) + { + string indexer = _expression.Substring(start, length); + int index = Convert.ToInt32(indexer, CultureInfo.InvariantCulture); + + if (colonCount == 1) + { + endIndex = index; + } + else + { + step = index; + } + } + + return new ArraySliceFilter { Start = startIndex, End = endIndex, Step = step }; + } + else + { + if (length == 0) + { + throw new JsonException("Array index expected."); + } + + string indexer = _expression.Substring(start, length); + int index = Convert.ToInt32(indexer, CultureInfo.InvariantCulture); + + return new ArrayIndexFilter { Index = index }; + } + } + else if (currentCharacter == ',') + { + int length = (end ?? _currentIndex) - start; + + if (length == 0) + { + throw new JsonException("Array index expected."); + } + + if (indexes == null) + { + indexes = new List(); + } + + string indexer = _expression.Substring(start, length); + indexes.Add(Convert.ToInt32(indexer, CultureInfo.InvariantCulture)); + + _currentIndex++; + + EatWhitespace(); + + start = _currentIndex; + end = null; + } + else if (currentCharacter == '*') + { + _currentIndex++; + EnsureLength("Path ended with open indexer."); + EatWhitespace(); + + if (_expression[_currentIndex] != indexerCloseChar) + { + throw new JsonException("Unexpected character while parsing path indexer: " + currentCharacter); + } + + return new ArrayIndexFilter(); + } + else if (currentCharacter == ':') + { + int length = (end ?? _currentIndex) - start; + + if (length > 0) + { + string indexer = _expression.Substring(start, length); + int index = Convert.ToInt32(indexer, CultureInfo.InvariantCulture); + + if (colonCount == 0) + { + startIndex = index; + } + else if (colonCount == 1) + { + endIndex = index; + } + else + { + step = index; + } + } + + colonCount++; + + _currentIndex++; + + EatWhitespace(); + + start = _currentIndex; + end = null; + } + else if (!char.IsDigit(currentCharacter) && currentCharacter != '-') + { + throw new JsonException("Unexpected character while parsing path indexer: " + currentCharacter); + } + else + { + if (end != null) + { + throw new JsonException("Unexpected character while parsing path indexer: " + currentCharacter); + } + + _currentIndex++; + } + } + + throw new JsonException("Path ended with open indexer."); + } + + private void EatWhitespace() + { + while (_currentIndex < _expression.Length) + { + if (_expression[_currentIndex] != ' ') + { + break; + } + + _currentIndex++; + } + } + + private PathFilter ParseQuery(char indexerCloseChar) + { + _currentIndex++; + EnsureLength("Path ended with open indexer."); + + if (_expression[_currentIndex] != '(') + { + throw new JsonException("Unexpected character while parsing path indexer: " + _expression[_currentIndex]); + } + + _currentIndex++; + + QueryExpression expression = ParseExpression(); + + _currentIndex++; + EnsureLength("Path ended with open indexer."); + EatWhitespace(); + + if (_expression[_currentIndex] != indexerCloseChar) + { + throw new JsonException("Unexpected character while parsing path indexer: " + _expression[_currentIndex]); + } + + return new QueryFilter + { + Expression = expression + }; + } + + private QueryExpression ParseExpression() + { + QueryExpression rootExpression = null; + CompositeExpression parentExpression = null; + + while (_currentIndex < _expression.Length) + { + EatWhitespace(); + + if (_expression[_currentIndex] != '@') + { + throw new JsonException("Unexpected character while parsing path query: " + _expression[_currentIndex]); + } + + _currentIndex++; + + List expressionPath = new List(); + + if (ParsePath(expressionPath, _currentIndex, true)) + { + throw new JsonException("Path ended with open query."); + } + + EatWhitespace(); + EnsureLength("Path ended with open query."); + + QueryOperator op; + object value = null; + if (_expression[_currentIndex] == ')' + || _expression[_currentIndex] == '|' + || _expression[_currentIndex] == '&') + { + op = QueryOperator.Exists; + } + else + { + op = ParseOperator(); + + EatWhitespace(); + EnsureLength("Path ended with open query."); + + value = ParseValue(); + + EatWhitespace(); + EnsureLength("Path ended with open query."); + } + + BooleanQueryExpression booleanExpression = new BooleanQueryExpression + { + Path = expressionPath, + Operator = op, + Value = (op != QueryOperator.Exists) ? new JValue(value) : null + }; + + if (_expression[_currentIndex] == ')') + { + if (parentExpression != null) + { + parentExpression.Expressions.Add(booleanExpression); + return rootExpression; + } + + return booleanExpression; + } + if (_expression[_currentIndex] == '&' && Match("&&")) + { + if (parentExpression == null || parentExpression.Operator != QueryOperator.And) + { + CompositeExpression andExpression = new CompositeExpression { Operator = QueryOperator.And }; + + if (parentExpression != null) + { + parentExpression.Expressions.Add(andExpression); + } + + parentExpression = andExpression; + + if (rootExpression == null) + { + rootExpression = parentExpression; + } + } + + parentExpression.Expressions.Add(booleanExpression); + } + if (_expression[_currentIndex] == '|' && Match("||")) + { + if (parentExpression == null || parentExpression.Operator != QueryOperator.Or) + { + CompositeExpression orExpression = new CompositeExpression { Operator = QueryOperator.Or }; + + if (parentExpression != null) + { + parentExpression.Expressions.Add(orExpression); + } + + parentExpression = orExpression; + + if (rootExpression == null) + { + rootExpression = parentExpression; + } + } + + parentExpression.Expressions.Add(booleanExpression); + } + } + + throw new JsonException("Path ended with open query."); + } + + private object ParseValue() + { + char currentChar = _expression[_currentIndex]; + if (currentChar == '\'') + { + return ReadQuotedString(); + } + else if (char.IsDigit(currentChar) || currentChar == '-') + { + StringBuilder sb = new StringBuilder(); + sb.Append(currentChar); + + _currentIndex++; + while (_currentIndex < _expression.Length) + { + currentChar = _expression[_currentIndex]; + if (currentChar == ' ' || currentChar == ')') + { + string numberText = sb.ToString(); + + if (numberText.IndexOfAny(new char[] { '.', 'E', 'e' }) != -1) + { + double d; + if (double.TryParse(numberText, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out d)) + { + return d; + } + else + { + throw new JsonException("Could not read query value."); + } + } + else + { + long l; + if (long.TryParse(numberText, NumberStyles.Integer, CultureInfo.InvariantCulture, out l)) + { + return l; + } + else + { + throw new JsonException("Could not read query value."); + } + } + } + else + { + sb.Append(currentChar); + _currentIndex++; + } + } + } + else if (currentChar == 't') + { + if (Match("true")) + { + return true; + } + } + else if (currentChar == 'f') + { + if (Match("false")) + { + return false; + } + } + else if (currentChar == 'n') + { + if (Match("null")) + { + return null; + } + } + + throw new JsonException("Could not read query value."); + } + + private string ReadQuotedString() + { + StringBuilder sb = new StringBuilder(); + + _currentIndex++; + while (_currentIndex < _expression.Length) + { + char currentChar = _expression[_currentIndex]; + if (currentChar == '\\' && _currentIndex + 1 < _expression.Length) + { + _currentIndex++; + + if (_expression[_currentIndex] == '\'') + { + sb.Append('\''); + } + else if (_expression[_currentIndex] == '\\') + { + sb.Append('\\'); + } + else + { + throw new JsonException(@"Unknown escape chracter: \" + _expression[_currentIndex]); + } + + _currentIndex++; + } + else if (currentChar == '\'') + { + _currentIndex++; + { + return sb.ToString(); + } + } + else + { + _currentIndex++; + sb.Append(currentChar); + } + } + + throw new JsonException("Path ended with an open string."); + } + + private bool Match(string s) + { + int currentPosition = _currentIndex; + foreach (char c in s) + { + if (currentPosition < _expression.Length && _expression[currentPosition] == c) + { + currentPosition++; + } + else + { + return false; + } + } + + _currentIndex = currentPosition; + return true; + } + + private QueryOperator ParseOperator() + { + if (_currentIndex + 1 >= _expression.Length) + { + throw new JsonException("Path ended with open query."); + } + + if (Match("==")) + { + return QueryOperator.Equals; + } + if (Match("!=") || Match("<>")) + { + return QueryOperator.NotEquals; + } + if (Match("<=")) + { + return QueryOperator.LessThanOrEquals; + } + if (Match("<")) + { + return QueryOperator.LessThan; + } + if (Match(">=")) + { + return QueryOperator.GreaterThanOrEquals; + } + if (Match(">")) + { + return QueryOperator.GreaterThan; + } + + throw new JsonException("Could not read query operator."); + } + + private PathFilter ParseQuotedField(char indexerCloseChar) + { + List fields = null; + + while (_currentIndex < _expression.Length) + { + string field = ReadQuotedString(); + + EatWhitespace(); + EnsureLength("Path ended with open indexer."); + + if (_expression[_currentIndex] == indexerCloseChar) + { + if (fields != null) + { + fields.Add(field); + return new FieldMultipleFilter { Names = fields }; + } + else + { + return new FieldFilter { Name = field }; + } + } + else if (_expression[_currentIndex] == ',') + { + _currentIndex++; + EatWhitespace(); + + if (fields == null) + { + fields = new List(); + } + + fields.Add(field); + } + else + { + throw new JsonException("Unexpected character while parsing path indexer: " + _expression[_currentIndex]); + } + } + + throw new JsonException("Path ended with open indexer."); + } + + private void EnsureLength(string message) + { + if (_currentIndex >= _expression.Length) + { + throw new JsonException(message); + } + } + + internal IEnumerable Evaluate(JToken t, bool errorWhenNoMatch) + { + return Evaluate(Filters, t, errorWhenNoMatch); + } + + internal static IEnumerable Evaluate(List filters, JToken t, bool errorWhenNoMatch) + { + IEnumerable current = new[] { t }; + foreach (PathFilter filter in filters) + { + current = filter.ExecuteFilter(current, errorWhenNoMatch); + } + + return current; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JsonPath/PathFilter.cs b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/PathFilter.cs new file mode 100644 index 0000000..c1bce17 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/PathFilter.cs @@ -0,0 +1,55 @@ +using System.Collections.Generic; +using System.Globalization; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Linq.JsonPath +{ + internal abstract class PathFilter + { + public abstract IEnumerable ExecuteFilter(IEnumerable current, bool errorWhenNoMatch); + + protected static JToken GetTokenIndex(JToken t, bool errorWhenNoMatch, int index) + { + JArray a = t as JArray; + JConstructor c = t as JConstructor; + + if (a != null) + { + if (a.Count <= index) + { + if (errorWhenNoMatch) + { + throw new JsonException("Index {0} outside the bounds of JArray.".FormatWith(CultureInfo.InvariantCulture, index)); + } + + return null; + } + + return a[index]; + } + else if (c != null) + { + if (c.Count <= index) + { + if (errorWhenNoMatch) + { + throw new JsonException("Index {0} outside the bounds of JConstructor.".FormatWith(CultureInfo.InvariantCulture, index)); + } + + return null; + } + + return c[index]; + } + else + { + if (errorWhenNoMatch) + { + throw new JsonException("Index {0} not valid on {1}.".FormatWith(CultureInfo.InvariantCulture, index, t.GetType().Name)); + } + + return null; + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JsonPath/QueryExpression.cs b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/QueryExpression.cs new file mode 100644 index 0000000..3b5c44e --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/QueryExpression.cs @@ -0,0 +1,180 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Linq.JsonPath +{ + internal enum QueryOperator + { + None = 0, + Equals = 1, + NotEquals = 2, + Exists = 3, + LessThan = 4, + LessThanOrEquals = 5, + GreaterThan = 6, + GreaterThanOrEquals = 7, + And = 8, + Or = 9 + } + + internal abstract class QueryExpression + { + public QueryOperator Operator { get; set; } + + public abstract bool IsMatch(JToken t); + } + + internal class CompositeExpression : QueryExpression + { + public List Expressions { get; set; } + + public CompositeExpression() + { + Expressions = new List(); + } + + public override bool IsMatch(JToken t) + { + switch (Operator) + { + case QueryOperator.And: + foreach (QueryExpression e in Expressions) + { + if (!e.IsMatch(t)) + { + return false; + } + } + return true; + case QueryOperator.Or: + foreach (QueryExpression e in Expressions) + { + if (e.IsMatch(t)) + { + return true; + } + } + return false; + default: + throw new ArgumentOutOfRangeException(); + } + } + } + + internal class BooleanQueryExpression : QueryExpression + { + public List Path { get; set; } + public JValue Value { get; set; } + + public override bool IsMatch(JToken t) + { + IEnumerable pathResult = JPath.Evaluate(Path, t, false); + + foreach (JToken r in pathResult) + { + JValue v = r as JValue; + switch (Operator) + { + case QueryOperator.Equals: + if (v != null && EqualsWithStringCoercion(v, Value)) + { + return true; + } + break; + case QueryOperator.NotEquals: + if (v != null && !EqualsWithStringCoercion(v, Value)) + { + return true; + } + break; + case QueryOperator.GreaterThan: + if (v != null && v.CompareTo(Value) > 0) + { + return true; + } + break; + case QueryOperator.GreaterThanOrEquals: + if (v != null && v.CompareTo(Value) >= 0) + { + return true; + } + break; + case QueryOperator.LessThan: + if (v != null && v.CompareTo(Value) < 0) + { + return true; + } + break; + case QueryOperator.LessThanOrEquals: + if (v != null && v.CompareTo(Value) <= 0) + { + return true; + } + break; + case QueryOperator.Exists: + return true; + default: + throw new ArgumentOutOfRangeException(); + } + } + + return false; + } + + private bool EqualsWithStringCoercion(JValue value, JValue queryValue) + { + if (value.Equals(queryValue)) + { + return true; + } + + if (queryValue.Type != JTokenType.String) + { + return false; + } + + string queryValueString = (string)queryValue.Value; + + string currentValueString; + + // potential performance issue with converting every value to string? + switch (value.Type) + { + case JTokenType.Date: + using (StringWriter writer = StringUtils.CreateStringWriter(64)) + { +#if !NET20 + if (value.Value is DateTimeOffset) + { + DateTimeUtils.WriteDateTimeOffsetString(writer, (DateTimeOffset)value.Value, DateFormatHandling.IsoDateFormat, null, CultureInfo.InvariantCulture); + } + else +#endif + { + DateTimeUtils.WriteDateTimeString(writer, (DateTime)value.Value, DateFormatHandling.IsoDateFormat, null, CultureInfo.InvariantCulture); + } + + currentValueString = writer.ToString(); + } + break; + case JTokenType.Bytes: + currentValueString = Convert.ToBase64String((byte[])value.Value); + break; + case JTokenType.Guid: + case JTokenType.TimeSpan: + currentValueString = value.Value.ToString(); + break; + case JTokenType.Uri: + currentValueString = ((Uri)value.Value).OriginalString; + break; + default: + return false; + } + + return string.Equals(currentValueString, queryValueString, StringComparison.Ordinal); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JsonPath/QueryFilter.cs b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/QueryFilter.cs new file mode 100644 index 0000000..9dab576 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/QueryFilter.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; + +namespace Newtonsoft.Json.Linq.JsonPath +{ + internal class QueryFilter : PathFilter + { + public QueryExpression Expression { get; set; } + + public override IEnumerable ExecuteFilter(IEnumerable current, bool errorWhenNoMatch) + { + foreach (JToken t in current) + { + foreach (JToken v in t) + { + if (Expression.IsMatch(v)) + { + yield return v; + } + } + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/JsonPath/ScanFilter.cs b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/ScanFilter.cs new file mode 100644 index 0000000..930adc4 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/JsonPath/ScanFilter.cs @@ -0,0 +1,63 @@ +using System.Collections.Generic; + +namespace Newtonsoft.Json.Linq.JsonPath +{ + internal class ScanFilter : PathFilter + { + public string Name { get; set; } + + public override IEnumerable ExecuteFilter(IEnumerable current, bool errorWhenNoMatch) + { + foreach (JToken root in current) + { + if (Name == null) + { + yield return root; + } + + JToken value = root; + JToken container = root; + + while (true) + { + if (container != null && container.HasValues) + { + value = container.First; + } + else + { + while (value != null && value != root && value == value.Parent.Last) + { + value = value.Parent; + } + + if (value == null || value == root) + { + break; + } + + value = value.Next; + } + + JProperty e = value as JProperty; + if (e != null) + { + if (e.Name == Name) + { + yield return e.Value; + } + } + else + { + if (Name == null) + { + yield return value; + } + } + + container = value as JContainer; + } + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/MergeArrayHandling.cs b/Common/00-1Json8.3/Json8.3/Linq/MergeArrayHandling.cs new file mode 100644 index 0000000..5e7fadf --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/MergeArrayHandling.cs @@ -0,0 +1,20 @@ +namespace Newtonsoft.Json.Linq +{ + /// + /// Specifies how JSON arrays are merged together. + /// + public enum MergeArrayHandling + { + /// Concatenate arrays. + Concat = 0, + + /// Union arrays, skipping items that already exist. + Union = 1, + + /// Replace all array items. + Replace = 2, + + /// Merge array items together, matched by index. + Merge = 3 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Linq/MergeNullValueHandling.cs b/Common/00-1Json8.3/Json8.3/Linq/MergeNullValueHandling.cs new file mode 100644 index 0000000..30d3d84 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Linq/MergeNullValueHandling.cs @@ -0,0 +1,21 @@ +using System; + +namespace Newtonsoft.Json.Linq +{ + /// + /// Specifies how null value properties are merged. + /// + [Flags] + public enum MergeNullValueHandling + { + /// + /// The content's null value properties will be ignored during merging. + /// + Ignore = 0, + + /// + /// The content's null value properties will be merged. + /// + Merge = 1 + } +} diff --git a/Common/00-1Json8.3/Json8.3/MemberSerialization.cs b/Common/00-1Json8.3/Json8.3/MemberSerialization.cs new file mode 100644 index 0000000..8309992 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/MemberSerialization.cs @@ -0,0 +1,58 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Runtime.Serialization; +using Newtonsoft.Json.Serialization; + +namespace Newtonsoft.Json +{ + /// + /// Specifies the member serialization options for the . + /// + public enum MemberSerialization + { +#pragma warning disable 1584,1711,1572,1581,1580,1574 + /// + /// All public members are serialized by default. Members can be excluded using or . + /// This is the default member serialization mode. + /// + OptOut = 0, + + /// + /// Only members marked with or are serialized. + /// This member serialization mode can also be set by marking the class with . + /// + OptIn = 1, + + /// + /// All public and private fields are serialized. Members can be excluded using or . + /// This member serialization mode can also be set by marking the class with + /// and setting IgnoreSerializableAttribute on to false. + /// + Fields = 2 +#pragma warning restore 1584,1711,1572,1581,1580,1574 + } +} diff --git a/Common/00-1Json8.3/Json8.3/MetadataPropertyHandling.cs b/Common/00-1Json8.3/Json8.3/MetadataPropertyHandling.cs new file mode 100644 index 0000000..5bdacd8 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/MetadataPropertyHandling.cs @@ -0,0 +1,52 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Text; + +namespace Newtonsoft.Json +{ + /// + /// Specifies metadata property handling options for the . + /// + public enum MetadataPropertyHandling + { + /// + /// Read metadata properties located at the start of a JSON object. + /// + Default = 0, + + /// + /// Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + /// + ReadAhead = 1, + + /// + /// Do not try to read metadata properties. + /// + Ignore = 2 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/MissingMemberHandling.cs b/Common/00-1Json8.3/Json8.3/MissingMemberHandling.cs new file mode 100644 index 0000000..4e35081 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/MissingMemberHandling.cs @@ -0,0 +1,47 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Text; + +namespace Newtonsoft.Json +{ + /// + /// Specifies missing member handling options for the . + /// + public enum MissingMemberHandling + { + /// + /// Ignore a missing member and do not attempt to deserialize it. + /// + Ignore = 0, + + /// + /// Throw a when a missing member is encountered during deserialization. + /// + Error = 1 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/NullValueHandling.cs b/Common/00-1Json8.3/Json8.3/NullValueHandling.cs new file mode 100644 index 0000000..8a88c16 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/NullValueHandling.cs @@ -0,0 +1,47 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +namespace Newtonsoft.Json +{ + /// + /// Specifies null value handling options for the . + /// + /// + /// + /// + /// + public enum NullValueHandling + { + /// + /// Include null values when serializing and deserializing objects. + /// + Include = 0, + + /// + /// Ignore null values when serializing and deserializing objects. + /// + Ignore = 1 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/ObjectCreationHandling.cs b/Common/00-1Json8.3/Json8.3/ObjectCreationHandling.cs new file mode 100644 index 0000000..cc53b14 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/ObjectCreationHandling.cs @@ -0,0 +1,48 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +namespace Newtonsoft.Json +{ + /// + /// Specifies how object creation is handled by the . + /// + public enum ObjectCreationHandling + { + /// + /// Reuse existing objects, create new objects when needed. + /// + Auto = 0, + + /// + /// Only reuse existing objects. + /// + Reuse = 1, + + /// + /// Always create new objects. + /// + Replace = 2 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/PreserveReferencesHandling.cs b/Common/00-1Json8.3/Json8.3/PreserveReferencesHandling.cs new file mode 100644 index 0000000..61fcbd4 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/PreserveReferencesHandling.cs @@ -0,0 +1,62 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Text; + +namespace Newtonsoft.Json +{ + /// + /// Specifies reference handling options for the . + /// Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement ISerializable. + /// + /// + /// + /// + [Flags] + public enum PreserveReferencesHandling + { + /// + /// Do not preserve references when serializing types. + /// + None = 0, + + /// + /// Preserve references when serializing into a JSON object structure. + /// + Objects = 1, + + /// + /// Preserve references when serializing into a JSON array structure. + /// + Arrays = 2, + + /// + /// Preserve references when serializing. + /// + All = Objects | Arrays + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Properties/AssemblyInfo.cs b/Common/00-1Json8.3/Json8.3/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..899509d --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Json8.3")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Json8.3")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("1a10fdb2-1a6a-44a8-ab4d-33387563247e")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Common/00-1Json8.3/Json8.3/ReferenceLoopHandling.cs b/Common/00-1Json8.3/Json8.3/ReferenceLoopHandling.cs new file mode 100644 index 0000000..bfa5133 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/ReferenceLoopHandling.cs @@ -0,0 +1,52 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Text; + +namespace Newtonsoft.Json +{ + /// + /// Specifies reference loop handling options for the . + /// + public enum ReferenceLoopHandling + { + /// + /// Throw a when a loop is encountered. + /// + Error = 0, + + /// + /// Ignore loop references and do not serialize. + /// + Ignore = 1, + + /// + /// Serialize loop references. + /// + Serialize = 2 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Required.cs b/Common/00-1Json8.3/Json8.3/Required.cs new file mode 100644 index 0000000..47c91e1 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Required.cs @@ -0,0 +1,53 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +namespace Newtonsoft.Json +{ + /// + /// Indicating whether a property is required. + /// + public enum Required + { + /// + /// The property is not required. The default state. + /// + Default = 0, + + /// + /// The property must be defined in JSON but can be a null value. + /// + AllowNull = 1, + + /// + /// The property must be defined in JSON and cannot be a null value. + /// + Always = 2, + + /// + /// The property is not required but it cannot be a null value. + /// + DisallowNull = 3 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Schema/Extensions.cs b/Common/00-1Json8.3/Json8.3/Schema/Extensions.cs new file mode 100644 index 0000000..6cfbf30 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Schema/Extensions.cs @@ -0,0 +1,137 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Schema +{ + /// + /// + /// Contains the JSON schema extension methods. + /// + /// + /// JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. + /// + /// + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + public static class Extensions + { + /// + /// + /// Determines whether the is valid. + /// + /// + /// JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. + /// + /// + /// The source to test. + /// The schema to test with. + /// + /// true if the specified is valid; otherwise, false. + /// + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + public static bool IsValid(this JToken source, JsonSchema schema) + { + bool valid = true; + source.Validate(schema, (sender, args) => { valid = false; }); + return valid; + } + + /// + /// + /// Determines whether the is valid. + /// + /// + /// JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. + /// + /// + /// The source to test. + /// The schema to test with. + /// When this method returns, contains any error messages generated while validating. + /// + /// true if the specified is valid; otherwise, false. + /// + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + public static bool IsValid(this JToken source, JsonSchema schema, out IList errorMessages) + { + IList errors = new List(); + + source.Validate(schema, (sender, args) => errors.Add(args.Message)); + + errorMessages = errors; + return (errorMessages.Count == 0); + } + + /// + /// + /// Validates the specified . + /// + /// + /// JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. + /// + /// + /// The source to test. + /// The schema to test with. + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + public static void Validate(this JToken source, JsonSchema schema) + { + source.Validate(schema, null); + } + + /// + /// + /// Validates the specified . + /// + /// + /// JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. + /// + /// + /// The source to test. + /// The schema to test with. + /// The validation event handler. + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + public static void Validate(this JToken source, JsonSchema schema, ValidationEventHandler validationEventHandler) + { + ValidationUtils.ArgumentNotNull(source, nameof(source)); + ValidationUtils.ArgumentNotNull(schema, nameof(schema)); + + using (JsonValidatingReader reader = new JsonValidatingReader(source.CreateReader())) + { + reader.Schema = schema; + if (validationEventHandler != null) + { + reader.ValidationEventHandler += validationEventHandler; + } + + while (reader.Read()) + { + } + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Schema/JsonSchema.cs b/Common/00-1Json8.3/Json8.3/Schema/JsonSchema.cs new file mode 100644 index 0000000..7b32225 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Schema/JsonSchema.cs @@ -0,0 +1,356 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Utilities; +using System.Globalization; + +namespace Newtonsoft.Json.Schema +{ + /// + /// + /// An in-memory representation of a JSON Schema. + /// + /// + /// JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. + /// + /// + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + public class JsonSchema + { + /// + /// Gets or sets the id. + /// + public string Id { get; set; } + + /// + /// Gets or sets the title. + /// + public string Title { get; set; } + + /// + /// Gets or sets whether the object is required. + /// + public bool? Required { get; set; } + + /// + /// Gets or sets whether the object is read only. + /// + public bool? ReadOnly { get; set; } + + /// + /// Gets or sets whether the object is visible to users. + /// + public bool? Hidden { get; set; } + + /// + /// Gets or sets whether the object is transient. + /// + public bool? Transient { get; set; } + + /// + /// Gets or sets the description of the object. + /// + public string Description { get; set; } + + /// + /// Gets or sets the types of values allowed by the object. + /// + /// The type. + public JsonSchemaType? Type { get; set; } + + /// + /// Gets or sets the pattern. + /// + /// The pattern. + public string Pattern { get; set; } + + /// + /// Gets or sets the minimum length. + /// + /// The minimum length. + public int? MinimumLength { get; set; } + + /// + /// Gets or sets the maximum length. + /// + /// The maximum length. + public int? MaximumLength { get; set; } + + /// + /// Gets or sets a number that the value should be divisble by. + /// + /// A number that the value should be divisble by. + public double? DivisibleBy { get; set; } + + /// + /// Gets or sets the minimum. + /// + /// The minimum. + public double? Minimum { get; set; } + + /// + /// Gets or sets the maximum. + /// + /// The maximum. + public double? Maximum { get; set; } + + /// + /// Gets or sets a flag indicating whether the value can not equal the number defined by the "minimum" attribute. + /// + /// A flag indicating whether the value can not equal the number defined by the "minimum" attribute. + public bool? ExclusiveMinimum { get; set; } + + /// + /// Gets or sets a flag indicating whether the value can not equal the number defined by the "maximum" attribute. + /// + /// A flag indicating whether the value can not equal the number defined by the "maximum" attribute. + public bool? ExclusiveMaximum { get; set; } + + /// + /// Gets or sets the minimum number of items. + /// + /// The minimum number of items. + public int? MinimumItems { get; set; } + + /// + /// Gets or sets the maximum number of items. + /// + /// The maximum number of items. + public int? MaximumItems { get; set; } + + /// + /// Gets or sets the of items. + /// + /// The of items. + public IList Items { get; set; } + + /// + /// Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + /// + /// + /// true if items are validated using their array position; otherwise, false. + /// + public bool PositionalItemsValidation { get; set; } + + /// + /// Gets or sets the of additional items. + /// + /// The of additional items. + public JsonSchema AdditionalItems { get; set; } + + /// + /// Gets or sets a value indicating whether additional items are allowed. + /// + /// + /// true if additional items are allowed; otherwise, false. + /// + public bool AllowAdditionalItems { get; set; } + + /// + /// Gets or sets whether the array items must be unique. + /// + public bool UniqueItems { get; set; } + + /// + /// Gets or sets the of properties. + /// + /// The of properties. + public IDictionary Properties { get; set; } + + /// + /// Gets or sets the of additional properties. + /// + /// The of additional properties. + public JsonSchema AdditionalProperties { get; set; } + + /// + /// Gets or sets the pattern properties. + /// + /// The pattern properties. + public IDictionary PatternProperties { get; set; } + + /// + /// Gets or sets a value indicating whether additional properties are allowed. + /// + /// + /// true if additional properties are allowed; otherwise, false. + /// + public bool AllowAdditionalProperties { get; set; } + + /// + /// Gets or sets the required property if this property is present. + /// + /// The required property if this property is present. + public string Requires { get; set; } + + /// + /// Gets or sets the a collection of valid enum values allowed. + /// + /// A collection of valid enum values allowed. + public IList Enum { get; set; } + + /// + /// Gets or sets disallowed types. + /// + /// The disallow types. + public JsonSchemaType? Disallow { get; set; } + + /// + /// Gets or sets the default value. + /// + /// The default value. + public JToken Default { get; set; } + + /// + /// Gets or sets the collection of that this schema extends. + /// + /// The collection of that this schema extends. + public IList Extends { get; set; } + + /// + /// Gets or sets the format. + /// + /// The format. + public string Format { get; set; } + + internal string Location { get; set; } + + private readonly string _internalId = Guid.NewGuid().ToString("N"); + + internal string InternalId + { + get { return _internalId; } + } + + // if this is set then this schema instance is just a deferred reference + // and will be replaced when the schema reference is resolved + internal string DeferredReference { get; set; } + internal bool ReferencesResolved { get; set; } + + /// + /// Initializes a new instance of the class. + /// + public JsonSchema() + { + AllowAdditionalProperties = true; + AllowAdditionalItems = true; + } + + /// + /// Reads a from the specified . + /// + /// The containing the JSON Schema to read. + /// The object representing the JSON Schema. + public static JsonSchema Read(JsonReader reader) + { + return Read(reader, new JsonSchemaResolver()); + } + + /// + /// Reads a from the specified . + /// + /// The containing the JSON Schema to read. + /// The to use when resolving schema references. + /// The object representing the JSON Schema. + public static JsonSchema Read(JsonReader reader, JsonSchemaResolver resolver) + { + ValidationUtils.ArgumentNotNull(reader, nameof(reader)); + ValidationUtils.ArgumentNotNull(resolver, nameof(resolver)); + + JsonSchemaBuilder builder = new JsonSchemaBuilder(resolver); + return builder.Read(reader); + } + + /// + /// Load a from a string that contains schema JSON. + /// + /// A that contains JSON. + /// A populated from the string that contains JSON. + public static JsonSchema Parse(string json) + { + return Parse(json, new JsonSchemaResolver()); + } + + /// + /// Parses the specified json. + /// + /// The json. + /// The resolver. + /// A populated from the string that contains JSON. + public static JsonSchema Parse(string json, JsonSchemaResolver resolver) + { + ValidationUtils.ArgumentNotNull(json, nameof(json)); + + using (JsonReader reader = new JsonTextReader(new StringReader(json))) + { + return Read(reader, resolver); + } + } + + /// + /// Writes this schema to a . + /// + /// A into which this method will write. + public void WriteTo(JsonWriter writer) + { + WriteTo(writer, new JsonSchemaResolver()); + } + + /// + /// Writes this schema to a using the specified . + /// + /// A into which this method will write. + /// The resolver used. + public void WriteTo(JsonWriter writer, JsonSchemaResolver resolver) + { + ValidationUtils.ArgumentNotNull(writer, nameof(writer)); + ValidationUtils.ArgumentNotNull(resolver, nameof(resolver)); + + JsonSchemaWriter schemaWriter = new JsonSchemaWriter(writer, resolver); + schemaWriter.WriteSchema(this); + } + + /// + /// Returns a that represents the current . + /// + /// + /// A that represents the current . + /// + public override string ToString() + { + StringWriter writer = new StringWriter(CultureInfo.InvariantCulture); + JsonTextWriter jsonWriter = new JsonTextWriter(writer); + jsonWriter.Formatting = Formatting.Indented; + + WriteTo(jsonWriter); + + return writer.ToString(); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaBuilder.cs b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaBuilder.cs new file mode 100644 index 0000000..6947520 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaBuilder.cs @@ -0,0 +1,495 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using Newtonsoft.Json.Serialization; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; +#endif +using System.Globalization; +using Newtonsoft.Json.Utilities; +using Newtonsoft.Json.Linq; + +namespace Newtonsoft.Json.Schema +{ + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + internal class JsonSchemaBuilder + { + private readonly IList _stack; + private readonly JsonSchemaResolver _resolver; + private readonly IDictionary _documentSchemas; + private JsonSchema _currentSchema; + private JObject _rootSchema; + + public JsonSchemaBuilder(JsonSchemaResolver resolver) + { + _stack = new List(); + _documentSchemas = new Dictionary(); + _resolver = resolver; + } + + private void Push(JsonSchema value) + { + _currentSchema = value; + _stack.Add(value); + _resolver.LoadedSchemas.Add(value); + _documentSchemas.Add(value.Location, value); + } + + private JsonSchema Pop() + { + JsonSchema poppedSchema = _currentSchema; + _stack.RemoveAt(_stack.Count - 1); + _currentSchema = _stack.LastOrDefault(); + + return poppedSchema; + } + + private JsonSchema CurrentSchema + { + get { return _currentSchema; } + } + + internal JsonSchema Read(JsonReader reader) + { + JToken schemaToken = JToken.ReadFrom(reader); + + _rootSchema = schemaToken as JObject; + + JsonSchema schema = BuildSchema(schemaToken); + + ResolveReferences(schema); + + return schema; + } + + private string UnescapeReference(string reference) + { + return Uri.UnescapeDataString(reference).Replace("~1", "/").Replace("~0", "~"); + } + + private JsonSchema ResolveReferences(JsonSchema schema) + { + if (schema.DeferredReference != null) + { + string reference = schema.DeferredReference; + + bool locationReference = (reference.StartsWith("#", StringComparison.Ordinal)); + if (locationReference) + { + reference = UnescapeReference(reference); + } + + JsonSchema resolvedSchema = _resolver.GetSchema(reference); + + if (resolvedSchema == null) + { + if (locationReference) + { + string[] escapedParts = schema.DeferredReference.TrimStart('#').Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries); + JToken currentToken = _rootSchema; + foreach (string escapedPart in escapedParts) + { + string part = UnescapeReference(escapedPart); + + if (currentToken.Type == JTokenType.Object) + { + currentToken = currentToken[part]; + } + else if (currentToken.Type == JTokenType.Array || currentToken.Type == JTokenType.Constructor) + { + int index; + if (int.TryParse(part, out index) && index >= 0 && index < currentToken.Count()) + { + currentToken = currentToken[index]; + } + else + { + currentToken = null; + } + } + + if (currentToken == null) + { + break; + } + } + + if (currentToken != null) + { + resolvedSchema = BuildSchema(currentToken); + } + } + + if (resolvedSchema == null) + { + throw new JsonException("Could not resolve schema reference '{0}'.".FormatWith(CultureInfo.InvariantCulture, schema.DeferredReference)); + } + } + + schema = resolvedSchema; + } + + if (schema.ReferencesResolved) + { + return schema; + } + + schema.ReferencesResolved = true; + + if (schema.Extends != null) + { + for (int i = 0; i < schema.Extends.Count; i++) + { + schema.Extends[i] = ResolveReferences(schema.Extends[i]); + } + } + + if (schema.Items != null) + { + for (int i = 0; i < schema.Items.Count; i++) + { + schema.Items[i] = ResolveReferences(schema.Items[i]); + } + } + + if (schema.AdditionalItems != null) + { + schema.AdditionalItems = ResolveReferences(schema.AdditionalItems); + } + + if (schema.PatternProperties != null) + { + foreach (KeyValuePair patternProperty in schema.PatternProperties.ToList()) + { + schema.PatternProperties[patternProperty.Key] = ResolveReferences(patternProperty.Value); + } + } + + if (schema.Properties != null) + { + foreach (KeyValuePair property in schema.Properties.ToList()) + { + schema.Properties[property.Key] = ResolveReferences(property.Value); + } + } + + if (schema.AdditionalProperties != null) + { + schema.AdditionalProperties = ResolveReferences(schema.AdditionalProperties); + } + + return schema; + } + + private JsonSchema BuildSchema(JToken token) + { + JObject schemaObject = token as JObject; + if (schemaObject == null) + { + throw JsonException.Create(token, token.Path, "Expected object while parsing schema object, got {0}.".FormatWith(CultureInfo.InvariantCulture, token.Type)); + } + + JToken referenceToken; + if (schemaObject.TryGetValue(JsonTypeReflector.RefPropertyName, out referenceToken)) + { + JsonSchema deferredSchema = new JsonSchema(); + deferredSchema.DeferredReference = (string)referenceToken; + + return deferredSchema; + } + + string location = token.Path.Replace(".", "/").Replace("[", "/").Replace("]", string.Empty); + if (!string.IsNullOrEmpty(location)) + { + location = "/" + location; + } + location = "#" + location; + + JsonSchema existingSchema; + if (_documentSchemas.TryGetValue(location, out existingSchema)) + { + return existingSchema; + } + + Push(new JsonSchema { Location = location }); + + ProcessSchemaProperties(schemaObject); + + return Pop(); + } + + private void ProcessSchemaProperties(JObject schemaObject) + { + foreach (KeyValuePair property in schemaObject) + { + switch (property.Key) + { + case JsonSchemaConstants.TypePropertyName: + CurrentSchema.Type = ProcessType(property.Value); + break; + case JsonSchemaConstants.IdPropertyName: + CurrentSchema.Id = (string)property.Value; + break; + case JsonSchemaConstants.TitlePropertyName: + CurrentSchema.Title = (string)property.Value; + break; + case JsonSchemaConstants.DescriptionPropertyName: + CurrentSchema.Description = (string)property.Value; + break; + case JsonSchemaConstants.PropertiesPropertyName: + CurrentSchema.Properties = ProcessProperties(property.Value); + break; + case JsonSchemaConstants.ItemsPropertyName: + ProcessItems(property.Value); + break; + case JsonSchemaConstants.AdditionalPropertiesPropertyName: + ProcessAdditionalProperties(property.Value); + break; + case JsonSchemaConstants.AdditionalItemsPropertyName: + ProcessAdditionalItems(property.Value); + break; + case JsonSchemaConstants.PatternPropertiesPropertyName: + CurrentSchema.PatternProperties = ProcessProperties(property.Value); + break; + case JsonSchemaConstants.RequiredPropertyName: + CurrentSchema.Required = (bool)property.Value; + break; + case JsonSchemaConstants.RequiresPropertyName: + CurrentSchema.Requires = (string)property.Value; + break; + case JsonSchemaConstants.MinimumPropertyName: + CurrentSchema.Minimum = (double)property.Value; + break; + case JsonSchemaConstants.MaximumPropertyName: + CurrentSchema.Maximum = (double)property.Value; + break; + case JsonSchemaConstants.ExclusiveMinimumPropertyName: + CurrentSchema.ExclusiveMinimum = (bool)property.Value; + break; + case JsonSchemaConstants.ExclusiveMaximumPropertyName: + CurrentSchema.ExclusiveMaximum = (bool)property.Value; + break; + case JsonSchemaConstants.MaximumLengthPropertyName: + CurrentSchema.MaximumLength = (int)property.Value; + break; + case JsonSchemaConstants.MinimumLengthPropertyName: + CurrentSchema.MinimumLength = (int)property.Value; + break; + case JsonSchemaConstants.MaximumItemsPropertyName: + CurrentSchema.MaximumItems = (int)property.Value; + break; + case JsonSchemaConstants.MinimumItemsPropertyName: + CurrentSchema.MinimumItems = (int)property.Value; + break; + case JsonSchemaConstants.DivisibleByPropertyName: + CurrentSchema.DivisibleBy = (double)property.Value; + break; + case JsonSchemaConstants.DisallowPropertyName: + CurrentSchema.Disallow = ProcessType(property.Value); + break; + case JsonSchemaConstants.DefaultPropertyName: + CurrentSchema.Default = property.Value.DeepClone(); + break; + case JsonSchemaConstants.HiddenPropertyName: + CurrentSchema.Hidden = (bool)property.Value; + break; + case JsonSchemaConstants.ReadOnlyPropertyName: + CurrentSchema.ReadOnly = (bool)property.Value; + break; + case JsonSchemaConstants.FormatPropertyName: + CurrentSchema.Format = (string)property.Value; + break; + case JsonSchemaConstants.PatternPropertyName: + CurrentSchema.Pattern = (string)property.Value; + break; + case JsonSchemaConstants.EnumPropertyName: + ProcessEnum(property.Value); + break; + case JsonSchemaConstants.ExtendsPropertyName: + ProcessExtends(property.Value); + break; + case JsonSchemaConstants.UniqueItemsPropertyName: + CurrentSchema.UniqueItems = (bool)property.Value; + break; + } + } + } + + private void ProcessExtends(JToken token) + { + IList schemas = new List(); + + if (token.Type == JTokenType.Array) + { + foreach (JToken schemaObject in token) + { + schemas.Add(BuildSchema(schemaObject)); + } + } + else + { + JsonSchema schema = BuildSchema(token); + if (schema != null) + { + schemas.Add(schema); + } + } + + if (schemas.Count > 0) + { + CurrentSchema.Extends = schemas; + } + } + + private void ProcessEnum(JToken token) + { + if (token.Type != JTokenType.Array) + { + throw JsonException.Create(token, token.Path, "Expected Array token while parsing enum values, got {0}.".FormatWith(CultureInfo.InvariantCulture, token.Type)); + } + + CurrentSchema.Enum = new List(); + + foreach (JToken enumValue in token) + { + CurrentSchema.Enum.Add(enumValue.DeepClone()); + } + } + + private void ProcessAdditionalProperties(JToken token) + { + if (token.Type == JTokenType.Boolean) + { + CurrentSchema.AllowAdditionalProperties = (bool)token; + } + else + { + CurrentSchema.AdditionalProperties = BuildSchema(token); + } + } + + private void ProcessAdditionalItems(JToken token) + { + if (token.Type == JTokenType.Boolean) + { + CurrentSchema.AllowAdditionalItems = (bool)token; + } + else + { + CurrentSchema.AdditionalItems = BuildSchema(token); + } + } + + private IDictionary ProcessProperties(JToken token) + { + IDictionary properties = new Dictionary(); + + if (token.Type != JTokenType.Object) + { + throw JsonException.Create(token, token.Path, "Expected Object token while parsing schema properties, got {0}.".FormatWith(CultureInfo.InvariantCulture, token.Type)); + } + + foreach (JProperty propertyToken in token) + { + if (properties.ContainsKey(propertyToken.Name)) + { + throw new JsonException("Property {0} has already been defined in schema.".FormatWith(CultureInfo.InvariantCulture, propertyToken.Name)); + } + + properties.Add(propertyToken.Name, BuildSchema(propertyToken.Value)); + } + + return properties; + } + + private void ProcessItems(JToken token) + { + CurrentSchema.Items = new List(); + + switch (token.Type) + { + case JTokenType.Object: + CurrentSchema.Items.Add(BuildSchema(token)); + CurrentSchema.PositionalItemsValidation = false; + break; + case JTokenType.Array: + CurrentSchema.PositionalItemsValidation = true; + foreach (JToken schemaToken in token) + { + CurrentSchema.Items.Add(BuildSchema(schemaToken)); + } + break; + default: + throw JsonException.Create(token, token.Path, "Expected array or JSON schema object, got {0}.".FormatWith(CultureInfo.InvariantCulture, token.Type)); + } + } + + private JsonSchemaType? ProcessType(JToken token) + { + switch (token.Type) + { + case JTokenType.Array: + // ensure type is in blank state before ORing values + JsonSchemaType? type = JsonSchemaType.None; + + foreach (JToken typeToken in token) + { + if (typeToken.Type != JTokenType.String) + { + throw JsonException.Create(typeToken, typeToken.Path, "Exception JSON schema type string token, got {0}.".FormatWith(CultureInfo.InvariantCulture, token.Type)); + } + + type = type | MapType((string)typeToken); + } + + return type; + case JTokenType.String: + return MapType((string)token); + default: + throw JsonException.Create(token, token.Path, "Expected array or JSON schema type string token, got {0}.".FormatWith(CultureInfo.InvariantCulture, token.Type)); + } + } + + internal static JsonSchemaType MapType(string type) + { + JsonSchemaType mappedType; + if (!JsonSchemaConstants.JsonSchemaTypeMapping.TryGetValue(type, out mappedType)) + { + throw new JsonException("Invalid JSON schema type: {0}".FormatWith(CultureInfo.InvariantCulture, type)); + } + + return mappedType; + } + + internal static string MapType(JsonSchemaType type) + { + return JsonSchemaConstants.JsonSchemaTypeMapping.Single(kv => kv.Value == type).Key; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaConstants.cs b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaConstants.cs new file mode 100644 index 0000000..2309a52 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaConstants.cs @@ -0,0 +1,80 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; + +namespace Newtonsoft.Json.Schema +{ + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + internal static class JsonSchemaConstants + { + public const string TypePropertyName = "type"; + public const string PropertiesPropertyName = "properties"; + public const string ItemsPropertyName = "items"; + public const string AdditionalItemsPropertyName = "additionalItems"; + public const string RequiredPropertyName = "required"; + public const string PatternPropertiesPropertyName = "patternProperties"; + public const string AdditionalPropertiesPropertyName = "additionalProperties"; + public const string RequiresPropertyName = "requires"; + public const string MinimumPropertyName = "minimum"; + public const string MaximumPropertyName = "maximum"; + public const string ExclusiveMinimumPropertyName = "exclusiveMinimum"; + public const string ExclusiveMaximumPropertyName = "exclusiveMaximum"; + public const string MinimumItemsPropertyName = "minItems"; + public const string MaximumItemsPropertyName = "maxItems"; + public const string PatternPropertyName = "pattern"; + public const string MaximumLengthPropertyName = "maxLength"; + public const string MinimumLengthPropertyName = "minLength"; + public const string EnumPropertyName = "enum"; + public const string ReadOnlyPropertyName = "readonly"; + public const string TitlePropertyName = "title"; + public const string DescriptionPropertyName = "description"; + public const string FormatPropertyName = "format"; + public const string DefaultPropertyName = "default"; + public const string TransientPropertyName = "transient"; + public const string DivisibleByPropertyName = "divisibleBy"; + public const string HiddenPropertyName = "hidden"; + public const string DisallowPropertyName = "disallow"; + public const string ExtendsPropertyName = "extends"; + public const string IdPropertyName = "id"; + public const string UniqueItemsPropertyName = "uniqueItems"; + + public const string OptionValuePropertyName = "value"; + public const string OptionLabelPropertyName = "label"; + + public static readonly IDictionary JsonSchemaTypeMapping = new Dictionary + { + { "string", JsonSchemaType.String }, + { "object", JsonSchemaType.Object }, + { "integer", JsonSchemaType.Integer }, + { "number", JsonSchemaType.Float }, + { "null", JsonSchemaType.Null }, + { "boolean", JsonSchemaType.Boolean }, + { "array", JsonSchemaType.Array }, + { "any", JsonSchemaType.Any } + }; + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaException.cs b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaException.cs new file mode 100644 index 0000000..f9503db --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaException.cs @@ -0,0 +1,113 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Runtime.Serialization; + +namespace Newtonsoft.Json.Schema +{ + /// + /// + /// Returns detailed information about the schema exception. + /// + /// + /// JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. + /// + /// +#if !(DOTNET || PORTABLE40 || PORTABLE) + [Serializable] +#endif + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + public class JsonSchemaException : JsonException + { + /// + /// Gets the line number indicating where the error occurred. + /// + /// The line number indicating where the error occurred. + public int LineNumber { get; private set; } + + /// + /// Gets the line position indicating where the error occurred. + /// + /// The line position indicating where the error occurred. + public int LinePosition { get; private set; } + + /// + /// Gets the path to the JSON where the error occurred. + /// + /// The path to the JSON where the error occurred. + public string Path { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + public JsonSchemaException() + { + } + + /// + /// Initializes a new instance of the class + /// with a specified error message. + /// + /// The error message that explains the reason for the exception. + public JsonSchemaException(string message) + : base(message) + { + } + + /// + /// Initializes a new instance of the class + /// with a specified error message and a reference to the inner exception that is the cause of this exception. + /// + /// The error message that explains the reason for the exception. + /// The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + public JsonSchemaException(string message, Exception innerException) + : base(message, innerException) + { + } + +#if !(DOTNET || PORTABLE40 || PORTABLE) + /// + /// Initializes a new instance of the class. + /// + /// The that holds the serialized object data about the exception being thrown. + /// The that contains contextual information about the source or destination. + /// The parameter is null. + /// The class name is null or is zero (0). + public JsonSchemaException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } +#endif + + internal JsonSchemaException(string message, Exception innerException, string path, int lineNumber, int linePosition) + : base(message, innerException) + { + Path = path; + LineNumber = lineNumber; + LinePosition = linePosition; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaGenerator.cs b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaGenerator.cs new file mode 100644 index 0000000..f003fdc --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaGenerator.cs @@ -0,0 +1,515 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Globalization; +using System.ComponentModel; +using System.Collections.Generic; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Utilities; +using Newtonsoft.Json.Serialization; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Schema +{ + /// + /// + /// Generates a from a specified . + /// + /// + /// JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. + /// + /// + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + public class JsonSchemaGenerator + { + /// + /// Gets or sets how undefined schemas are handled by the serializer. + /// + public UndefinedSchemaIdHandling UndefinedSchemaIdHandling { get; set; } + + private IContractResolver _contractResolver; + + /// + /// Gets or sets the contract resolver. + /// + /// The contract resolver. + public IContractResolver ContractResolver + { + get + { + if (_contractResolver == null) + { + return DefaultContractResolver.Instance; + } + + return _contractResolver; + } + set { _contractResolver = value; } + } + + private class TypeSchema + { + public Type Type { get; private set; } + public JsonSchema Schema { get; private set; } + + public TypeSchema(Type type, JsonSchema schema) + { + ValidationUtils.ArgumentNotNull(type, nameof(type)); + ValidationUtils.ArgumentNotNull(schema, nameof(schema)); + + Type = type; + Schema = schema; + } + } + + private JsonSchemaResolver _resolver; + private readonly IList _stack = new List(); + private JsonSchema _currentSchema; + + private JsonSchema CurrentSchema + { + get { return _currentSchema; } + } + + private void Push(TypeSchema typeSchema) + { + _currentSchema = typeSchema.Schema; + _stack.Add(typeSchema); + _resolver.LoadedSchemas.Add(typeSchema.Schema); + } + + private TypeSchema Pop() + { + TypeSchema popped = _stack[_stack.Count - 1]; + _stack.RemoveAt(_stack.Count - 1); + TypeSchema newValue = _stack.LastOrDefault(); + if (newValue != null) + { + _currentSchema = newValue.Schema; + } + else + { + _currentSchema = null; + } + + return popped; + } + + /// + /// Generate a from the specified type. + /// + /// The type to generate a from. + /// A generated from the specified type. + public JsonSchema Generate(Type type) + { + return Generate(type, new JsonSchemaResolver(), false); + } + + /// + /// Generate a from the specified type. + /// + /// The type to generate a from. + /// The used to resolve schema references. + /// A generated from the specified type. + public JsonSchema Generate(Type type, JsonSchemaResolver resolver) + { + return Generate(type, resolver, false); + } + + /// + /// Generate a from the specified type. + /// + /// The type to generate a from. + /// Specify whether the generated root will be nullable. + /// A generated from the specified type. + public JsonSchema Generate(Type type, bool rootSchemaNullable) + { + return Generate(type, new JsonSchemaResolver(), rootSchemaNullable); + } + + /// + /// Generate a from the specified type. + /// + /// The type to generate a from. + /// The used to resolve schema references. + /// Specify whether the generated root will be nullable. + /// A generated from the specified type. + public JsonSchema Generate(Type type, JsonSchemaResolver resolver, bool rootSchemaNullable) + { + ValidationUtils.ArgumentNotNull(type, nameof(type)); + ValidationUtils.ArgumentNotNull(resolver, nameof(resolver)); + + _resolver = resolver; + + return GenerateInternal(type, (!rootSchemaNullable) ? Required.Always : Required.Default, false); + } + + private string GetTitle(Type type) + { + JsonContainerAttribute containerAttribute = JsonTypeReflector.GetCachedAttribute(type); + + if (containerAttribute != null && !string.IsNullOrEmpty(containerAttribute.Title)) + { + return containerAttribute.Title; + } + + return null; + } + + private string GetDescription(Type type) + { + JsonContainerAttribute containerAttribute = JsonTypeReflector.GetCachedAttribute(type); + + if (containerAttribute != null && !string.IsNullOrEmpty(containerAttribute.Description)) + { + return containerAttribute.Description; + } + +#if !(DOTNET || PORTABLE40 || PORTABLE) + DescriptionAttribute descriptionAttribute = ReflectionUtils.GetAttribute(type); + if (descriptionAttribute != null) + { + return descriptionAttribute.Description; + } +#endif + + return null; + } + + private string GetTypeId(Type type, bool explicitOnly) + { + JsonContainerAttribute containerAttribute = JsonTypeReflector.GetCachedAttribute(type); + + if (containerAttribute != null && !string.IsNullOrEmpty(containerAttribute.Id)) + { + return containerAttribute.Id; + } + + if (explicitOnly) + { + return null; + } + + switch (UndefinedSchemaIdHandling) + { + case UndefinedSchemaIdHandling.UseTypeName: + return type.FullName; + case UndefinedSchemaIdHandling.UseAssemblyQualifiedName: + return type.AssemblyQualifiedName; + default: + return null; + } + } + + private JsonSchema GenerateInternal(Type type, Required valueRequired, bool required) + { + ValidationUtils.ArgumentNotNull(type, nameof(type)); + + string resolvedId = GetTypeId(type, false); + string explicitId = GetTypeId(type, true); + + if (!string.IsNullOrEmpty(resolvedId)) + { + JsonSchema resolvedSchema = _resolver.GetSchema(resolvedId); + if (resolvedSchema != null) + { + // resolved schema is not null but referencing member allows nulls + // change resolved schema to allow nulls. hacky but what are ya gonna do? + if (valueRequired != Required.Always && !HasFlag(resolvedSchema.Type, JsonSchemaType.Null)) + { + resolvedSchema.Type |= JsonSchemaType.Null; + } + if (required && resolvedSchema.Required != true) + { + resolvedSchema.Required = true; + } + + return resolvedSchema; + } + } + + // test for unresolved circular reference + if (_stack.Any(tc => tc.Type == type)) + { + throw new JsonException("Unresolved circular reference for type '{0}'. Explicitly define an Id for the type using a JsonObject/JsonArray attribute or automatically generate a type Id using the UndefinedSchemaIdHandling property.".FormatWith(CultureInfo.InvariantCulture, type)); + } + + JsonContract contract = ContractResolver.ResolveContract(type); + JsonConverter converter; + if ((converter = contract.Converter) != null || (converter = contract.InternalConverter) != null) + { + JsonSchema converterSchema = converter.GetSchema(); + if (converterSchema != null) + { + return converterSchema; + } + } + + Push(new TypeSchema(type, new JsonSchema())); + + if (explicitId != null) + { + CurrentSchema.Id = explicitId; + } + + if (required) + { + CurrentSchema.Required = true; + } + CurrentSchema.Title = GetTitle(type); + CurrentSchema.Description = GetDescription(type); + + if (converter != null) + { + // todo: Add GetSchema to JsonConverter and use here? + CurrentSchema.Type = JsonSchemaType.Any; + } + else + { + switch (contract.ContractType) + { + case JsonContractType.Object: + CurrentSchema.Type = AddNullType(JsonSchemaType.Object, valueRequired); + CurrentSchema.Id = GetTypeId(type, false); + GenerateObjectSchema(type, (JsonObjectContract)contract); + break; + case JsonContractType.Array: + CurrentSchema.Type = AddNullType(JsonSchemaType.Array, valueRequired); + + CurrentSchema.Id = GetTypeId(type, false); + + JsonArrayAttribute arrayAttribute = JsonTypeReflector.GetCachedAttribute(type); + bool allowNullItem = (arrayAttribute == null || arrayAttribute.AllowNullItems); + + Type collectionItemType = ReflectionUtils.GetCollectionItemType(type); + if (collectionItemType != null) + { + CurrentSchema.Items = new List(); + CurrentSchema.Items.Add(GenerateInternal(collectionItemType, (!allowNullItem) ? Required.Always : Required.Default, false)); + } + break; + case JsonContractType.Primitive: + CurrentSchema.Type = GetJsonSchemaType(type, valueRequired); + + if (CurrentSchema.Type == JsonSchemaType.Integer && type.IsEnum() && !type.IsDefined(typeof(FlagsAttribute), true)) + { + CurrentSchema.Enum = new List(); + + IList> enumValues = EnumUtils.GetNamesAndValues(type); + foreach (EnumValue enumValue in enumValues) + { + JToken value = JToken.FromObject(enumValue.Value); + + CurrentSchema.Enum.Add(value); + } + } + break; + case JsonContractType.String: + JsonSchemaType schemaType = (!ReflectionUtils.IsNullable(contract.UnderlyingType)) + ? JsonSchemaType.String + : AddNullType(JsonSchemaType.String, valueRequired); + + CurrentSchema.Type = schemaType; + break; + case JsonContractType.Dictionary: + CurrentSchema.Type = AddNullType(JsonSchemaType.Object, valueRequired); + + Type keyType; + Type valueType; + ReflectionUtils.GetDictionaryKeyValueTypes(type, out keyType, out valueType); + + if (keyType != null) + { + JsonContract keyContract = ContractResolver.ResolveContract(keyType); + + // can be converted to a string + if (keyContract.ContractType == JsonContractType.Primitive) + { + CurrentSchema.AdditionalProperties = GenerateInternal(valueType, Required.Default, false); + } + } + break; +#if !(DOTNET || PORTABLE || PORTABLE40) + case JsonContractType.Serializable: + CurrentSchema.Type = AddNullType(JsonSchemaType.Object, valueRequired); + CurrentSchema.Id = GetTypeId(type, false); + GenerateISerializableContract(type, (JsonISerializableContract)contract); + break; +#endif +#if !(NET35 || NET20 || PORTABLE40) + case JsonContractType.Dynamic: +#endif + case JsonContractType.Linq: + CurrentSchema.Type = JsonSchemaType.Any; + break; + default: + throw new JsonException("Unexpected contract type: {0}".FormatWith(CultureInfo.InvariantCulture, contract)); + } + } + + return Pop().Schema; + } + + private JsonSchemaType AddNullType(JsonSchemaType type, Required valueRequired) + { + if (valueRequired != Required.Always) + { + return type | JsonSchemaType.Null; + } + + return type; + } + + private bool HasFlag(DefaultValueHandling value, DefaultValueHandling flag) + { + return ((value & flag) == flag); + } + + private void GenerateObjectSchema(Type type, JsonObjectContract contract) + { + CurrentSchema.Properties = new Dictionary(); + foreach (JsonProperty property in contract.Properties) + { + if (!property.Ignored) + { + bool optional = property.NullValueHandling == NullValueHandling.Ignore || + HasFlag(property.DefaultValueHandling.GetValueOrDefault(), DefaultValueHandling.Ignore) || + property.ShouldSerialize != null || + property.GetIsSpecified != null; + + JsonSchema propertySchema = GenerateInternal(property.PropertyType, property.Required, !optional); + + if (property.DefaultValue != null) + { + propertySchema.Default = JToken.FromObject(property.DefaultValue); + } + + CurrentSchema.Properties.Add(property.PropertyName, propertySchema); + } + } + + if (type.IsSealed()) + { + CurrentSchema.AllowAdditionalProperties = false; + } + } + +#if !(DOTNET || PORTABLE || PORTABLE40) + private void GenerateISerializableContract(Type type, JsonISerializableContract contract) + { + CurrentSchema.AllowAdditionalProperties = true; + } +#endif + + internal static bool HasFlag(JsonSchemaType? value, JsonSchemaType flag) + { + // default value is Any + if (value == null) + { + return true; + } + + bool match = ((value & flag) == flag); + if (match) + { + return true; + } + + // integer is a subset of float + if (flag == JsonSchemaType.Integer && (value & JsonSchemaType.Float) == JsonSchemaType.Float) + { + return true; + } + + return false; + } + + private JsonSchemaType GetJsonSchemaType(Type type, Required valueRequired) + { + JsonSchemaType schemaType = JsonSchemaType.None; + if (valueRequired != Required.Always && ReflectionUtils.IsNullable(type)) + { + schemaType = JsonSchemaType.Null; + if (ReflectionUtils.IsNullableType(type)) + { + type = Nullable.GetUnderlyingType(type); + } + } + + PrimitiveTypeCode typeCode = ConvertUtils.GetTypeCode(type); + + switch (typeCode) + { + case PrimitiveTypeCode.Empty: + case PrimitiveTypeCode.Object: + return schemaType | JsonSchemaType.String; +#if !(DOTNET || PORTABLE) + case PrimitiveTypeCode.DBNull: + return schemaType | JsonSchemaType.Null; +#endif + case PrimitiveTypeCode.Boolean: + return schemaType | JsonSchemaType.Boolean; + case PrimitiveTypeCode.Char: + return schemaType | JsonSchemaType.String; + case PrimitiveTypeCode.SByte: + case PrimitiveTypeCode.Byte: + case PrimitiveTypeCode.Int16: + case PrimitiveTypeCode.UInt16: + case PrimitiveTypeCode.Int32: + case PrimitiveTypeCode.UInt32: + case PrimitiveTypeCode.Int64: + case PrimitiveTypeCode.UInt64: +#if !(PORTABLE || NET35 || NET20) + case PrimitiveTypeCode.BigInteger: +#endif + return schemaType | JsonSchemaType.Integer; + case PrimitiveTypeCode.Single: + case PrimitiveTypeCode.Double: + case PrimitiveTypeCode.Decimal: + return schemaType | JsonSchemaType.Float; + // convert to string? + case PrimitiveTypeCode.DateTime: +#if !NET20 + case PrimitiveTypeCode.DateTimeOffset: +#endif + return schemaType | JsonSchemaType.String; + case PrimitiveTypeCode.String: + case PrimitiveTypeCode.Uri: + case PrimitiveTypeCode.Guid: + case PrimitiveTypeCode.TimeSpan: + case PrimitiveTypeCode.Bytes: + return schemaType | JsonSchemaType.String; + default: + throw new JsonException("Unexpected type code '{0}' for type '{1}'.".FormatWith(CultureInfo.InvariantCulture, typeCode, type)); + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaModel.cs b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaModel.cs new file mode 100644 index 0000000..7ff9706 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaModel.cs @@ -0,0 +1,125 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Schema +{ + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + internal class JsonSchemaModel + { + public bool Required { get; set; } + public JsonSchemaType Type { get; set; } + public int? MinimumLength { get; set; } + public int? MaximumLength { get; set; } + public double? DivisibleBy { get; set; } + public double? Minimum { get; set; } + public double? Maximum { get; set; } + public bool ExclusiveMinimum { get; set; } + public bool ExclusiveMaximum { get; set; } + public int? MinimumItems { get; set; } + public int? MaximumItems { get; set; } + public IList Patterns { get; set; } + public IList Items { get; set; } + public IDictionary Properties { get; set; } + public IDictionary PatternProperties { get; set; } + public JsonSchemaModel AdditionalProperties { get; set; } + public JsonSchemaModel AdditionalItems { get; set; } + public bool PositionalItemsValidation { get; set; } + public bool AllowAdditionalProperties { get; set; } + public bool AllowAdditionalItems { get; set; } + public bool UniqueItems { get; set; } + public IList Enum { get; set; } + public JsonSchemaType Disallow { get; set; } + + public JsonSchemaModel() + { + Type = JsonSchemaType.Any; + AllowAdditionalProperties = true; + AllowAdditionalItems = true; + Required = false; + } + + public static JsonSchemaModel Create(IList schemata) + { + JsonSchemaModel model = new JsonSchemaModel(); + + foreach (JsonSchema schema in schemata) + { + Combine(model, schema); + } + + return model; + } + + private static void Combine(JsonSchemaModel model, JsonSchema schema) + { + // Version 3 of the Draft JSON Schema has the default value of Not Required + model.Required = model.Required || (schema.Required ?? false); + model.Type = model.Type & (schema.Type ?? JsonSchemaType.Any); + + model.MinimumLength = MathUtils.Max(model.MinimumLength, schema.MinimumLength); + model.MaximumLength = MathUtils.Min(model.MaximumLength, schema.MaximumLength); + + // not sure what is the best way to combine divisibleBy + model.DivisibleBy = MathUtils.Max(model.DivisibleBy, schema.DivisibleBy); + + model.Minimum = MathUtils.Max(model.Minimum, schema.Minimum); + model.Maximum = MathUtils.Max(model.Maximum, schema.Maximum); + model.ExclusiveMinimum = model.ExclusiveMinimum || (schema.ExclusiveMinimum ?? false); + model.ExclusiveMaximum = model.ExclusiveMaximum || (schema.ExclusiveMaximum ?? false); + + model.MinimumItems = MathUtils.Max(model.MinimumItems, schema.MinimumItems); + model.MaximumItems = MathUtils.Min(model.MaximumItems, schema.MaximumItems); + model.PositionalItemsValidation = model.PositionalItemsValidation || schema.PositionalItemsValidation; + model.AllowAdditionalProperties = model.AllowAdditionalProperties && schema.AllowAdditionalProperties; + model.AllowAdditionalItems = model.AllowAdditionalItems && schema.AllowAdditionalItems; + model.UniqueItems = model.UniqueItems || schema.UniqueItems; + if (schema.Enum != null) + { + if (model.Enum == null) + { + model.Enum = new List(); + } + + model.Enum.AddRangeDistinct(schema.Enum, JToken.EqualityComparer); + } + model.Disallow = model.Disallow | (schema.Disallow ?? JsonSchemaType.None); + + if (schema.Pattern != null) + { + if (model.Patterns == null) + { + model.Patterns = new List(); + } + + model.Patterns.AddDistinct(schema.Pattern); + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaModelBuilder.cs b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaModelBuilder.cs new file mode 100644 index 0000000..84b8c85 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaModelBuilder.cs @@ -0,0 +1,213 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Schema +{ + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + internal class JsonSchemaModelBuilder + { + private JsonSchemaNodeCollection _nodes = new JsonSchemaNodeCollection(); + private Dictionary _nodeModels = new Dictionary(); + private JsonSchemaNode _node; + + public JsonSchemaModel Build(JsonSchema schema) + { + _nodes = new JsonSchemaNodeCollection(); + _node = AddSchema(null, schema); + + _nodeModels = new Dictionary(); + JsonSchemaModel model = BuildNodeModel(_node); + + return model; + } + + public JsonSchemaNode AddSchema(JsonSchemaNode existingNode, JsonSchema schema) + { + string newId; + if (existingNode != null) + { + if (existingNode.Schemas.Contains(schema)) + { + return existingNode; + } + + newId = JsonSchemaNode.GetId(existingNode.Schemas.Union(new[] { schema })); + } + else + { + newId = JsonSchemaNode.GetId(new[] { schema }); + } + + if (_nodes.Contains(newId)) + { + return _nodes[newId]; + } + + JsonSchemaNode currentNode = (existingNode != null) + ? existingNode.Combine(schema) + : new JsonSchemaNode(schema); + + _nodes.Add(currentNode); + + AddProperties(schema.Properties, currentNode.Properties); + + AddProperties(schema.PatternProperties, currentNode.PatternProperties); + + if (schema.Items != null) + { + for (int i = 0; i < schema.Items.Count; i++) + { + AddItem(currentNode, i, schema.Items[i]); + } + } + + if (schema.AdditionalItems != null) + { + AddAdditionalItems(currentNode, schema.AdditionalItems); + } + + if (schema.AdditionalProperties != null) + { + AddAdditionalProperties(currentNode, schema.AdditionalProperties); + } + + if (schema.Extends != null) + { + foreach (JsonSchema jsonSchema in schema.Extends) + { + currentNode = AddSchema(currentNode, jsonSchema); + } + } + + return currentNode; + } + + public void AddProperties(IDictionary source, IDictionary target) + { + if (source != null) + { + foreach (KeyValuePair property in source) + { + AddProperty(target, property.Key, property.Value); + } + } + } + + public void AddProperty(IDictionary target, string propertyName, JsonSchema schema) + { + JsonSchemaNode propertyNode; + target.TryGetValue(propertyName, out propertyNode); + + target[propertyName] = AddSchema(propertyNode, schema); + } + + public void AddItem(JsonSchemaNode parentNode, int index, JsonSchema schema) + { + JsonSchemaNode existingItemNode = (parentNode.Items.Count > index) + ? parentNode.Items[index] + : null; + + JsonSchemaNode newItemNode = AddSchema(existingItemNode, schema); + + if (!(parentNode.Items.Count > index)) + { + parentNode.Items.Add(newItemNode); + } + else + { + parentNode.Items[index] = newItemNode; + } + } + + public void AddAdditionalProperties(JsonSchemaNode parentNode, JsonSchema schema) + { + parentNode.AdditionalProperties = AddSchema(parentNode.AdditionalProperties, schema); + } + + public void AddAdditionalItems(JsonSchemaNode parentNode, JsonSchema schema) + { + parentNode.AdditionalItems = AddSchema(parentNode.AdditionalItems, schema); + } + + private JsonSchemaModel BuildNodeModel(JsonSchemaNode node) + { + JsonSchemaModel model; + if (_nodeModels.TryGetValue(node, out model)) + { + return model; + } + + model = JsonSchemaModel.Create(node.Schemas); + _nodeModels[node] = model; + + foreach (KeyValuePair property in node.Properties) + { + if (model.Properties == null) + { + model.Properties = new Dictionary(); + } + + model.Properties[property.Key] = BuildNodeModel(property.Value); + } + foreach (KeyValuePair property in node.PatternProperties) + { + if (model.PatternProperties == null) + { + model.PatternProperties = new Dictionary(); + } + + model.PatternProperties[property.Key] = BuildNodeModel(property.Value); + } + foreach (JsonSchemaNode t in node.Items) + { + if (model.Items == null) + { + model.Items = new List(); + } + + model.Items.Add(BuildNodeModel(t)); + } + if (node.AdditionalProperties != null) + { + model.AdditionalProperties = BuildNodeModel(node.AdditionalProperties); + } + if (node.AdditionalItems != null) + { + model.AdditionalItems = BuildNodeModel(node.AdditionalItems); + } + + return model; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaNode.cs b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaNode.cs new file mode 100644 index 0000000..05ca2de --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaNode.cs @@ -0,0 +1,81 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Schema +{ + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + internal class JsonSchemaNode + { + public string Id { get; private set; } + public ReadOnlyCollection Schemas { get; private set; } + public Dictionary Properties { get; private set; } + public Dictionary PatternProperties { get; private set; } + public List Items { get; private set; } + public JsonSchemaNode AdditionalProperties { get; set; } + public JsonSchemaNode AdditionalItems { get; set; } + + public JsonSchemaNode(JsonSchema schema) + { + Schemas = new ReadOnlyCollection(new[] { schema }); + Properties = new Dictionary(); + PatternProperties = new Dictionary(); + Items = new List(); + + Id = GetId(Schemas); + } + + private JsonSchemaNode(JsonSchemaNode source, JsonSchema schema) + { + Schemas = new ReadOnlyCollection(source.Schemas.Union(new[] { schema }).ToList()); + Properties = new Dictionary(source.Properties); + PatternProperties = new Dictionary(source.PatternProperties); + Items = new List(source.Items); + AdditionalProperties = source.AdditionalProperties; + AdditionalItems = source.AdditionalItems; + + Id = GetId(Schemas); + } + + public JsonSchemaNode Combine(JsonSchema schema) + { + return new JsonSchemaNode(this, schema); + } + + public static string GetId(IEnumerable schemata) + { + return string.Join("-", schemata.Select(s => s.InternalId).OrderBy(id => id, StringComparer.Ordinal).ToArray()); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaNodeCollection.cs b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaNodeCollection.cs new file mode 100644 index 0000000..c96ab22 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaNodeCollection.cs @@ -0,0 +1,39 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.ObjectModel; + +namespace Newtonsoft.Json.Schema +{ + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + internal class JsonSchemaNodeCollection : KeyedCollection + { + protected override string GetKeyForItem(JsonSchemaNode item) + { + return item.Id; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaResolver.cs b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaResolver.cs new file mode 100644 index 0000000..5a8e6ce --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaResolver.cs @@ -0,0 +1,79 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Schema +{ + /// + /// + /// Resolves from an id. + /// + /// + /// JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. + /// + /// + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + public class JsonSchemaResolver + { + /// + /// Gets or sets the loaded schemas. + /// + /// The loaded schemas. + public IList LoadedSchemas { get; protected set; } + + /// + /// Initializes a new instance of the class. + /// + public JsonSchemaResolver() + { + LoadedSchemas = new List(); + } + + /// + /// Gets a for the specified reference. + /// + /// The id. + /// A for the specified reference. + public virtual JsonSchema GetSchema(string reference) + { + JsonSchema schema = LoadedSchemas.SingleOrDefault(s => string.Equals(s.Id, reference, StringComparison.Ordinal)); + + if (schema == null) + { + schema = LoadedSchemas.SingleOrDefault(s => string.Equals(s.Location, reference, StringComparison.Ordinal)); + } + + return schema; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaType.cs b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaType.cs new file mode 100644 index 0000000..c8af6bc --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaType.cs @@ -0,0 +1,87 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json.Schema +{ + /// + /// + /// The value types allowed by the . + /// + /// + /// JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. + /// + /// + [Flags] + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + public enum JsonSchemaType + { + /// + /// No type specified. + /// + None = 0, + + /// + /// String type. + /// + String = 1, + + /// + /// Float type. + /// + Float = 2, + + /// + /// Integer type. + /// + Integer = 4, + + /// + /// Boolean type. + /// + Boolean = 8, + + /// + /// Object type. + /// + Object = 16, + + /// + /// Array type. + /// + Array = 32, + + /// + /// Null type. + /// + Null = 64, + + /// + /// Any type. + /// + Any = String | Float | Integer | Boolean | Object | Array | Null + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaWriter.cs b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaWriter.cs new file mode 100644 index 0000000..c4d64ed --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Schema/JsonSchemaWriter.cs @@ -0,0 +1,259 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; +using Newtonsoft.Json.Utilities; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Schema +{ + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + internal class JsonSchemaWriter + { + private readonly JsonWriter _writer; + private readonly JsonSchemaResolver _resolver; + + public JsonSchemaWriter(JsonWriter writer, JsonSchemaResolver resolver) + { + ValidationUtils.ArgumentNotNull(writer, nameof(writer)); + _writer = writer; + _resolver = resolver; + } + + private void ReferenceOrWriteSchema(JsonSchema schema) + { + if (schema.Id != null && _resolver.GetSchema(schema.Id) != null) + { + _writer.WriteStartObject(); + _writer.WritePropertyName(JsonTypeReflector.RefPropertyName); + _writer.WriteValue(schema.Id); + _writer.WriteEndObject(); + } + else + { + WriteSchema(schema); + } + } + + public void WriteSchema(JsonSchema schema) + { + ValidationUtils.ArgumentNotNull(schema, nameof(schema)); + + if (!_resolver.LoadedSchemas.Contains(schema)) + { + _resolver.LoadedSchemas.Add(schema); + } + + _writer.WriteStartObject(); + WritePropertyIfNotNull(_writer, JsonSchemaConstants.IdPropertyName, schema.Id); + WritePropertyIfNotNull(_writer, JsonSchemaConstants.TitlePropertyName, schema.Title); + WritePropertyIfNotNull(_writer, JsonSchemaConstants.DescriptionPropertyName, schema.Description); + WritePropertyIfNotNull(_writer, JsonSchemaConstants.RequiredPropertyName, schema.Required); + WritePropertyIfNotNull(_writer, JsonSchemaConstants.ReadOnlyPropertyName, schema.ReadOnly); + WritePropertyIfNotNull(_writer, JsonSchemaConstants.HiddenPropertyName, schema.Hidden); + WritePropertyIfNotNull(_writer, JsonSchemaConstants.TransientPropertyName, schema.Transient); + if (schema.Type != null) + { + WriteType(JsonSchemaConstants.TypePropertyName, _writer, schema.Type.GetValueOrDefault()); + } + if (!schema.AllowAdditionalProperties) + { + _writer.WritePropertyName(JsonSchemaConstants.AdditionalPropertiesPropertyName); + _writer.WriteValue(schema.AllowAdditionalProperties); + } + else + { + if (schema.AdditionalProperties != null) + { + _writer.WritePropertyName(JsonSchemaConstants.AdditionalPropertiesPropertyName); + ReferenceOrWriteSchema(schema.AdditionalProperties); + } + } + if (!schema.AllowAdditionalItems) + { + _writer.WritePropertyName(JsonSchemaConstants.AdditionalItemsPropertyName); + _writer.WriteValue(schema.AllowAdditionalItems); + } + else + { + if (schema.AdditionalItems != null) + { + _writer.WritePropertyName(JsonSchemaConstants.AdditionalItemsPropertyName); + ReferenceOrWriteSchema(schema.AdditionalItems); + } + } + WriteSchemaDictionaryIfNotNull(_writer, JsonSchemaConstants.PropertiesPropertyName, schema.Properties); + WriteSchemaDictionaryIfNotNull(_writer, JsonSchemaConstants.PatternPropertiesPropertyName, schema.PatternProperties); + WriteItems(schema); + WritePropertyIfNotNull(_writer, JsonSchemaConstants.MinimumPropertyName, schema.Minimum); + WritePropertyIfNotNull(_writer, JsonSchemaConstants.MaximumPropertyName, schema.Maximum); + WritePropertyIfNotNull(_writer, JsonSchemaConstants.ExclusiveMinimumPropertyName, schema.ExclusiveMinimum); + WritePropertyIfNotNull(_writer, JsonSchemaConstants.ExclusiveMaximumPropertyName, schema.ExclusiveMaximum); + WritePropertyIfNotNull(_writer, JsonSchemaConstants.MinimumLengthPropertyName, schema.MinimumLength); + WritePropertyIfNotNull(_writer, JsonSchemaConstants.MaximumLengthPropertyName, schema.MaximumLength); + WritePropertyIfNotNull(_writer, JsonSchemaConstants.MinimumItemsPropertyName, schema.MinimumItems); + WritePropertyIfNotNull(_writer, JsonSchemaConstants.MaximumItemsPropertyName, schema.MaximumItems); + WritePropertyIfNotNull(_writer, JsonSchemaConstants.DivisibleByPropertyName, schema.DivisibleBy); + WritePropertyIfNotNull(_writer, JsonSchemaConstants.FormatPropertyName, schema.Format); + WritePropertyIfNotNull(_writer, JsonSchemaConstants.PatternPropertyName, schema.Pattern); + if (schema.Enum != null) + { + _writer.WritePropertyName(JsonSchemaConstants.EnumPropertyName); + _writer.WriteStartArray(); + foreach (JToken token in schema.Enum) + { + token.WriteTo(_writer); + } + _writer.WriteEndArray(); + } + if (schema.Default != null) + { + _writer.WritePropertyName(JsonSchemaConstants.DefaultPropertyName); + schema.Default.WriteTo(_writer); + } + if (schema.Disallow != null) + { + WriteType(JsonSchemaConstants.DisallowPropertyName, _writer, schema.Disallow.GetValueOrDefault()); + } + if (schema.Extends != null && schema.Extends.Count > 0) + { + _writer.WritePropertyName(JsonSchemaConstants.ExtendsPropertyName); + if (schema.Extends.Count == 1) + { + ReferenceOrWriteSchema(schema.Extends[0]); + } + else + { + _writer.WriteStartArray(); + foreach (JsonSchema jsonSchema in schema.Extends) + { + ReferenceOrWriteSchema(jsonSchema); + } + _writer.WriteEndArray(); + } + } + _writer.WriteEndObject(); + } + + private void WriteSchemaDictionaryIfNotNull(JsonWriter writer, string propertyName, IDictionary properties) + { + if (properties != null) + { + writer.WritePropertyName(propertyName); + writer.WriteStartObject(); + foreach (KeyValuePair property in properties) + { + writer.WritePropertyName(property.Key); + ReferenceOrWriteSchema(property.Value); + } + writer.WriteEndObject(); + } + } + + private void WriteItems(JsonSchema schema) + { + if (schema.Items == null && !schema.PositionalItemsValidation) + { + return; + } + + _writer.WritePropertyName(JsonSchemaConstants.ItemsPropertyName); + + if (!schema.PositionalItemsValidation) + { + if (schema.Items != null && schema.Items.Count > 0) + { + ReferenceOrWriteSchema(schema.Items[0]); + } + else + { + _writer.WriteStartObject(); + _writer.WriteEndObject(); + } + return; + } + + _writer.WriteStartArray(); + if (schema.Items != null) + { + foreach (JsonSchema itemSchema in schema.Items) + { + ReferenceOrWriteSchema(itemSchema); + } + } + _writer.WriteEndArray(); + } + + private void WriteType(string propertyName, JsonWriter writer, JsonSchemaType type) + { + IList types; + if (System.Enum.IsDefined(typeof(JsonSchemaType), type)) + { + types = new List { type }; + } + else + { + types = EnumUtils.GetFlagsValues(type).Where(v => v != JsonSchemaType.None).ToList(); + } + + if (types.Count == 0) + { + return; + } + + writer.WritePropertyName(propertyName); + + if (types.Count == 1) + { + writer.WriteValue(JsonSchemaBuilder.MapType(types[0])); + return; + } + + writer.WriteStartArray(); + foreach (JsonSchemaType jsonSchemaType in types) + { + writer.WriteValue(JsonSchemaBuilder.MapType(jsonSchemaType)); + } + writer.WriteEndArray(); + } + + private void WritePropertyIfNotNull(JsonWriter writer, string propertyName, object value) + { + if (value != null) + { + writer.WritePropertyName(propertyName); + writer.WriteValue(value); + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Schema/UndefinedSchemaIdHandling.cs b/Common/00-1Json8.3/Json8.3/Schema/UndefinedSchemaIdHandling.cs new file mode 100644 index 0000000..dfff8b1 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Schema/UndefinedSchemaIdHandling.cs @@ -0,0 +1,56 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json.Schema +{ + /// + /// + /// Specifies undefined schema Id handling options for the . + /// + /// + /// JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. + /// + /// + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + public enum UndefinedSchemaIdHandling + { + /// + /// Do not infer a schema Id. + /// + None = 0, + + /// + /// Use the .NET type name as the schema Id. + /// + UseTypeName = 1, + + /// + /// Use the assembly qualified .NET type name as the schema Id. + /// + UseAssemblyQualifiedName = 2, + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Schema/ValidationEventArgs.cs b/Common/00-1Json8.3/Json8.3/Schema/ValidationEventArgs.cs new file mode 100644 index 0000000..b144459 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Schema/ValidationEventArgs.cs @@ -0,0 +1,77 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Schema +{ + /// + /// + /// Returns detailed information related to the . + /// + /// + /// JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. + /// + /// + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + public class ValidationEventArgs : EventArgs + { + private readonly JsonSchemaException _ex; + + internal ValidationEventArgs(JsonSchemaException ex) + { + ValidationUtils.ArgumentNotNull(ex, nameof(ex)); + _ex = ex; + } + + /// + /// Gets the associated with the validation error. + /// + /// The JsonSchemaException associated with the validation error. + public JsonSchemaException Exception + { + get { return _ex; } + } + + /// + /// Gets the path of the JSON location where the validation error occurred. + /// + /// The path of the JSON location where the validation error occurred. + public string Path + { + get { return _ex.Path; } + } + + /// + /// Gets the text description corresponding to the validation error. + /// + /// The text description. + public string Message + { + get { return _ex.Message; } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Schema/ValidationEventHandler.cs b/Common/00-1Json8.3/Json8.3/Schema/ValidationEventHandler.cs new file mode 100644 index 0000000..408d8c5 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Schema/ValidationEventHandler.cs @@ -0,0 +1,40 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json.Schema +{ + /// + /// + /// Represents the callback method that will handle JSON schema validation events and the . + /// + /// + /// JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. + /// + /// + [Obsolete("JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details.")] + public delegate void ValidationEventHandler(object sender, ValidationEventArgs e); +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/CachedAttributeGetter.cs b/Common/00-1Json8.3/Json8.3/Serialization/CachedAttributeGetter.cs new file mode 100644 index 0000000..0645631 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/CachedAttributeGetter.cs @@ -0,0 +1,41 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Reflection; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Serialization +{ + internal static class CachedAttributeGetter where T : Attribute + { + private static readonly ThreadSafeStore TypeAttributeCache = new ThreadSafeStore(JsonTypeReflector.GetAttribute); + + public static T GetAttribute(object type) + { + return TypeAttributeCache.Get(type); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/CamelCasePropertyNamesContractResolver.cs b/Common/00-1Json8.3/Json8.3/Serialization/CamelCasePropertyNamesContractResolver.cs new file mode 100644 index 0000000..ea9ee82 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/CamelCasePropertyNamesContractResolver.cs @@ -0,0 +1,57 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System.Globalization; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Resolves member mappings for a type, camel casing property names. + /// + public class CamelCasePropertyNamesContractResolver : DefaultContractResolver + { + /// + /// Initializes a new instance of the class. + /// + public CamelCasePropertyNamesContractResolver() +#pragma warning disable 612,618 + : base(true) +#pragma warning restore 612,618 + { + } + + /// + /// Resolves the name of the property. + /// + /// Name of the property. + /// The property name camel cased. + protected override string ResolvePropertyName(string propertyName) + { + // lower case the first letter (or more) of the passed in name + return StringUtils.ToCamelCase(propertyName); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/DefaultContractResolver.cs b/Common/00-1Json8.3/Json8.3/Serialization/DefaultContractResolver.cs new file mode 100644 index 0000000..bf97033 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/DefaultContractResolver.cs @@ -0,0 +1,1571 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections; +using Newtonsoft.Json.Schema; +#if !(NET35 || NET20 || PORTABLE || PORTABLE40) +using System.Collections.Concurrent; +#endif +using System.Collections.Generic; +using System.ComponentModel; +#if !(NET35 || NET20 || PORTABLE40) +using System.Dynamic; +#endif +using System.Globalization; +using System.Reflection; +using System.Runtime.Serialization; +#if !(DOTNET || PORTABLE || PORTABLE40) +using System.Security.Permissions; +#endif +using System.Xml.Serialization; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Utilities; +using Newtonsoft.Json.Linq; +using System.Runtime.CompilerServices; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Serialization +{ + internal struct ResolverContractKey : IEquatable + { + private readonly Type _resolverType; + private readonly Type _contractType; + + public ResolverContractKey(Type resolverType, Type contractType) + { + _resolverType = resolverType; + _contractType = contractType; + } + + public override int GetHashCode() + { + return _resolverType.GetHashCode() ^ _contractType.GetHashCode(); + } + + public override bool Equals(object obj) + { + if (!(obj is ResolverContractKey)) + { + return false; + } + + return Equals((ResolverContractKey)obj); + } + + public bool Equals(ResolverContractKey other) + { + return (_resolverType == other._resolverType && _contractType == other._contractType); + } + } + + internal class DefaultContractResolverState + { + public Dictionary ContractCache; + public PropertyNameTable NameTable = new PropertyNameTable(); + } + + /// + /// Used by to resolves a for a given . + /// + public class DefaultContractResolver : IContractResolver + { +#pragma warning disable 612,618 + private static readonly IContractResolver _instance = new DefaultContractResolver(true); +#pragma warning restore 612,618 + + internal static IContractResolver Instance + { + get { return _instance; } + } + + private static readonly JsonConverter[] BuiltInConverters = + { +#if !(NET20 || DOTNET || PORTABLE40 || PORTABLE) + new EntityKeyMemberConverter(), +#endif +#if !(NET35 || NET20 || PORTABLE40) + new ExpandoObjectConverter(), +#endif +#if !(PORTABLE40) + new XmlNodeConverter(), +#endif +#if !(DOTNET || PORTABLE40 || PORTABLE) + new BinaryConverter(), + new DataSetConverter(), + new DataTableConverter(), +#endif +#if !(NET35 || NET20) + new DiscriminatedUnionConverter(), +#endif + new KeyValuePairConverter(), + new BsonObjectIdConverter(), + new RegexConverter() + }; + + private static readonly object TypeContractCacheLock = new object(); + + private static readonly DefaultContractResolverState _sharedState = new DefaultContractResolverState(); + private readonly DefaultContractResolverState _instanceState = new DefaultContractResolverState(); + private readonly bool _sharedCache; + + /// + /// Gets a value indicating whether members are being get and set using dynamic code generation. + /// This value is determined by the runtime permissions available. + /// + /// + /// true if using dynamic code generation; otherwise, false. + /// + public bool DynamicCodeGeneration + { + get { return JsonTypeReflector.DynamicCodeGeneration; } + } + +#if !PORTABLE + /// + /// Gets or sets the default members search flags. + /// + /// The default members search flags. + [ObsoleteAttribute("DefaultMembersSearchFlags is obsolete. To modify the members serialized inherit from DefaultContractResolver and override the GetSerializableMembers method instead.")] + public BindingFlags DefaultMembersSearchFlags { get; set; } +#else + private BindingFlags DefaultMembersSearchFlags; +#endif + + /// + /// Gets or sets a value indicating whether compiler generated members should be serialized. + /// + /// + /// true if serialized compiler generated members; otherwise, false. + /// + public bool SerializeCompilerGeneratedMembers { get; set; } + +#if !(DOTNET || PORTABLE || PORTABLE40) + /// + /// Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + /// + /// + /// true if the interface will be ignored when serializing and deserializing types; otherwise, false. + /// + public bool IgnoreSerializableInterface { get; set; } + + /// + /// Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + /// + /// + /// true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + /// + public bool IgnoreSerializableAttribute { get; set; } +#endif + + /// + /// Initializes a new instance of the class. + /// + public DefaultContractResolver() + { +#if !(DOTNET || PORTABLE || PORTABLE40) + IgnoreSerializableAttribute = true; +#endif + +#pragma warning disable 618 + DefaultMembersSearchFlags = BindingFlags.Instance | BindingFlags.Public; +#pragma warning restore 618 + } + + /// + /// Initializes a new instance of the class. + /// + /// + /// If set to true the will use a cached shared with other resolvers of the same type. + /// Sharing the cache will significantly improve performance with multiple resolver instances because expensive reflection will only + /// happen once. This setting can cause unexpected behavior if different instances of the resolver are suppose to produce different + /// results. When set to false it is highly recommended to reuse instances with the . + /// + [ObsoleteAttribute("DefaultContractResolver(bool) is obsolete. Use the parameterless constructor and cache instances of the contract resolver within your application for optimal performance.")] + public DefaultContractResolver(bool shareCache) + : this() + { + _sharedCache = shareCache; + } + + internal DefaultContractResolverState GetState() + { + if (_sharedCache) + { + return _sharedState; + } + else + { + return _instanceState; + } + } + + /// + /// Resolves the contract for a given type. + /// + /// The type to resolve a contract for. + /// The contract for a given type. + public virtual JsonContract ResolveContract(Type type) + { + if (type == null) + { + throw new ArgumentNullException(nameof(type)); + } + + DefaultContractResolverState state = GetState(); + + JsonContract contract; + ResolverContractKey key = new ResolverContractKey(GetType(), type); + Dictionary cache = state.ContractCache; + if (cache == null || !cache.TryGetValue(key, out contract)) + { + contract = CreateContract(type); + + // avoid the possibility of modifying the cache dictionary while another thread is accessing it + lock (TypeContractCacheLock) + { + cache = state.ContractCache; + Dictionary updatedCache = (cache != null) + ? new Dictionary(cache) + : new Dictionary(); + updatedCache[key] = contract; + + state.ContractCache = updatedCache; + } + } + + return contract; + } + + /// + /// Gets the serializable members for the type. + /// + /// The type to get serializable members for. + /// The serializable members for the type. + protected virtual List GetSerializableMembers(Type objectType) + { + bool ignoreSerializableAttribute; +#if !(DOTNET || PORTABLE || PORTABLE40) + ignoreSerializableAttribute = IgnoreSerializableAttribute; +#else + ignoreSerializableAttribute = true; +#endif + + MemberSerialization memberSerialization = JsonTypeReflector.GetObjectMemberSerialization(objectType, ignoreSerializableAttribute); + + List allMembers = ReflectionUtils.GetFieldsAndProperties(objectType, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static) + .Where(m => !ReflectionUtils.IsIndexedProperty(m)).ToList(); + + List serializableMembers = new List(); + + if (memberSerialization != MemberSerialization.Fields) + { +#if !NET20 + DataContractAttribute dataContractAttribute = JsonTypeReflector.GetDataContractAttribute(objectType); +#endif + +#pragma warning disable 618 + List defaultMembers = ReflectionUtils.GetFieldsAndProperties(objectType, DefaultMembersSearchFlags) + .Where(m => !ReflectionUtils.IsIndexedProperty(m)).ToList(); +#pragma warning restore 618 + + foreach (MemberInfo member in allMembers) + { + // exclude members that are compiler generated if set + if (SerializeCompilerGeneratedMembers || !member.IsDefined(typeof(CompilerGeneratedAttribute), true)) + { + if (defaultMembers.Contains(member)) + { + // add all members that are found by default member search + serializableMembers.Add(member); + } + else + { + // add members that are explicitly marked with JsonProperty/DataMember attribute + // or are a field if serializing just fields + if (JsonTypeReflector.GetAttribute(member) != null) + { + serializableMembers.Add(member); + } + else if (JsonTypeReflector.GetAttribute(member) != null) + { + serializableMembers.Add(member); + } +#if !NET20 + else if (dataContractAttribute != null && JsonTypeReflector.GetAttribute(member) != null) + { + serializableMembers.Add(member); + } +#endif + else if (memberSerialization == MemberSerialization.Fields && member.MemberType() == MemberTypes.Field) + { + serializableMembers.Add(member); + } + } + } + } + +#if !NET20 + Type match; + // don't include EntityKey on entities objects... this is a bit hacky + if (objectType.AssignableToTypeName("System.Data.Objects.DataClasses.EntityObject", out match)) + { + serializableMembers = serializableMembers.Where(ShouldSerializeEntityMember).ToList(); + } +#endif + } + else + { + // serialize all fields + foreach (MemberInfo member in allMembers) + { + FieldInfo field = member as FieldInfo; + if (field != null && !field.IsStatic) + { + serializableMembers.Add(member); + } + } + } + + return serializableMembers; + } + +#if !NET20 + private bool ShouldSerializeEntityMember(MemberInfo memberInfo) + { + PropertyInfo propertyInfo = memberInfo as PropertyInfo; + if (propertyInfo != null) + { + if (propertyInfo.PropertyType.IsGenericType() && propertyInfo.PropertyType.GetGenericTypeDefinition().FullName == "System.Data.Objects.DataClasses.EntityReference`1") + { + return false; + } + } + + return true; + } +#endif + + /// + /// Creates a for the given type. + /// + /// Type of the object. + /// A for the given type. + protected virtual JsonObjectContract CreateObjectContract(Type objectType) + { + JsonObjectContract contract = new JsonObjectContract(objectType); + InitializeContract(contract); + + bool ignoreSerializableAttribute; +#if !(DOTNET || PORTABLE || PORTABLE40) + ignoreSerializableAttribute = IgnoreSerializableAttribute; +#else + ignoreSerializableAttribute = true; +#endif + + contract.MemberSerialization = JsonTypeReflector.GetObjectMemberSerialization(contract.NonNullableUnderlyingType, ignoreSerializableAttribute); + contract.Properties.AddRange(CreateProperties(contract.NonNullableUnderlyingType, contract.MemberSerialization)); + + JsonObjectAttribute attribute = JsonTypeReflector.GetCachedAttribute(contract.NonNullableUnderlyingType); + if (attribute != null) + { + contract.ItemRequired = attribute._itemRequired; + } + + if (contract.IsInstantiable) + { + ConstructorInfo overrideConstructor = GetAttributeConstructor(contract.NonNullableUnderlyingType); + + // check if a JsonConstructorAttribute has been defined and use that + if (overrideConstructor != null) + { +#pragma warning disable 618 + contract.OverrideConstructor = overrideConstructor; +#pragma warning restore 618 + contract.CreatorParameters.AddRange(CreateConstructorParameters(overrideConstructor, contract.Properties)); + } + else if (contract.MemberSerialization == MemberSerialization.Fields) + { +#if !(DOTNET || PORTABLE40 || PORTABLE) + // mimic DataContractSerializer behaviour when populating fields by overriding default creator to create an uninitialized object + // note that this is only possible when the application is fully trusted so fall back to using the default constructor (if available) in partial trust + if (JsonTypeReflector.FullyTrusted) + { + contract.DefaultCreator = contract.GetUninitializedObject; + } +#endif + } + else if (contract.DefaultCreator == null || contract.DefaultCreatorNonPublic) + { + ConstructorInfo constructor = GetParameterizedConstructor(contract.NonNullableUnderlyingType); + if (constructor != null) + { +#pragma warning disable 618 + contract.ParametrizedConstructor = constructor; +#pragma warning restore 618 + contract.CreatorParameters.AddRange(CreateConstructorParameters(constructor, contract.Properties)); + } + } + } + + MemberInfo extensionDataMember = GetExtensionDataMemberForType(contract.NonNullableUnderlyingType); + if (extensionDataMember != null) + { + SetExtensionDataDelegates(contract, extensionDataMember); + } + + return contract; + } + + private MemberInfo GetExtensionDataMemberForType(Type type) + { + IEnumerable members = GetClassHierarchyForType(type).SelectMany(baseType => + { + IList m = new List(); + m.AddRange(baseType.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly)); + m.AddRange(baseType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly)); + + return m; + }); + + MemberInfo extensionDataMember = members.LastOrDefault(m => + { + MemberTypes memberType = m.MemberType(); + if (memberType != MemberTypes.Property && memberType != MemberTypes.Field) + { + return false; + } + + // last instance of attribute wins on type if there are multiple + if (!m.IsDefined(typeof(JsonExtensionDataAttribute), false)) + { + return false; + } + + if (!ReflectionUtils.CanReadMemberValue(m, true)) + { + throw new JsonException("Invalid extension data attribute on '{0}'. Member '{1}' must have a getter.".FormatWith(CultureInfo.InvariantCulture, GetClrTypeFullName(m.DeclaringType), m.Name)); + } + + Type t = ReflectionUtils.GetMemberUnderlyingType(m); + + Type dictionaryType; + if (ReflectionUtils.ImplementsGenericDefinition(t, typeof(IDictionary<,>), out dictionaryType)) + { + Type keyType = dictionaryType.GetGenericArguments()[0]; + Type valueType = dictionaryType.GetGenericArguments()[1]; + + if (keyType.IsAssignableFrom(typeof(string)) && valueType.IsAssignableFrom(typeof(JToken))) + { + return true; + } + } + + throw new JsonException("Invalid extension data attribute on '{0}'. Member '{1}' type must implement IDictionary.".FormatWith(CultureInfo.InvariantCulture, GetClrTypeFullName(m.DeclaringType), m.Name)); + }); + + return extensionDataMember; + } + + private static void SetExtensionDataDelegates(JsonObjectContract contract, MemberInfo member) + { + JsonExtensionDataAttribute extensionDataAttribute = ReflectionUtils.GetAttribute(member); + if (extensionDataAttribute == null) + { + return; + } + + Type t = ReflectionUtils.GetMemberUnderlyingType(member); + + Type dictionaryType; + ReflectionUtils.ImplementsGenericDefinition(t, typeof(IDictionary<,>), out dictionaryType); + + Type keyType = dictionaryType.GetGenericArguments()[0]; + Type valueType = dictionaryType.GetGenericArguments()[1]; + + Type createdType; + + // change type to a class if it is the base interface so it can be instantiated if needed + if (ReflectionUtils.IsGenericDefinition(t, typeof(IDictionary<,>))) + { + createdType = typeof(Dictionary<,>).MakeGenericType(keyType, valueType); + } + else + { + createdType = t; + } + + Func getExtensionDataDictionary = JsonTypeReflector.ReflectionDelegateFactory.CreateGet(member); + + if (extensionDataAttribute.ReadData) + { + Action setExtensionDataDictionary = (ReflectionUtils.CanSetMemberValue(member, true, false)) + ? JsonTypeReflector.ReflectionDelegateFactory.CreateSet(member) + : null; + Func createExtensionDataDictionary = JsonTypeReflector.ReflectionDelegateFactory.CreateDefaultConstructor(createdType); + MethodInfo addMethod = t.GetMethod("Add", new[] { keyType, valueType }); + MethodCall setExtensionDataDictionaryValue = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall(addMethod); + + ExtensionDataSetter extensionDataSetter = (o, key, value) => + { + object dictionary = getExtensionDataDictionary(o); + if (dictionary == null) + { + if (setExtensionDataDictionary == null) + { + throw new JsonSerializationException("Cannot set value onto extension data member '{0}'. The extension data collection is null and it cannot be set.".FormatWith(CultureInfo.InvariantCulture, member.Name)); + } + + dictionary = createExtensionDataDictionary(); + setExtensionDataDictionary(o, dictionary); + } + + setExtensionDataDictionaryValue(dictionary, key, value); + }; + + contract.ExtensionDataSetter = extensionDataSetter; + } + + if (extensionDataAttribute.WriteData) + { + Type enumerableWrapper = typeof(EnumerableDictionaryWrapper<,>).MakeGenericType(keyType, valueType); + ConstructorInfo constructors = enumerableWrapper.GetConstructors().First(); + ObjectConstructor createEnumerableWrapper = JsonTypeReflector.ReflectionDelegateFactory.CreateParameterizedConstructor(constructors); + + ExtensionDataGetter extensionDataGetter = o => + { + object dictionary = getExtensionDataDictionary(o); + if (dictionary == null) + { + return null; + } + + return (IEnumerable>)createEnumerableWrapper(dictionary); + }; + + contract.ExtensionDataGetter = extensionDataGetter; + } + + contract.ExtensionDataValueType = valueType; + } + + // leave as class instead of struct + // will be always return as an interface and boxed + internal class EnumerableDictionaryWrapper : IEnumerable> + { + private readonly IEnumerable> _e; + + public EnumerableDictionaryWrapper(IEnumerable> e) + { + ValidationUtils.ArgumentNotNull(e, nameof(e)); + _e = e; + } + + public IEnumerator> GetEnumerator() + { + foreach (KeyValuePair item in _e) + { + yield return new KeyValuePair(item.Key, item.Value); + } + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } + + private ConstructorInfo GetAttributeConstructor(Type objectType) + { + IList markedConstructors = objectType.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Where(c => c.IsDefined(typeof(JsonConstructorAttribute), true)).ToList(); + + if (markedConstructors.Count > 1) + { + throw new JsonException("Multiple constructors with the JsonConstructorAttribute."); + } + else if (markedConstructors.Count == 1) + { + return markedConstructors[0]; + } + + // little hack to get Version objects to deserialize correctly + if (objectType == typeof(Version)) + { + return objectType.GetConstructor(new[] { typeof(int), typeof(int), typeof(int), typeof(int) }); + } + + return null; + } + + private ConstructorInfo GetParameterizedConstructor(Type objectType) + { + IList constructors = objectType.GetConstructors(BindingFlags.Public | BindingFlags.Instance).ToList(); + + if (constructors.Count == 1) + { + return constructors[0]; + } + else + { + return null; + } + } + + /// + /// Creates the constructor parameters. + /// + /// The constructor to create properties for. + /// The type's member properties. + /// Properties for the given . + protected virtual IList CreateConstructorParameters(ConstructorInfo constructor, JsonPropertyCollection memberProperties) + { + var constructorParameters = constructor.GetParameters(); + + JsonPropertyCollection parameterCollection = new JsonPropertyCollection(constructor.DeclaringType); + + foreach (ParameterInfo parameterInfo in constructorParameters) + { + // it is possible to generate a ParameterInfo with a null name using Reflection.Emit + // protect against an ArgumentNullException from GetClosestMatchProperty by testing for null here + JsonProperty matchingMemberProperty = (parameterInfo.Name != null) ? memberProperties.GetClosestMatchProperty(parameterInfo.Name) : null; + + // type must match as well as name + if (matchingMemberProperty != null && matchingMemberProperty.PropertyType != parameterInfo.ParameterType) + { + matchingMemberProperty = null; + } + + // ensure that property will have a name from matching property or from parameterinfo + // parameterinfo could have no name if generated by a proxy (I'm looking at you Castle) + if (matchingMemberProperty != null || parameterInfo.Name != null) + { + JsonProperty property = CreatePropertyFromConstructorParameter(matchingMemberProperty, parameterInfo); + + if (property != null) + { + parameterCollection.AddProperty(property); + } + } + } + + return parameterCollection; + } + + /// + /// Creates a for the given . + /// + /// The matching member property. + /// The constructor parameter. + /// A created for the given . + protected virtual JsonProperty CreatePropertyFromConstructorParameter(JsonProperty matchingMemberProperty, ParameterInfo parameterInfo) + { + JsonProperty property = new JsonProperty(); + property.PropertyType = parameterInfo.ParameterType; + property.AttributeProvider = new ReflectionAttributeProvider(parameterInfo); + + bool allowNonPublicAccess; + SetPropertySettingsFromAttributes(property, parameterInfo, parameterInfo.Name, parameterInfo.Member.DeclaringType, MemberSerialization.OptOut, out allowNonPublicAccess); + + property.Readable = false; + property.Writable = true; + + // "inherit" values from matching member property if unset on parameter + if (matchingMemberProperty != null) + { + property.PropertyName = (property.PropertyName != parameterInfo.Name) ? property.PropertyName : matchingMemberProperty.PropertyName; + property.Converter = property.Converter ?? matchingMemberProperty.Converter; + property.MemberConverter = property.MemberConverter ?? matchingMemberProperty.MemberConverter; + + if (!property._hasExplicitDefaultValue && matchingMemberProperty._hasExplicitDefaultValue) + { + property.DefaultValue = matchingMemberProperty.DefaultValue; + } + + property._required = property._required ?? matchingMemberProperty._required; + property.IsReference = property.IsReference ?? matchingMemberProperty.IsReference; + property.NullValueHandling = property.NullValueHandling ?? matchingMemberProperty.NullValueHandling; + property.DefaultValueHandling = property.DefaultValueHandling ?? matchingMemberProperty.DefaultValueHandling; + property.ReferenceLoopHandling = property.ReferenceLoopHandling ?? matchingMemberProperty.ReferenceLoopHandling; + property.ObjectCreationHandling = property.ObjectCreationHandling ?? matchingMemberProperty.ObjectCreationHandling; + property.TypeNameHandling = property.TypeNameHandling ?? matchingMemberProperty.TypeNameHandling; + } + + return property; + } + + /// + /// Resolves the default for the contract. + /// + /// Type of the object. + /// The contract's default . + protected virtual JsonConverter ResolveContractConverter(Type objectType) + { + return JsonTypeReflector.GetJsonConverter(objectType); + } + + private Func GetDefaultCreator(Type createdType) + { + return JsonTypeReflector.ReflectionDelegateFactory.CreateDefaultConstructor(createdType); + } + +#if NET35 + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Portability", "CA1903:UseOnlyApiFromTargetedFramework", MessageId = "System.Runtime.Serialization.DataContractAttribute.#get_IsReference()")] +#endif + + private void InitializeContract(JsonContract contract) + { + JsonContainerAttribute containerAttribute = JsonTypeReflector.GetCachedAttribute(contract.NonNullableUnderlyingType); + if (containerAttribute != null) + { + contract.IsReference = containerAttribute._isReference; + } +#if !NET20 + else + { + DataContractAttribute dataContractAttribute = JsonTypeReflector.GetDataContractAttribute(contract.NonNullableUnderlyingType); + // doesn't have a null value + if (dataContractAttribute != null && dataContractAttribute.IsReference) + { + contract.IsReference = true; + } + } +#endif + + contract.Converter = ResolveContractConverter(contract.NonNullableUnderlyingType); + + // then see whether object is compadible with any of the built in converters + contract.InternalConverter = JsonSerializer.GetMatchingConverter(BuiltInConverters, contract.NonNullableUnderlyingType); + + if (contract.IsInstantiable + && (ReflectionUtils.HasDefaultConstructor(contract.CreatedType, true) || contract.CreatedType.IsValueType())) + { + contract.DefaultCreator = GetDefaultCreator(contract.CreatedType); + + contract.DefaultCreatorNonPublic = (!contract.CreatedType.IsValueType() && + ReflectionUtils.GetDefaultConstructor(contract.CreatedType) == null); + } + + ResolveCallbackMethods(contract, contract.NonNullableUnderlyingType); + } + + private void ResolveCallbackMethods(JsonContract contract, Type t) + { + List onSerializing; + List onSerialized; + List onDeserializing; + List onDeserialized; + List onError; + + GetCallbackMethodsForType(t, out onSerializing, out onSerialized, out onDeserializing, out onDeserialized, out onError); + + if (onSerializing != null) + { + contract.OnSerializingCallbacks.AddRange(onSerializing); + } + + if (onSerialized != null) + { + contract.OnSerializedCallbacks.AddRange(onSerialized); + } + + if (onDeserializing != null) + { + contract.OnDeserializingCallbacks.AddRange(onDeserializing); + } + + if (onDeserialized != null) + { + contract.OnDeserializedCallbacks.AddRange(onDeserialized); + } + + if (onError != null) + { + contract.OnErrorCallbacks.AddRange(onError); + } + } + + private void GetCallbackMethodsForType(Type type, out List onSerializing, out List onSerialized, out List onDeserializing, out List onDeserialized, out List onError) + { + onSerializing = null; + onSerialized = null; + onDeserializing = null; + onDeserialized = null; + onError = null; + + foreach (Type baseType in GetClassHierarchyForType(type)) + { + // while we allow more than one OnSerialized total, only one can be defined per class + MethodInfo currentOnSerializing = null; + MethodInfo currentOnSerialized = null; + MethodInfo currentOnDeserializing = null; + MethodInfo currentOnDeserialized = null; + MethodInfo currentOnError = null; + + bool skipSerializing = ShouldSkipSerializing(baseType); + bool skipDeserialized = ShouldSkipDeserialized(baseType); + + foreach (MethodInfo method in baseType.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)) + { + // compact framework errors when getting parameters for a generic method + // lame, but generic methods should not be callbacks anyway + if (method.ContainsGenericParameters) + { + continue; + } + + Type prevAttributeType = null; + ParameterInfo[] parameters = method.GetParameters(); + + if (!skipSerializing && IsValidCallback(method, parameters, typeof(OnSerializingAttribute), currentOnSerializing, ref prevAttributeType)) + { + onSerializing = onSerializing ?? new List(); + onSerializing.Add(JsonContract.CreateSerializationCallback(method)); + currentOnSerializing = method; + } + if (IsValidCallback(method, parameters, typeof(OnSerializedAttribute), currentOnSerialized, ref prevAttributeType)) + { + onSerialized = onSerialized ?? new List(); + onSerialized.Add(JsonContract.CreateSerializationCallback(method)); + currentOnSerialized = method; + } + if (IsValidCallback(method, parameters, typeof(OnDeserializingAttribute), currentOnDeserializing, ref prevAttributeType)) + { + onDeserializing = onDeserializing ?? new List(); + onDeserializing.Add(JsonContract.CreateSerializationCallback(method)); + currentOnDeserializing = method; + } + if (!skipDeserialized && IsValidCallback(method, parameters, typeof(OnDeserializedAttribute), currentOnDeserialized, ref prevAttributeType)) + { + onDeserialized = onDeserialized ?? new List(); + onDeserialized.Add(JsonContract.CreateSerializationCallback(method)); + currentOnDeserialized = method; + } + if (IsValidCallback(method, parameters, typeof(OnErrorAttribute), currentOnError, ref prevAttributeType)) + { + onError = onError ?? new List(); + onError.Add(JsonContract.CreateSerializationErrorCallback(method)); + currentOnError = method; + } + } + } + } + + private static bool ShouldSkipDeserialized(Type t) + { +#if !(NET35 || NET20 || PORTABLE || PORTABLE40) + // ConcurrentDictionary throws an error in its OnDeserialized so ignore - http://json.codeplex.com/discussions/257093 + if (t.IsGenericType() && t.GetGenericTypeDefinition() == typeof(ConcurrentDictionary<,>)) + { + return true; + } +#endif +#if !(NET35 || NET20) + if (t.Name == FSharpUtils.FSharpSetTypeName || t.Name == FSharpUtils.FSharpMapTypeName) + { + return true; + } +#endif + + return false; + } + + private static bool ShouldSkipSerializing(Type t) + { +#if !(NET35 || NET20) + if (t.Name == FSharpUtils.FSharpSetTypeName || t.Name == FSharpUtils.FSharpMapTypeName) + { + return true; + } +#endif +#if DOTNET + if (t.IsGenericType() && t.GetGenericTypeDefinition() == typeof(ConcurrentDictionary<,>)) + return true; +#endif + + return false; + } + + private List GetClassHierarchyForType(Type type) + { + List ret = new List(); + + Type current = type; + while (current != null && current != typeof(object)) + { + ret.Add(current); + current = current.BaseType(); + } + + // Return the class list in order of simple => complex + ret.Reverse(); + return ret; + } + + /// + /// Creates a for the given type. + /// + /// Type of the object. + /// A for the given type. + protected virtual JsonDictionaryContract CreateDictionaryContract(Type objectType) + { + JsonDictionaryContract contract = new JsonDictionaryContract(objectType); + InitializeContract(contract); + + contract.DictionaryKeyResolver = ResolveDictionaryKey; + + ConstructorInfo overrideConstructor = GetAttributeConstructor(contract.NonNullableUnderlyingType); + + if (overrideConstructor != null) + { + ParameterInfo[] parameters = overrideConstructor.GetParameters(); + Type expectedParameterType = (contract.DictionaryKeyType != null && contract.DictionaryValueType != null) + ? typeof(IEnumerable<>).MakeGenericType(typeof(KeyValuePair<,>).MakeGenericType(contract.DictionaryKeyType, contract.DictionaryValueType)) + : typeof(IDictionary); + + if (parameters.Length == 0) + { + contract.HasParameterizedCreator = false; + } + else if (parameters.Length == 1 && expectedParameterType.IsAssignableFrom(parameters[0].ParameterType)) + { + contract.HasParameterizedCreator = true; + } + else + { + throw new JsonException("Constructor for '{0}' must have no parameters or a single parameter that implements '{1}'.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType, expectedParameterType)); + } + + contract.OverrideCreator = JsonTypeReflector.ReflectionDelegateFactory.CreateParameterizedConstructor(overrideConstructor); + } + + return contract; + } + + /// + /// Creates a for the given type. + /// + /// Type of the object. + /// A for the given type. + protected virtual JsonArrayContract CreateArrayContract(Type objectType) + { + JsonArrayContract contract = new JsonArrayContract(objectType); + InitializeContract(contract); + + ConstructorInfo overrideConstructor = GetAttributeConstructor(contract.NonNullableUnderlyingType); + + if (overrideConstructor != null) + { + ParameterInfo[] parameters = overrideConstructor.GetParameters(); + Type expectedParameterType = (contract.CollectionItemType != null) + ? typeof(IEnumerable<>).MakeGenericType(contract.CollectionItemType) + : typeof(IEnumerable); + + if (parameters.Length == 0) + { + contract.HasParameterizedCreator = false; + } + else if (parameters.Length == 1 && expectedParameterType.IsAssignableFrom(parameters[0].ParameterType)) + { + contract.HasParameterizedCreator = true; + } + else + { + throw new JsonException("Constructor for '{0}' must have no parameters or a single parameter that implements '{1}'.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType, expectedParameterType)); + } + + contract.OverrideCreator = JsonTypeReflector.ReflectionDelegateFactory.CreateParameterizedConstructor(overrideConstructor); + } + + return contract; + } + + /// + /// Creates a for the given type. + /// + /// Type of the object. + /// A for the given type. + protected virtual JsonPrimitiveContract CreatePrimitiveContract(Type objectType) + { + JsonPrimitiveContract contract = new JsonPrimitiveContract(objectType); + InitializeContract(contract); + + return contract; + } + + /// + /// Creates a for the given type. + /// + /// Type of the object. + /// A for the given type. + protected virtual JsonLinqContract CreateLinqContract(Type objectType) + { + JsonLinqContract contract = new JsonLinqContract(objectType); + InitializeContract(contract); + + return contract; + } + +#if !(DOTNET || PORTABLE40 || PORTABLE) + /// + /// Creates a for the given type. + /// + /// Type of the object. + /// A for the given type. + protected virtual JsonISerializableContract CreateISerializableContract(Type objectType) + { + JsonISerializableContract contract = new JsonISerializableContract(objectType); + InitializeContract(contract); + + ConstructorInfo constructorInfo = contract.NonNullableUnderlyingType.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(SerializationInfo), typeof(StreamingContext) }, null); + if (constructorInfo != null) + { + ObjectConstructor creator = JsonTypeReflector.ReflectionDelegateFactory.CreateParameterizedConstructor(constructorInfo); + + contract.ISerializableCreator = creator; + } + + return contract; + } +#endif + +#if !(NET35 || NET20 || PORTABLE40) + /// + /// Creates a for the given type. + /// + /// Type of the object. + /// A for the given type. + protected virtual JsonDynamicContract CreateDynamicContract(Type objectType) + { + JsonDynamicContract contract = new JsonDynamicContract(objectType); + InitializeContract(contract); + + contract.PropertyNameResolver = ResolvePropertyName; + contract.Properties.AddRange(CreateProperties(objectType, MemberSerialization.OptOut)); + + return contract; + } +#endif + + /// + /// Creates a for the given type. + /// + /// Type of the object. + /// A for the given type. + protected virtual JsonStringContract CreateStringContract(Type objectType) + { + JsonStringContract contract = new JsonStringContract(objectType); + InitializeContract(contract); + + return contract; + } + + /// + /// Determines which contract type is created for the given type. + /// + /// Type of the object. + /// A for the given type. + protected virtual JsonContract CreateContract(Type objectType) + { + if (IsJsonPrimitiveType(objectType)) + { + return CreatePrimitiveContract(objectType); + } + + Type t = ReflectionUtils.EnsureNotNullableType(objectType); + JsonContainerAttribute containerAttribute = JsonTypeReflector.GetCachedAttribute(t); + + if (containerAttribute is JsonObjectAttribute) + { + return CreateObjectContract(objectType); + } + + if (containerAttribute is JsonArrayAttribute) + { + return CreateArrayContract(objectType); + } + + if (containerAttribute is JsonDictionaryAttribute) + { + return CreateDictionaryContract(objectType); + } + + if (t == typeof(JToken) || t.IsSubclassOf(typeof(JToken))) + { + return CreateLinqContract(objectType); + } + + if (CollectionUtils.IsDictionaryType(t)) + { + return CreateDictionaryContract(objectType); + } + + if (typeof(IEnumerable).IsAssignableFrom(t)) + { + return CreateArrayContract(objectType); + } + + if (CanConvertToString(t)) + { + return CreateStringContract(objectType); + } + +#if !(DOTNET || PORTABLE40 || PORTABLE) + if (!IgnoreSerializableInterface && typeof(ISerializable).IsAssignableFrom(t)) + { + return CreateISerializableContract(objectType); + } +#endif + +#if !(NET35 || NET20 || PORTABLE40) + if (typeof(IDynamicMetaObjectProvider).IsAssignableFrom(t)) + { + return CreateDynamicContract(objectType); + } +#endif + +#if !PORTABLE + // tested last because it is not possible to automatically deserialize custom IConvertible types + if (IsIConvertible(t)) + { + return CreatePrimitiveContract(t); + } +#endif + + return CreateObjectContract(objectType); + } + + internal static bool IsJsonPrimitiveType(Type t) + { + PrimitiveTypeCode typeCode = ConvertUtils.GetTypeCode(t); + + return (typeCode != PrimitiveTypeCode.Empty && typeCode != PrimitiveTypeCode.Object); + } + +#if !PORTABLE + internal static bool IsIConvertible(Type t) + { + if (typeof(IConvertible).IsAssignableFrom(t) + || (ReflectionUtils.IsNullableType(t) && typeof(IConvertible).IsAssignableFrom(Nullable.GetUnderlyingType(t)))) + { + return !typeof(JToken).IsAssignableFrom(t); + } + + return false; + } +#endif + + internal static bool CanConvertToString(Type type) + { +#if !(DOTNET || PORTABLE40 || PORTABLE) + TypeConverter converter = ConvertUtils.GetConverter(type); + + // use the objectType's TypeConverter if it has one and can convert to a string + if (converter != null + && !(converter is ComponentConverter) + && !(converter is ReferenceConverter) + && converter.GetType() != typeof(TypeConverter)) + { + if (converter.CanConvertTo(typeof(string))) + { + return true; + } + } +#endif + + if (type == typeof(Type) || type.IsSubclassOf(typeof(Type))) + { + return true; + } + + return false; + } + + private static bool IsValidCallback(MethodInfo method, ParameterInfo[] parameters, Type attributeType, MethodInfo currentCallback, ref Type prevAttributeType) + { + if (!method.IsDefined(attributeType, false)) + { + return false; + } + + if (currentCallback != null) + { + throw new JsonException("Invalid attribute. Both '{0}' and '{1}' in type '{2}' have '{3}'.".FormatWith(CultureInfo.InvariantCulture, method, currentCallback, GetClrTypeFullName(method.DeclaringType), attributeType)); + } + + if (prevAttributeType != null) + { + throw new JsonException("Invalid Callback. Method '{3}' in type '{2}' has both '{0}' and '{1}'.".FormatWith(CultureInfo.InvariantCulture, prevAttributeType, attributeType, GetClrTypeFullName(method.DeclaringType), method)); + } + + if (method.IsVirtual) + { + throw new JsonException("Virtual Method '{0}' of type '{1}' cannot be marked with '{2}' attribute.".FormatWith(CultureInfo.InvariantCulture, method, GetClrTypeFullName(method.DeclaringType), attributeType)); + } + + if (method.ReturnType != typeof(void)) + { + throw new JsonException("Serialization Callback '{1}' in type '{0}' must return void.".FormatWith(CultureInfo.InvariantCulture, GetClrTypeFullName(method.DeclaringType), method)); + } + + if (attributeType == typeof(OnErrorAttribute)) + { + if (parameters == null || parameters.Length != 2 || parameters[0].ParameterType != typeof(StreamingContext) || parameters[1].ParameterType != typeof(ErrorContext)) + { + throw new JsonException("Serialization Error Callback '{1}' in type '{0}' must have two parameters of type '{2}' and '{3}'.".FormatWith(CultureInfo.InvariantCulture, GetClrTypeFullName(method.DeclaringType), method, typeof(StreamingContext), typeof(ErrorContext))); + } + } + else + { + if (parameters == null || parameters.Length != 1 || parameters[0].ParameterType != typeof(StreamingContext)) + { + throw new JsonException("Serialization Callback '{1}' in type '{0}' must have a single parameter of type '{2}'.".FormatWith(CultureInfo.InvariantCulture, GetClrTypeFullName(method.DeclaringType), method, typeof(StreamingContext))); + } + } + + prevAttributeType = attributeType; + + return true; + } + + internal static string GetClrTypeFullName(Type type) + { + if (type.IsGenericTypeDefinition() || !type.ContainsGenericParameters()) + { + return type.FullName; + } + + return string.Format(CultureInfo.InvariantCulture, "{0}.{1}", new object[] { type.Namespace, type.Name }); + } + + /// + /// Creates properties for the given . + /// + /// The type to create properties for. + /// /// The member serialization mode for the type. + /// Properties for the given . + protected virtual IList CreateProperties(Type type, MemberSerialization memberSerialization) + { + List members = GetSerializableMembers(type); + if (members == null) + { + throw new JsonSerializationException("Null collection of seralizable members returned."); + } + + JsonPropertyCollection properties = new JsonPropertyCollection(type); + + foreach (MemberInfo member in members) + { + JsonProperty property = CreateProperty(member, memberSerialization); + + if (property != null) + { + DefaultContractResolverState state = GetState(); + + // nametable is not thread-safe for multiple writers + lock (state.NameTable) + { + property.PropertyName = state.NameTable.Add(property.PropertyName); + } + + properties.AddProperty(property); + } + } + + IList orderedProperties = properties.OrderBy(p => p.Order ?? -1).ToList(); + return orderedProperties; + } + + /// + /// Creates the used by the serializer to get and set values from a member. + /// + /// The member. + /// The used by the serializer to get and set values from a member. + protected virtual IValueProvider CreateMemberValueProvider(MemberInfo member) + { + // warning - this method use to cause errors with Intellitrace. Retest in VS Ultimate after changes + IValueProvider valueProvider; + +#if !(PORTABLE40 || PORTABLE || DOTNET) + if (DynamicCodeGeneration) + { + valueProvider = new DynamicValueProvider(member); + } + else + { + valueProvider = new ReflectionValueProvider(member); + } +#elif !(PORTABLE40) + valueProvider = new ExpressionValueProvider(member); +#else + valueProvider = new ReflectionValueProvider(member); +#endif + + return valueProvider; + } + + /// + /// Creates a for the given . + /// + /// The member's parent . + /// The member to create a for. + /// A created for the given . + protected virtual JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) + { + JsonProperty property = new JsonProperty(); + property.PropertyType = ReflectionUtils.GetMemberUnderlyingType(member); + property.DeclaringType = member.DeclaringType; + property.ValueProvider = CreateMemberValueProvider(member); + property.AttributeProvider = new ReflectionAttributeProvider(member); + + bool allowNonPublicAccess; + SetPropertySettingsFromAttributes(property, member, member.Name, member.DeclaringType, memberSerialization, out allowNonPublicAccess); + + if (memberSerialization != MemberSerialization.Fields) + { + property.Readable = ReflectionUtils.CanReadMemberValue(member, allowNonPublicAccess); + property.Writable = ReflectionUtils.CanSetMemberValue(member, allowNonPublicAccess, property.HasMemberAttribute); + } + else + { + // write to readonly fields + property.Readable = true; + property.Writable = true; + } + property.ShouldSerialize = CreateShouldSerializeTest(member); + + SetIsSpecifiedActions(property, member, allowNonPublicAccess); + + return property; + } + + private void SetPropertySettingsFromAttributes(JsonProperty property, object attributeProvider, string name, Type declaringType, MemberSerialization memberSerialization, out bool allowNonPublicAccess) + { +#if !NET20 + DataContractAttribute dataContractAttribute = JsonTypeReflector.GetDataContractAttribute(declaringType); + + MemberInfo memberInfo = attributeProvider as MemberInfo; + + DataMemberAttribute dataMemberAttribute; + if (dataContractAttribute != null && memberInfo != null) + { + dataMemberAttribute = JsonTypeReflector.GetDataMemberAttribute((MemberInfo)memberInfo); + } + else + { + dataMemberAttribute = null; + } +#endif + + JsonPropertyAttribute propertyAttribute = JsonTypeReflector.GetAttribute(attributeProvider); + JsonRequiredAttribute requiredAttribute = JsonTypeReflector.GetAttribute(attributeProvider); + + string mappedName; + if (propertyAttribute != null && propertyAttribute.PropertyName != null) + { + mappedName = propertyAttribute.PropertyName; + } +#if !NET20 + else if (dataMemberAttribute != null && dataMemberAttribute.Name != null) + { + mappedName = dataMemberAttribute.Name; + } +#endif + else + { + mappedName = name; + } + + property.PropertyName = ResolvePropertyName(mappedName); + property.UnderlyingName = name; + + bool hasMemberAttribute = false; + if (propertyAttribute != null) + { + property._required = propertyAttribute._required; + property.Order = propertyAttribute._order; + property.DefaultValueHandling = propertyAttribute._defaultValueHandling; + hasMemberAttribute = true; + } +#if !NET20 + else if (dataMemberAttribute != null) + { + property._required = (dataMemberAttribute.IsRequired) ? Required.AllowNull : Required.Default; + property.Order = (dataMemberAttribute.Order != -1) ? (int?)dataMemberAttribute.Order : null; + property.DefaultValueHandling = (!dataMemberAttribute.EmitDefaultValue) ? (DefaultValueHandling?)DefaultValueHandling.Ignore : null; + hasMemberAttribute = true; + } +#endif + if (requiredAttribute != null) + { + property._required = Required.Always; + hasMemberAttribute = true; + } + + property.HasMemberAttribute = hasMemberAttribute; + + bool hasJsonIgnoreAttribute = + JsonTypeReflector.GetAttribute(attributeProvider) != null + // automatically ignore extension data dictionary property if it is public + || JsonTypeReflector.GetAttribute(attributeProvider) != null +#if !(DOTNET || PORTABLE40 || PORTABLE) + || JsonTypeReflector.GetAttribute(attributeProvider) != null +#endif + ; + + if (memberSerialization != MemberSerialization.OptIn) + { + bool hasIgnoreDataMemberAttribute = false; + +#if !(NET20 || NET35) + hasIgnoreDataMemberAttribute = (JsonTypeReflector.GetAttribute(attributeProvider) != null); +#endif + + // ignored if it has JsonIgnore or NonSerialized or IgnoreDataMember attributes + property.Ignored = (hasJsonIgnoreAttribute || hasIgnoreDataMemberAttribute); + } + else + { + // ignored if it has JsonIgnore/NonSerialized or does not have DataMember or JsonProperty attributes + property.Ignored = (hasJsonIgnoreAttribute || !hasMemberAttribute); + } + + // resolve converter for property + // the class type might have a converter but the property converter takes presidence + property.Converter = JsonTypeReflector.GetJsonConverter(attributeProvider); + property.MemberConverter = JsonTypeReflector.GetJsonConverter(attributeProvider); + + DefaultValueAttribute defaultValueAttribute = JsonTypeReflector.GetAttribute(attributeProvider); + if (defaultValueAttribute != null) + { + property.DefaultValue = defaultValueAttribute.Value; + } + + property.NullValueHandling = (propertyAttribute != null) ? propertyAttribute._nullValueHandling : null; + property.ReferenceLoopHandling = (propertyAttribute != null) ? propertyAttribute._referenceLoopHandling : null; + property.ObjectCreationHandling = (propertyAttribute != null) ? propertyAttribute._objectCreationHandling : null; + property.TypeNameHandling = (propertyAttribute != null) ? propertyAttribute._typeNameHandling : null; + property.IsReference = (propertyAttribute != null) ? propertyAttribute._isReference : null; + + property.ItemIsReference = (propertyAttribute != null) ? propertyAttribute._itemIsReference : null; + property.ItemConverter = + (propertyAttribute != null && propertyAttribute.ItemConverterType != null) + ? JsonTypeReflector.CreateJsonConverterInstance(propertyAttribute.ItemConverterType, propertyAttribute.ItemConverterParameters) + : null; + property.ItemReferenceLoopHandling = (propertyAttribute != null) ? propertyAttribute._itemReferenceLoopHandling : null; + property.ItemTypeNameHandling = (propertyAttribute != null) ? propertyAttribute._itemTypeNameHandling : null; + + allowNonPublicAccess = false; +#pragma warning disable 618 + if ((DefaultMembersSearchFlags & BindingFlags.NonPublic) == BindingFlags.NonPublic) + { + allowNonPublicAccess = true; + } +#pragma warning restore 618 + if (hasMemberAttribute) + { + allowNonPublicAccess = true; + } + if (memberSerialization == MemberSerialization.Fields) + { + allowNonPublicAccess = true; + } + } + + private Predicate CreateShouldSerializeTest(MemberInfo member) + { + MethodInfo shouldSerializeMethod = member.DeclaringType.GetMethod(JsonTypeReflector.ShouldSerializePrefix + member.Name, ReflectionUtils.EmptyTypes); + + if (shouldSerializeMethod == null || shouldSerializeMethod.ReturnType != typeof(bool)) + { + return null; + } + + MethodCall shouldSerializeCall = + JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall(shouldSerializeMethod); + + return o => (bool)shouldSerializeCall(o); + } + + private void SetIsSpecifiedActions(JsonProperty property, MemberInfo member, bool allowNonPublicAccess) + { + MemberInfo specifiedMember = member.DeclaringType.GetProperty(member.Name + JsonTypeReflector.SpecifiedPostfix); + if (specifiedMember == null) + { + specifiedMember = member.DeclaringType.GetField(member.Name + JsonTypeReflector.SpecifiedPostfix); + } + + if (specifiedMember == null || ReflectionUtils.GetMemberUnderlyingType(specifiedMember) != typeof(bool)) + { + return; + } + + Func specifiedPropertyGet = JsonTypeReflector.ReflectionDelegateFactory.CreateGet(specifiedMember); + + property.GetIsSpecified = o => (bool)specifiedPropertyGet(o); + + if (ReflectionUtils.CanSetMemberValue(specifiedMember, allowNonPublicAccess, false)) + { + property.SetIsSpecified = JsonTypeReflector.ReflectionDelegateFactory.CreateSet(specifiedMember); + } + } + + /// + /// Resolves the name of the property. + /// + /// Name of the property. + /// Resolved name of the property. + protected virtual string ResolvePropertyName(string propertyName) + { + return propertyName; + } + + /// + /// Resolves the key of the dictionary. By default is used to resolve dictionary keys. + /// + /// Key of the dictionary. + /// Resolved key of the dictionary. + protected virtual string ResolveDictionaryKey(string dictionaryKey) + { + return ResolvePropertyName(dictionaryKey); + } + + /// + /// Gets the resolved name of the property. + /// + /// Name of the property. + /// Name of the property. + public string GetResolvedPropertyName(string propertyName) + { + // this is a new method rather than changing the visibility of ResolvePropertyName to avoid + // a breaking change for anyone who has overidden the method + return ResolvePropertyName(propertyName); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/DefaultReferenceResolver.cs b/Common/00-1Json8.3/Json8.3/Serialization/DefaultReferenceResolver.cs new file mode 100644 index 0000000..885ccfc --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/DefaultReferenceResolver.cs @@ -0,0 +1,89 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using Newtonsoft.Json.Utilities; +using System.Globalization; + +namespace Newtonsoft.Json.Serialization +{ + internal class DefaultReferenceResolver : IReferenceResolver + { + private int _referenceCount; + + private BidirectionalDictionary GetMappings(object context) + { + JsonSerializerInternalBase internalSerializer; + + if (context is JsonSerializerInternalBase) + { + internalSerializer = (JsonSerializerInternalBase)context; + } + else if (context is JsonSerializerProxy) + { + internalSerializer = ((JsonSerializerProxy)context).GetInternalSerializer(); + } + else + { + throw new JsonException("The DefaultReferenceResolver can only be used internally."); + } + + return internalSerializer.DefaultReferenceMappings; + } + + public object ResolveReference(object context, string reference) + { + object value; + GetMappings(context).TryGetByFirst(reference, out value); + return value; + } + + public string GetReference(object context, object value) + { + var mappings = GetMappings(context); + + string reference; + if (!mappings.TryGetBySecond(value, out reference)) + { + _referenceCount++; + reference = _referenceCount.ToString(CultureInfo.InvariantCulture); + mappings.Set(reference, value); + } + + return reference; + } + + public void AddReference(object context, string reference, object value) + { + GetMappings(context).Set(reference, value); + } + + public bool IsReferenced(object context, object value) + { + string reference; + return GetMappings(context).TryGetBySecond(value, out reference); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/DefaultSerializationBinder.cs b/Common/00-1Json8.3/Json8.3/Serialization/DefaultSerializationBinder.cs new file mode 100644 index 0000000..5df55dc --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/DefaultSerializationBinder.cs @@ -0,0 +1,164 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Runtime.Serialization; +using System.Reflection; +using System.Globalization; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// The default serialization binder used when resolving and loading classes from type names. + /// + public class DefaultSerializationBinder : SerializationBinder + { + internal static readonly DefaultSerializationBinder Instance = new DefaultSerializationBinder(); + + private readonly ThreadSafeStore _typeCache = new ThreadSafeStore(GetTypeFromTypeNameKey); + + private static Type GetTypeFromTypeNameKey(TypeNameKey typeNameKey) + { + string assemblyName = typeNameKey.AssemblyName; + string typeName = typeNameKey.TypeName; + + if (assemblyName != null) + { + Assembly assembly; + +#if !(DOTNET || PORTABLE40 || PORTABLE) + // look, I don't like using obsolete methods as much as you do but this is the only way + // Assembly.Load won't check the GAC for a partial name +#pragma warning disable 618,612 + assembly = Assembly.LoadWithPartialName(assemblyName); +#pragma warning restore 618,612 +#elif DOTNET || PORTABLE + assembly = Assembly.Load(new AssemblyName(assemblyName)); +#else + assembly = Assembly.Load(assemblyName); +#endif + +#if !(PORTABLE40 || PORTABLE || DOTNET) + if (assembly == null) + { + // will find assemblies loaded with Assembly.LoadFile outside of the main directory + Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach (Assembly a in loadedAssemblies) + { + if (a.FullName == assemblyName) + { + assembly = a; + break; + } + } + } +#endif + + if (assembly == null) + { + throw new JsonSerializationException("Could not load assembly '{0}'.".FormatWith(CultureInfo.InvariantCulture, assemblyName)); + } + + Type type = assembly.GetType(typeName); + if (type == null) + { + throw new JsonSerializationException("Could not find type '{0}' in assembly '{1}'.".FormatWith(CultureInfo.InvariantCulture, typeName, assembly.FullName)); + } + + return type; + } + else + { + return Type.GetType(typeName); + } + } + + internal struct TypeNameKey : IEquatable + { + internal readonly string AssemblyName; + internal readonly string TypeName; + + public TypeNameKey(string assemblyName, string typeName) + { + AssemblyName = assemblyName; + TypeName = typeName; + } + + public override int GetHashCode() + { + return ((AssemblyName != null) ? AssemblyName.GetHashCode() : 0) + ^ ((TypeName != null) ? TypeName.GetHashCode() : 0); + } + + public override bool Equals(object obj) + { + if (!(obj is TypeNameKey)) + { + return false; + } + + return Equals((TypeNameKey)obj); + } + + public bool Equals(TypeNameKey other) + { + return (AssemblyName == other.AssemblyName && TypeName == other.TypeName); + } + } + + /// + /// When overridden in a derived class, controls the binding of a serialized object to a type. + /// + /// Specifies the name of the serialized object. + /// Specifies the name of the serialized object. + /// + /// The type of the object the formatter creates a new instance of. + /// + public override Type BindToType(string assemblyName, string typeName) + { + return _typeCache.Get(new TypeNameKey(assemblyName, typeName)); + } + +#if !(NET35 || NET20) + /// + /// When overridden in a derived class, controls the binding of a serialized object to a type. + /// + /// The type of the object the formatter creates a new instance of. + /// Specifies the name of the serialized object. + /// Specifies the name of the serialized object. + public override void BindToName(Type serializedType, out string assemblyName, out string typeName) + { +#if (DOTNET || PORTABLE) + assemblyName = serializedType.GetTypeInfo().Assembly.FullName; + typeName = serializedType.FullName; +#else + assemblyName = serializedType.Assembly.FullName; + typeName = serializedType.FullName; +#endif + } +#endif + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/DiagnosticsTraceWriter.cs b/Common/00-1Json8.3/Json8.3/Serialization/DiagnosticsTraceWriter.cs new file mode 100644 index 0000000..b029338 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/DiagnosticsTraceWriter.cs @@ -0,0 +1,79 @@ +#if !(PORTABLE40 || PORTABLE || DOTNET) +using System; +using System.Diagnostics; +using DiagnosticsTrace = System.Diagnostics.Trace; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Represents a trace writer that writes to the application's instances. + /// + public class DiagnosticsTraceWriter : ITraceWriter + { + /// + /// Gets the that will be used to filter the trace messages passed to the writer. + /// For example a filter level of Info will exclude Verbose messages and include Info, + /// Warning and Error messages. + /// + /// + /// The that will be used to filter the trace messages passed to the writer. + /// + public TraceLevel LevelFilter { get; set; } + + private TraceEventType GetTraceEventType(TraceLevel level) + { + switch (level) + { + case TraceLevel.Error: + return TraceEventType.Error; + case TraceLevel.Warning: + return TraceEventType.Warning; + case TraceLevel.Info: + return TraceEventType.Information; + case TraceLevel.Verbose: + return TraceEventType.Verbose; + default: + throw new ArgumentOutOfRangeException(nameof(level)); + } + } + + /// + /// Writes the specified trace level, message and optional exception. + /// + /// The at which to write this trace. + /// The trace message. + /// The trace exception. This parameter is optional. + public void Trace(TraceLevel level, string message, Exception ex) + { + if (level == TraceLevel.Off) + { + return; + } + + TraceEventCache eventCache = new TraceEventCache(); + TraceEventType traceEventType = GetTraceEventType(level); + + foreach (TraceListener listener in DiagnosticsTrace.Listeners) + { + if (!listener.IsThreadSafe) + { + lock (listener) + { + listener.TraceEvent(eventCache, "Newtonsoft.Json", traceEventType, 0, message); + } + } + else + { + listener.TraceEvent(eventCache, "Newtonsoft.Json", traceEventType, 0, message); + } + + if (DiagnosticsTrace.AutoFlush) + { + listener.Flush(); + } + } + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/DynamicValueProvider.cs b/Common/00-1Json8.3/Json8.3/Serialization/DynamicValueProvider.cs new file mode 100644 index 0000000..dd9dce7 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/DynamicValueProvider.cs @@ -0,0 +1,120 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(PORTABLE40 || PORTABLE || DOTNET) +using System; +using System.Collections.Generic; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#endif +using System.Text; +using System.Reflection; +using Newtonsoft.Json.Utilities; +using System.Globalization; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Get and set values for a using dynamic methods. + /// + public class DynamicValueProvider : IValueProvider + { + private readonly MemberInfo _memberInfo; + private Func _getter; + private Action _setter; + + /// + /// Initializes a new instance of the class. + /// + /// The member info. + public DynamicValueProvider(MemberInfo memberInfo) + { + ValidationUtils.ArgumentNotNull(memberInfo, nameof(memberInfo)); + _memberInfo = memberInfo; + } + + /// + /// Sets the value. + /// + /// The target to set the value on. + /// The value to set on the target. + public void SetValue(object target, object value) + { + try + { + if (_setter == null) + { + _setter = DynamicReflectionDelegateFactory.Instance.CreateSet(_memberInfo); + } + +#if DEBUG + // dynamic method doesn't check whether the type is 'legal' to set + // add this check for unit tests + if (value == null) + { + if (!ReflectionUtils.IsNullable(ReflectionUtils.GetMemberUnderlyingType(_memberInfo))) + { + throw new JsonSerializationException("Incompatible value. Cannot set {0} to null.".FormatWith(CultureInfo.InvariantCulture, _memberInfo)); + } + } + else if (!ReflectionUtils.GetMemberUnderlyingType(_memberInfo).IsAssignableFrom(value.GetType())) + { + throw new JsonSerializationException("Incompatible value. Cannot set {0} to type {1}.".FormatWith(CultureInfo.InvariantCulture, _memberInfo, value.GetType())); + } +#endif + + _setter(target, value); + } + catch (Exception ex) + { + throw new JsonSerializationException("Error setting value to '{0}' on '{1}'.".FormatWith(CultureInfo.InvariantCulture, _memberInfo.Name, target.GetType()), ex); + } + } + + /// + /// Gets the value. + /// + /// The target to get the value from. + /// The value. + public object GetValue(object target) + { + try + { + if (_getter == null) + { + _getter = DynamicReflectionDelegateFactory.Instance.CreateGet(_memberInfo); + } + + return _getter(target); + } + catch (Exception ex) + { + throw new JsonSerializationException("Error getting value from '{0}' on '{1}'.".FormatWith(CultureInfo.InvariantCulture, _memberInfo.Name, target.GetType()), ex); + } + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/ErrorContext.cs b/Common/00-1Json8.3/Json8.3/Serialization/ErrorContext.cs new file mode 100644 index 0000000..bcb2fbb --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/ErrorContext.cs @@ -0,0 +1,75 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Provides information surrounding an error. + /// + public class ErrorContext + { + internal ErrorContext(object originalObject, object member, string path, Exception error) + { + OriginalObject = originalObject; + Member = member; + Error = error; + Path = path; + } + + internal bool Traced { get; set; } + + /// + /// Gets the error. + /// + /// The error. + public Exception Error { get; private set; } + + /// + /// Gets the original object that caused the error. + /// + /// The original object that caused the error. + public object OriginalObject { get; private set; } + + /// + /// Gets the member that caused the error. + /// + /// The member that caused the error. + public object Member { get; private set; } + + /// + /// Gets the path of the JSON location where the error occurred. + /// + /// The path of the JSON location where the error occurred. + public string Path { get; private set; } + + /// + /// Gets or sets a value indicating whether this is handled. + /// + /// true if handled; otherwise, false. + public bool Handled { get; set; } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/ErrorEventArgs.cs b/Common/00-1Json8.3/Json8.3/Serialization/ErrorEventArgs.cs new file mode 100644 index 0000000..cae7d03 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/ErrorEventArgs.cs @@ -0,0 +1,58 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Provides data for the Error event. + /// + public class ErrorEventArgs : EventArgs + { + /// + /// Gets the current object the error event is being raised against. + /// + /// The current object the error event is being raised against. + public object CurrentObject { get; private set; } + + /// + /// Gets the error context. + /// + /// The error context. + public ErrorContext ErrorContext { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + /// The current object. + /// The error context. + public ErrorEventArgs(object currentObject, ErrorContext errorContext) + { + CurrentObject = currentObject; + ErrorContext = errorContext; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/ExpressionValueProvider.cs b/Common/00-1Json8.3/Json8.3/Serialization/ExpressionValueProvider.cs new file mode 100644 index 0000000..9774740 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/ExpressionValueProvider.cs @@ -0,0 +1,120 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(NET20 || NET35) +using System; +using System.Collections.Generic; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#endif +using System.Text; +using System.Reflection; +using Newtonsoft.Json.Utilities; +using System.Globalization; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Get and set values for a using dynamic methods. + /// + public class ExpressionValueProvider : IValueProvider + { + private readonly MemberInfo _memberInfo; + private Func _getter; + private Action _setter; + + /// + /// Initializes a new instance of the class. + /// + /// The member info. + public ExpressionValueProvider(MemberInfo memberInfo) + { + ValidationUtils.ArgumentNotNull(memberInfo, nameof(memberInfo)); + _memberInfo = memberInfo; + } + + /// + /// Sets the value. + /// + /// The target to set the value on. + /// The value to set on the target. + public void SetValue(object target, object value) + { + try + { + if (_setter == null) + { + _setter = ExpressionReflectionDelegateFactory.Instance.CreateSet(_memberInfo); + } + +#if DEBUG + // dynamic method doesn't check whether the type is 'legal' to set + // add this check for unit tests + if (value == null) + { + if (!ReflectionUtils.IsNullable(ReflectionUtils.GetMemberUnderlyingType(_memberInfo))) + { + throw new JsonSerializationException("Incompatible value. Cannot set {0} to null.".FormatWith(CultureInfo.InvariantCulture, _memberInfo)); + } + } + else if (!ReflectionUtils.GetMemberUnderlyingType(_memberInfo).IsAssignableFrom(value.GetType())) + { + throw new JsonSerializationException("Incompatible value. Cannot set {0} to type {1}.".FormatWith(CultureInfo.InvariantCulture, _memberInfo, value.GetType())); + } +#endif + + _setter(target, value); + } + catch (Exception ex) + { + throw new JsonSerializationException("Error setting value to '{0}' on '{1}'.".FormatWith(CultureInfo.InvariantCulture, _memberInfo.Name, target.GetType()), ex); + } + } + + /// + /// Gets the value. + /// + /// The target to get the value from. + /// The value. + public object GetValue(object target) + { + try + { + if (_getter == null) + { + _getter = ExpressionReflectionDelegateFactory.Instance.CreateGet(_memberInfo); + } + + return _getter(target); + } + catch (Exception ex) + { + throw new JsonSerializationException("Error getting value from '{0}' on '{1}'.".FormatWith(CultureInfo.InvariantCulture, _memberInfo.Name, target.GetType()), ex); + } + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/IAttributeProvider.cs b/Common/00-1Json8.3/Json8.3/Serialization/IAttributeProvider.cs new file mode 100644 index 0000000..97a6469 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/IAttributeProvider.cs @@ -0,0 +1,51 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Provides methods to get attributes. + /// + public interface IAttributeProvider + { + /// + /// Returns a collection of all of the attributes, or an empty collection if there are no attributes. + /// + /// When true, look up the hierarchy chain for the inherited custom attribute. + /// A collection of s, or an empty collection. + IList GetAttributes(bool inherit); + + /// + /// Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + /// + /// The type of the attributes. + /// When true, look up the hierarchy chain for the inherited custom attribute. + /// A collection of s, or an empty collection. + IList GetAttributes(Type attributeType, bool inherit); + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/IContractResolver.cs b/Common/00-1Json8.3/Json8.3/Serialization/IContractResolver.cs new file mode 100644 index 0000000..10f44ba --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/IContractResolver.cs @@ -0,0 +1,46 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Used by to resolves a for a given . + /// + /// + /// + /// + /// + public interface IContractResolver + { + /// + /// Resolves the contract for a given type. + /// + /// The type to resolve a contract for. + /// The contract for a given type. + JsonContract ResolveContract(Type type); + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/IReferenceResolver.cs b/Common/00-1Json8.3/Json8.3/Serialization/IReferenceResolver.cs new file mode 100644 index 0000000..271e307 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/IReferenceResolver.cs @@ -0,0 +1,67 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Used to resolve references when serializing and deserializing JSON by the . + /// + public interface IReferenceResolver + { + /// + /// Resolves a reference to its object. + /// + /// The serialization context. + /// The reference to resolve. + /// The object that + object ResolveReference(object context, string reference); + + /// + /// Gets the reference for the sepecified object. + /// + /// The serialization context. + /// The object to get a reference for. + /// The reference to the object. + string GetReference(object context, object value); + + /// + /// Determines whether the specified object is referenced. + /// + /// The serialization context. + /// The object to test for a reference. + /// + /// true if the specified object is referenced; otherwise, false. + /// + bool IsReferenced(object context, object value); + + /// + /// Adds a reference to the specified object. + /// + /// The serialization context. + /// The reference. + /// The object to reference. + void AddReference(object context, string reference, object value); + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/ITraceWriter.cs b/Common/00-1Json8.3/Json8.3/Serialization/ITraceWriter.cs new file mode 100644 index 0000000..46ed784 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/ITraceWriter.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Represents a trace writer. + /// + public interface ITraceWriter + { + /// + /// Gets the that will be used to filter the trace messages passed to the writer. + /// For example a filter level of Info will exclude Verbose messages and include Info, + /// Warning and Error messages. + /// + /// The that will be used to filter the trace messages passed to the writer. + TraceLevel LevelFilter { get; } + + /// + /// Writes the specified trace level, message and optional exception. + /// + /// The at which to write this trace. + /// The trace message. + /// The trace exception. This parameter is optional. + void Trace(TraceLevel level, string message, Exception ex); + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/IValueProvider.cs b/Common/00-1Json8.3/Json8.3/Serialization/IValueProvider.cs new file mode 100644 index 0000000..921724f --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/IValueProvider.cs @@ -0,0 +1,47 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Provides methods to get and set values. + /// + public interface IValueProvider + { + /// + /// Sets the value. + /// + /// The target to set the value on. + /// The value to set on the target. + void SetValue(object target, object value); + + /// + /// Gets the value. + /// + /// The target to get the value from. + /// The value. + object GetValue(object target); + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/JsonArrayContract.cs b/Common/00-1Json8.3/Json8.3/Serialization/JsonArrayContract.cs new file mode 100644 index 0000000..b39ca77 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/JsonArrayContract.cs @@ -0,0 +1,310 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Globalization; +using System.Reflection; +using Newtonsoft.Json.Utilities; +using System.Collections; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Contract details for a used by the . + /// + public class JsonArrayContract : JsonContainerContract + { + /// + /// Gets the of the collection items. + /// + /// The of the collection items. + public Type CollectionItemType { get; private set; } + + /// + /// Gets a value indicating whether the collection type is a multidimensional array. + /// + /// true if the collection type is a multidimensional array; otherwise, false. + public bool IsMultidimensionalArray { get; private set; } + + private readonly Type _genericCollectionDefinitionType; + + private Type _genericWrapperType; + private ObjectConstructor _genericWrapperCreator; + private Func _genericTemporaryCollectionCreator; + + internal bool IsArray { get; private set; } + internal bool ShouldCreateWrapper { get; private set; } + internal bool CanDeserialize { get; private set; } + + private readonly ConstructorInfo _parameterizedConstructor; + + private ObjectConstructor _parameterizedCreator; + private ObjectConstructor _overrideCreator; + + internal ObjectConstructor ParameterizedCreator + { + get + { + if (_parameterizedCreator == null) + { + _parameterizedCreator = JsonTypeReflector.ReflectionDelegateFactory.CreateParameterizedConstructor(_parameterizedConstructor); + } + + return _parameterizedCreator; + } + } + + /// + /// Gets or sets the function used to create the object. When set this function will override . + /// + /// The function used to create the object. + public ObjectConstructor OverrideCreator + { + get { return _overrideCreator; } + set + { + _overrideCreator = value; + // hacky + CanDeserialize = true; + } + } + + /// + /// Gets a value indicating whether the creator has a parameter with the collection values. + /// + /// true if the creator has a parameter with the collection values; otherwise, false. + public bool HasParameterizedCreator { get; set; } + + internal bool HasParameterizedCreatorInternal + { + get { return (HasParameterizedCreator || _parameterizedCreator != null || _parameterizedConstructor != null); } + } + + /// + /// Initializes a new instance of the class. + /// + /// The underlying type for the contract. + public JsonArrayContract(Type underlyingType) + : base(underlyingType) + { + ContractType = JsonContractType.Array; + IsArray = CreatedType.IsArray; + + bool canDeserialize; + + Type tempCollectionType; + if (IsArray) + { + CollectionItemType = ReflectionUtils.GetCollectionItemType(UnderlyingType); + IsReadOnlyOrFixedSize = true; + _genericCollectionDefinitionType = typeof(List<>).MakeGenericType(CollectionItemType); + + canDeserialize = true; + IsMultidimensionalArray = (IsArray && UnderlyingType.GetArrayRank() > 1); + } + else if (typeof(IList).IsAssignableFrom(underlyingType)) + { + if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(ICollection<>), out _genericCollectionDefinitionType)) + { + CollectionItemType = _genericCollectionDefinitionType.GetGenericArguments()[0]; + } + else + { + CollectionItemType = ReflectionUtils.GetCollectionItemType(underlyingType); + } + + if (underlyingType == typeof(IList)) + { + CreatedType = typeof(List); + } + + if (CollectionItemType != null) + { + _parameterizedConstructor = CollectionUtils.ResolveEnumerableCollectionConstructor(underlyingType, CollectionItemType); + } + + IsReadOnlyOrFixedSize = ReflectionUtils.InheritsGenericDefinition(underlyingType, typeof(ReadOnlyCollection<>)); + canDeserialize = true; + } + else if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(ICollection<>), out _genericCollectionDefinitionType)) + { + CollectionItemType = _genericCollectionDefinitionType.GetGenericArguments()[0]; + + if (ReflectionUtils.IsGenericDefinition(underlyingType, typeof(ICollection<>)) + || ReflectionUtils.IsGenericDefinition(underlyingType, typeof(IList<>))) + { + CreatedType = typeof(List<>).MakeGenericType(CollectionItemType); + } + +#if !(NET20 || NET35) + if (ReflectionUtils.IsGenericDefinition(underlyingType, typeof(ISet<>))) + { + CreatedType = typeof(HashSet<>).MakeGenericType(CollectionItemType); + } +#endif + + _parameterizedConstructor = CollectionUtils.ResolveEnumerableCollectionConstructor(underlyingType, CollectionItemType); + canDeserialize = true; + ShouldCreateWrapper = true; + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IReadOnlyCollection<>), out tempCollectionType)) + { + CollectionItemType = tempCollectionType.GetGenericArguments()[0]; + + if (ReflectionUtils.IsGenericDefinition(underlyingType, typeof(IReadOnlyCollection<>)) + || ReflectionUtils.IsGenericDefinition(underlyingType, typeof(IReadOnlyList<>))) + { + CreatedType = typeof(ReadOnlyCollection<>).MakeGenericType(CollectionItemType); + } + + _genericCollectionDefinitionType = typeof(List<>).MakeGenericType(CollectionItemType); + _parameterizedConstructor = CollectionUtils.ResolveEnumerableCollectionConstructor(CreatedType, CollectionItemType); + IsReadOnlyOrFixedSize = true; + canDeserialize = HasParameterizedCreatorInternal; + } +#endif + else if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IEnumerable<>), out tempCollectionType)) + { + CollectionItemType = tempCollectionType.GetGenericArguments()[0]; + + if (ReflectionUtils.IsGenericDefinition(UnderlyingType, typeof(IEnumerable<>))) + { + CreatedType = typeof(List<>).MakeGenericType(CollectionItemType); + } + + _parameterizedConstructor = CollectionUtils.ResolveEnumerableCollectionConstructor(underlyingType, CollectionItemType); + +#if !(NET35 || NET20) + if (!HasParameterizedCreatorInternal && underlyingType.Name == FSharpUtils.FSharpListTypeName) + { + FSharpUtils.EnsureInitialized(underlyingType.Assembly()); + _parameterizedCreator = FSharpUtils.CreateSeq(CollectionItemType); + } +#endif + + if (underlyingType.IsGenericType() && underlyingType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) + { + _genericCollectionDefinitionType = tempCollectionType; + + IsReadOnlyOrFixedSize = false; + ShouldCreateWrapper = false; + canDeserialize = true; + } + else + { + _genericCollectionDefinitionType = typeof(List<>).MakeGenericType(CollectionItemType); + + IsReadOnlyOrFixedSize = true; + ShouldCreateWrapper = true; + canDeserialize = HasParameterizedCreatorInternal; + } + } + else + { + // types that implement IEnumerable and nothing else + canDeserialize = false; + ShouldCreateWrapper = true; + } + + CanDeserialize = canDeserialize; + +#if (NET20 || NET35) + if (CollectionItemType != null && ReflectionUtils.IsNullableType(CollectionItemType)) + { + // bug in .NET 2.0 & 3.5 that List> throws an error when adding null via IList.Add(object) + // wrapper will handle calling Add(T) instead + if (ReflectionUtils.InheritsGenericDefinition(CreatedType, typeof(List<>), out tempCollectionType) + || (IsArray && !IsMultidimensionalArray)) + { + ShouldCreateWrapper = true; + } + } +#endif + +#if !(NET20 || NET35 || NET40) + Type immutableCreatedType; + ObjectConstructor immutableParameterizedCreator; + if (ImmutableCollectionsUtils.TryBuildImmutableForArrayContract(underlyingType, CollectionItemType, out immutableCreatedType, out immutableParameterizedCreator)) + { + CreatedType = immutableCreatedType; + _parameterizedCreator = immutableParameterizedCreator; + IsReadOnlyOrFixedSize = true; + CanDeserialize = true; + } +#endif + } + + internal IWrappedCollection CreateWrapper(object list) + { + if (_genericWrapperCreator == null) + { + _genericWrapperType = typeof(CollectionWrapper<>).MakeGenericType(CollectionItemType); + + Type constructorArgument; + + if (ReflectionUtils.InheritsGenericDefinition(_genericCollectionDefinitionType, typeof(List<>)) + || _genericCollectionDefinitionType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) + { + constructorArgument = typeof(ICollection<>).MakeGenericType(CollectionItemType); + } + else + { + constructorArgument = _genericCollectionDefinitionType; + } + + ConstructorInfo genericWrapperConstructor = _genericWrapperType.GetConstructor(new[] { constructorArgument }); + _genericWrapperCreator = JsonTypeReflector.ReflectionDelegateFactory.CreateParameterizedConstructor(genericWrapperConstructor); + } + + return (IWrappedCollection)_genericWrapperCreator(list); + } + + internal IList CreateTemporaryCollection() + { + if (_genericTemporaryCollectionCreator == null) + { + // multidimensional array will also have array instances in it + Type collectionItemType = (IsMultidimensionalArray || CollectionItemType == null) + ? typeof(object) + : CollectionItemType; + + Type temporaryListType = typeof(List<>).MakeGenericType(collectionItemType); + _genericTemporaryCollectionCreator = JsonTypeReflector.ReflectionDelegateFactory.CreateDefaultConstructor(temporaryListType); + } + + return (IList)_genericTemporaryCollectionCreator(); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/JsonContainerContract.cs b/Common/00-1Json8.3/Json8.3/Serialization/JsonContainerContract.cs new file mode 100644 index 0000000..ef91743 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/JsonContainerContract.cs @@ -0,0 +1,120 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Reflection; +using Newtonsoft.Json.Utilities; +using System.Collections; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Contract details for a used by the . + /// + public class JsonContainerContract : JsonContract + { + private JsonContract _itemContract; + private JsonContract _finalItemContract; + + // will be null for containers that don't have an item type (e.g. IList) or for complex objects + internal JsonContract ItemContract + { + get { return _itemContract; } + set + { + _itemContract = value; + if (_itemContract != null) + { + _finalItemContract = (_itemContract.UnderlyingType.IsSealed()) ? _itemContract : null; + } + else + { + _finalItemContract = null; + } + } + } + + // the final (i.e. can't be inherited from like a sealed class or valuetype) item contract + internal JsonContract FinalItemContract + { + get { return _finalItemContract; } + } + + /// + /// Gets or sets the default collection items . + /// + /// The converter. + public JsonConverter ItemConverter { get; set; } + + /// + /// Gets or sets a value indicating whether the collection items preserve object references. + /// + /// true if collection items preserve object references; otherwise, false. + public bool? ItemIsReference { get; set; } + + /// + /// Gets or sets the collection item reference loop handling. + /// + /// The reference loop handling. + public ReferenceLoopHandling? ItemReferenceLoopHandling { get; set; } + + /// + /// Gets or sets the collection item type name handling. + /// + /// The type name handling. + public TypeNameHandling? ItemTypeNameHandling { get; set; } + + /// + /// Initializes a new instance of the class. + /// + /// The underlying type for the contract. + internal JsonContainerContract(Type underlyingType) + : base(underlyingType) + { + JsonContainerAttribute jsonContainerAttribute = JsonTypeReflector.GetCachedAttribute(underlyingType); + + if (jsonContainerAttribute != null) + { + if (jsonContainerAttribute.ItemConverterType != null) + { + ItemConverter = JsonTypeReflector.CreateJsonConverterInstance( + jsonContainerAttribute.ItemConverterType, + jsonContainerAttribute.ItemConverterParameters); + } + + ItemIsReference = jsonContainerAttribute._itemIsReference; + ItemReferenceLoopHandling = jsonContainerAttribute._itemReferenceLoopHandling; + ItemTypeNameHandling = jsonContainerAttribute._itemTypeNameHandling; + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/JsonContract.cs b/Common/00-1Json8.3/Json8.3/Serialization/JsonContract.cs new file mode 100644 index 0000000..6d0b2c3 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/JsonContract.cs @@ -0,0 +1,392 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using System.Runtime.Serialization; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Serialization +{ + internal enum JsonContractType + { + None = 0, + Object = 1, + Array = 2, + Primitive = 3, + String = 4, + Dictionary = 5, + Dynamic = 6, + Serializable = 7, + Linq = 8 + } + + /// + /// Handles serialization callback events. + /// + /// The object that raised the callback event. + /// The streaming context. + public delegate void SerializationCallback(object o, StreamingContext context); + + /// + /// Handles serialization error callback events. + /// + /// The object that raised the callback event. + /// The streaming context. + /// The error context. + public delegate void SerializationErrorCallback(object o, StreamingContext context, ErrorContext errorContext); + + /// + /// Sets extension data for an object during deserialization. + /// + /// The object to set extension data on. + /// The extension data key. + /// The extension data value. + public delegate void ExtensionDataSetter(object o, string key, object value); + + /// + /// Gets extension data for an object during serialization. + /// + /// The object to set extension data on. + public delegate IEnumerable> ExtensionDataGetter(object o); + + /// + /// Contract details for a used by the . + /// + public abstract class JsonContract + { + internal bool IsNullable; + internal bool IsConvertable; + internal bool IsEnum; + internal Type NonNullableUnderlyingType; + internal ReadType InternalReadType; + internal JsonContractType ContractType; + internal bool IsReadOnlyOrFixedSize; + internal bool IsSealed; + internal bool IsInstantiable; + + private List _onDeserializedCallbacks; + private IList _onDeserializingCallbacks; + private IList _onSerializedCallbacks; + private IList _onSerializingCallbacks; + private IList _onErrorCallbacks; + private Type _createdType; + + /// + /// Gets the underlying type for the contract. + /// + /// The underlying type for the contract. + public Type UnderlyingType { get; private set; } + + /// + /// Gets or sets the type created during deserialization. + /// + /// The type created during deserialization. + public Type CreatedType + { + get { return _createdType; } + set + { + _createdType = value; + + IsSealed = _createdType.IsSealed(); + IsInstantiable = !(_createdType.IsInterface() || _createdType.IsAbstract()); + } + } + + /// + /// Gets or sets whether this type contract is serialized as a reference. + /// + /// Whether this type contract is serialized as a reference. + public bool? IsReference { get; set; } + + /// + /// Gets or sets the default for this contract. + /// + /// The converter. + public JsonConverter Converter { get; set; } + + // internally specified JsonConverter's to override default behavour + // checked for after passed in converters and attribute specified converters + internal JsonConverter InternalConverter { get; set; } + + /// + /// Gets or sets all methods called immediately after deserialization of the object. + /// + /// The methods called immediately after deserialization of the object. + public IList OnDeserializedCallbacks + { + get + { + if (_onDeserializedCallbacks == null) + { + _onDeserializedCallbacks = new List(); + } + + return _onDeserializedCallbacks; + } + } + + /// + /// Gets or sets all methods called during deserialization of the object. + /// + /// The methods called during deserialization of the object. + public IList OnDeserializingCallbacks + { + get + { + if (_onDeserializingCallbacks == null) + { + _onDeserializingCallbacks = new List(); + } + + return _onDeserializingCallbacks; + } + } + + /// + /// Gets or sets all methods called after serialization of the object graph. + /// + /// The methods called after serialization of the object graph. + public IList OnSerializedCallbacks + { + get + { + if (_onSerializedCallbacks == null) + { + _onSerializedCallbacks = new List(); + } + + return _onSerializedCallbacks; + } + } + + /// + /// Gets or sets all methods called before serialization of the object. + /// + /// The methods called before serialization of the object. + public IList OnSerializingCallbacks + { + get + { + if (_onSerializingCallbacks == null) + { + _onSerializingCallbacks = new List(); + } + + return _onSerializingCallbacks; + } + } + + /// + /// Gets or sets all method called when an error is thrown during the serialization of the object. + /// + /// The methods called when an error is thrown during the serialization of the object. + public IList OnErrorCallbacks + { + get + { + if (_onErrorCallbacks == null) + { + _onErrorCallbacks = new List(); + } + + return _onErrorCallbacks; + } + } + + /// + /// Gets or sets the method called immediately after deserialization of the object. + /// + /// The method called immediately after deserialization of the object. + [Obsolete("This property is obsolete and has been replaced by the OnDeserializedCallbacks collection.")] + public MethodInfo OnDeserialized + { + get { return (OnDeserializedCallbacks.Count > 0) ? OnDeserializedCallbacks[0].Method() : null; } + set + { + OnDeserializedCallbacks.Clear(); + OnDeserializedCallbacks.Add(CreateSerializationCallback(value)); + } + } + + /// + /// Gets or sets the method called during deserialization of the object. + /// + /// The method called during deserialization of the object. + [Obsolete("This property is obsolete and has been replaced by the OnDeserializingCallbacks collection.")] + public MethodInfo OnDeserializing + { + get { return (OnDeserializingCallbacks.Count > 0) ? OnDeserializingCallbacks[0].Method() : null; } + set + { + OnDeserializingCallbacks.Clear(); + OnDeserializingCallbacks.Add(CreateSerializationCallback(value)); + } + } + + /// + /// Gets or sets the method called after serialization of the object graph. + /// + /// The method called after serialization of the object graph. + [Obsolete("This property is obsolete and has been replaced by the OnSerializedCallbacks collection.")] + public MethodInfo OnSerialized + { + get { return (OnSerializedCallbacks.Count > 0) ? OnSerializedCallbacks[0].Method() : null; } + set + { + OnSerializedCallbacks.Clear(); + OnSerializedCallbacks.Add(CreateSerializationCallback(value)); + } + } + + /// + /// Gets or sets the method called before serialization of the object. + /// + /// The method called before serialization of the object. + [Obsolete("This property is obsolete and has been replaced by the OnSerializingCallbacks collection.")] + public MethodInfo OnSerializing + { + get { return (OnSerializingCallbacks.Count > 0) ? OnSerializingCallbacks[0].Method() : null; } + set + { + OnSerializingCallbacks.Clear(); + OnSerializingCallbacks.Add(CreateSerializationCallback(value)); + } + } + + /// + /// Gets or sets the method called when an error is thrown during the serialization of the object. + /// + /// The method called when an error is thrown during the serialization of the object. + [Obsolete("This property is obsolete and has been replaced by the OnErrorCallbacks collection.")] + public MethodInfo OnError + { + get { return (OnErrorCallbacks.Count > 0) ? OnErrorCallbacks[0].Method() : null; } + set + { + OnErrorCallbacks.Clear(); + OnErrorCallbacks.Add(CreateSerializationErrorCallback(value)); + } + } + + /// + /// Gets or sets the default creator method used to create the object. + /// + /// The default creator method used to create the object. + public Func DefaultCreator { get; set; } + + /// + /// Gets or sets a value indicating whether the default creator is non public. + /// + /// true if the default object creator is non-public; otherwise, false. + public bool DefaultCreatorNonPublic { get; set; } + + internal JsonContract(Type underlyingType) + { + ValidationUtils.ArgumentNotNull(underlyingType, nameof(underlyingType)); + + UnderlyingType = underlyingType; + + IsNullable = ReflectionUtils.IsNullable(underlyingType); + NonNullableUnderlyingType = (IsNullable && ReflectionUtils.IsNullableType(underlyingType)) ? Nullable.GetUnderlyingType(underlyingType) : underlyingType; + + CreatedType = NonNullableUnderlyingType; + + IsConvertable = ConvertUtils.IsConvertible(NonNullableUnderlyingType); + IsEnum = NonNullableUnderlyingType.IsEnum(); + + InternalReadType = ReadType.Read; + } + + internal void InvokeOnSerializing(object o, StreamingContext context) + { + if (_onSerializingCallbacks != null) + { + foreach (SerializationCallback callback in _onSerializingCallbacks) + { + callback(o, context); + } + } + } + + internal void InvokeOnSerialized(object o, StreamingContext context) + { + if (_onSerializedCallbacks != null) + { + foreach (SerializationCallback callback in _onSerializedCallbacks) + { + callback(o, context); + } + } + } + + internal void InvokeOnDeserializing(object o, StreamingContext context) + { + if (_onDeserializingCallbacks != null) + { + foreach (SerializationCallback callback in _onDeserializingCallbacks) + { + callback(o, context); + } + } + } + + internal void InvokeOnDeserialized(object o, StreamingContext context) + { + if (_onDeserializedCallbacks != null) + { + foreach (SerializationCallback callback in _onDeserializedCallbacks) + { + callback(o, context); + } + } + } + + internal void InvokeOnError(object o, StreamingContext context, ErrorContext errorContext) + { + if (_onErrorCallbacks != null) + { + foreach (SerializationErrorCallback callback in _onErrorCallbacks) + { + callback(o, context, errorContext); + } + } + } + + internal static SerializationCallback CreateSerializationCallback(MethodInfo callbackMethodInfo) + { + return (o, context) => callbackMethodInfo.Invoke(o, new object[] { context }); + } + + internal static SerializationErrorCallback CreateSerializationErrorCallback(MethodInfo callbackMethodInfo) + { + return (o, context, econtext) => callbackMethodInfo.Invoke(o, new object[] { context, econtext }); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/JsonDictionaryContract.cs b/Common/00-1Json8.3/Json8.3/Serialization/JsonDictionaryContract.cs new file mode 100644 index 0000000..ab3829c --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/JsonDictionaryContract.cs @@ -0,0 +1,242 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Reflection; +using Newtonsoft.Json.Utilities; +using System.Collections; + +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#endif + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Contract details for a used by the . + /// + public class JsonDictionaryContract : JsonContainerContract + { + /// + /// Gets or sets the property name resolver. + /// + /// The property name resolver. + [Obsolete("PropertyNameResolver is obsolete. Use DictionaryKeyResolver instead.")] + public Func PropertyNameResolver + { + get { return DictionaryKeyResolver; } + set { DictionaryKeyResolver = value; } + } + + /// + /// Gets or sets the dictionary key resolver. + /// + /// The dictionary key resolver. + public Func DictionaryKeyResolver { get; set; } + + /// + /// Gets the of the dictionary keys. + /// + /// The of the dictionary keys. + public Type DictionaryKeyType { get; private set; } + + /// + /// Gets the of the dictionary values. + /// + /// The of the dictionary values. + public Type DictionaryValueType { get; private set; } + + internal JsonContract KeyContract { get; set; } + + private readonly Type _genericCollectionDefinitionType; + + private Type _genericWrapperType; + private ObjectConstructor _genericWrapperCreator; + + private Func _genericTemporaryDictionaryCreator; + + internal bool ShouldCreateWrapper { get; private set; } + + private readonly ConstructorInfo _parameterizedConstructor; + + private ObjectConstructor _overrideCreator; + private ObjectConstructor _parameterizedCreator; + + internal ObjectConstructor ParameterizedCreator + { + get + { + if (_parameterizedCreator == null) + { + _parameterizedCreator = JsonTypeReflector.ReflectionDelegateFactory.CreateParameterizedConstructor(_parameterizedConstructor); + } + + return _parameterizedCreator; + } + } + + /// + /// Gets or sets the function used to create the object. When set this function will override . + /// + /// The function used to create the object. + public ObjectConstructor OverrideCreator + { + get { return _overrideCreator; } + set { _overrideCreator = value; } + } + + /// + /// Gets a value indicating whether the creator has a parameter with the dictionary values. + /// + /// true if the creator has a parameter with the dictionary values; otherwise, false. + public bool HasParameterizedCreator { get; set; } + + internal bool HasParameterizedCreatorInternal + { + get { return (HasParameterizedCreator || _parameterizedCreator != null || _parameterizedConstructor != null); } + } + + /// + /// Initializes a new instance of the class. + /// + /// The underlying type for the contract. + public JsonDictionaryContract(Type underlyingType) + : base(underlyingType) + { + ContractType = JsonContractType.Dictionary; + + Type keyType; + Type valueType; + + if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IDictionary<,>), out _genericCollectionDefinitionType)) + { + keyType = _genericCollectionDefinitionType.GetGenericArguments()[0]; + valueType = _genericCollectionDefinitionType.GetGenericArguments()[1]; + + if (ReflectionUtils.IsGenericDefinition(UnderlyingType, typeof(IDictionary<,>))) + { + CreatedType = typeof(Dictionary<,>).MakeGenericType(keyType, valueType); + } + +#if !(NET40 || NET35 || NET20 || PORTABLE40) + IsReadOnlyOrFixedSize = ReflectionUtils.InheritsGenericDefinition(underlyingType, typeof(ReadOnlyDictionary<,>)); +#endif + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IReadOnlyDictionary<,>), out _genericCollectionDefinitionType)) + { + keyType = _genericCollectionDefinitionType.GetGenericArguments()[0]; + valueType = _genericCollectionDefinitionType.GetGenericArguments()[1]; + + if (ReflectionUtils.IsGenericDefinition(UnderlyingType, typeof(IReadOnlyDictionary<,>))) + { + CreatedType = typeof(ReadOnlyDictionary<,>).MakeGenericType(keyType, valueType); + } + + IsReadOnlyOrFixedSize = true; + } +#endif + else + { + ReflectionUtils.GetDictionaryKeyValueTypes(UnderlyingType, out keyType, out valueType); + + if (UnderlyingType == typeof(IDictionary)) + { + CreatedType = typeof(Dictionary); + } + } + + if (keyType != null && valueType != null) + { + _parameterizedConstructor = CollectionUtils.ResolveEnumerableCollectionConstructor(CreatedType, typeof(KeyValuePair<,>).MakeGenericType(keyType, valueType)); + +#if !(NET35 || NET20) + if (!HasParameterizedCreatorInternal && underlyingType.Name == FSharpUtils.FSharpMapTypeName) + { + FSharpUtils.EnsureInitialized(underlyingType.Assembly()); + _parameterizedCreator = FSharpUtils.CreateMap(keyType, valueType); + } +#endif + } + + ShouldCreateWrapper = !typeof(IDictionary).IsAssignableFrom(CreatedType); + + DictionaryKeyType = keyType; + DictionaryValueType = valueType; + +#if (NET20 || NET35) + if (DictionaryValueType != null && ReflectionUtils.IsNullableType(DictionaryValueType)) + { + Type tempDictioanryType; + + // bug in .NET 2.0 & 3.5 that Dictionary> throws an error when adding null via IDictionary[key] = object + // wrapper will handle calling Add(T) instead + if (ReflectionUtils.InheritsGenericDefinition(CreatedType, typeof(Dictionary<,>), out tempDictioanryType)) + { + ShouldCreateWrapper = true; + } + } +#endif + +#if !(NET20 || NET35 || NET40) + Type immutableCreatedType; + ObjectConstructor immutableParameterizedCreator; + if (ImmutableCollectionsUtils.TryBuildImmutableForDictionaryContract(underlyingType, DictionaryKeyType, DictionaryValueType, out immutableCreatedType, out immutableParameterizedCreator)) + { + CreatedType = immutableCreatedType; + _parameterizedCreator = immutableParameterizedCreator; + IsReadOnlyOrFixedSize = true; + } +#endif + } + + internal IWrappedDictionary CreateWrapper(object dictionary) + { + if (_genericWrapperCreator == null) + { + _genericWrapperType = typeof(DictionaryWrapper<,>).MakeGenericType(DictionaryKeyType, DictionaryValueType); + + ConstructorInfo genericWrapperConstructor = _genericWrapperType.GetConstructor(new[] { _genericCollectionDefinitionType }); + _genericWrapperCreator = JsonTypeReflector.ReflectionDelegateFactory.CreateParameterizedConstructor(genericWrapperConstructor); + } + + return (IWrappedDictionary)_genericWrapperCreator(dictionary); + } + + internal IDictionary CreateTemporaryDictionary() + { + if (_genericTemporaryDictionaryCreator == null) + { + Type temporaryDictionaryType = typeof(Dictionary<,>).MakeGenericType(DictionaryKeyType ?? typeof(object), DictionaryValueType ?? typeof(object)); + + _genericTemporaryDictionaryCreator = JsonTypeReflector.ReflectionDelegateFactory.CreateDefaultConstructor(temporaryDictionaryType); + } + + return (IDictionary)_genericTemporaryDictionaryCreator(); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/JsonDynamicContract.cs b/Common/00-1Json8.3/Json8.3/Serialization/JsonDynamicContract.cs new file mode 100644 index 0000000..f4cbfc1 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/JsonDynamicContract.cs @@ -0,0 +1,119 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(NET35 || NET20 || PORTABLE40) +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Reflection; +using System.Runtime.CompilerServices; +using Newtonsoft.Json.Utilities; +using System.Collections; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Contract details for a used by the . + /// + public class JsonDynamicContract : JsonContainerContract + { + /// + /// Gets the object's properties. + /// + /// The object's properties. + public JsonPropertyCollection Properties { get; private set; } + + /// + /// Gets or sets the property name resolver. + /// + /// The property name resolver. + public Func PropertyNameResolver { get; set; } + + private readonly ThreadSafeStore>> _callSiteGetters = + new ThreadSafeStore>>(CreateCallSiteGetter); + + private readonly ThreadSafeStore>> _callSiteSetters = + new ThreadSafeStore>>(CreateCallSiteSetter); + + private static CallSite> CreateCallSiteGetter(string name) + { + GetMemberBinder getMemberBinder = (GetMemberBinder)DynamicUtils.BinderWrapper.GetMember(name, typeof(DynamicUtils)); + + return CallSite>.Create(new NoThrowGetBinderMember(getMemberBinder)); + } + + private static CallSite> CreateCallSiteSetter(string name) + { + SetMemberBinder binder = (SetMemberBinder)DynamicUtils.BinderWrapper.SetMember(name, typeof(DynamicUtils)); + + return CallSite>.Create(new NoThrowSetBinderMember(binder)); + } + + /// + /// Initializes a new instance of the class. + /// + /// The underlying type for the contract. + public JsonDynamicContract(Type underlyingType) + : base(underlyingType) + { + ContractType = JsonContractType.Dynamic; + + Properties = new JsonPropertyCollection(UnderlyingType); + } + + internal bool TryGetMember(IDynamicMetaObjectProvider dynamicProvider, string name, out object value) + { + ValidationUtils.ArgumentNotNull(dynamicProvider, nameof(dynamicProvider)); + + CallSite> callSite = _callSiteGetters.Get(name); + + object result = callSite.Target(callSite, dynamicProvider); + + if (!ReferenceEquals(result, NoThrowExpressionVisitor.ErrorResult)) + { + value = result; + return true; + } + else + { + value = null; + return false; + } + } + + internal bool TrySetMember(IDynamicMetaObjectProvider dynamicProvider, string name, object value) + { + ValidationUtils.ArgumentNotNull(dynamicProvider, nameof(dynamicProvider)); + + CallSite> callSite = _callSiteSetters.Get(name); + + object result = callSite.Target(callSite, dynamicProvider, value); + + return !ReferenceEquals(result, NoThrowExpressionVisitor.ErrorResult); + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/JsonFormatterConverter.cs b/Common/00-1Json8.3/Json8.3/Serialization/JsonFormatterConverter.cs new file mode 100644 index 0000000..df83357 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/JsonFormatterConverter.cs @@ -0,0 +1,161 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(DOTNET || PORTABLE40 || PORTABLE) +using System; +using System.Globalization; +using System.Runtime.Serialization; +using Newtonsoft.Json.Utilities; +using Newtonsoft.Json.Linq; + +namespace Newtonsoft.Json.Serialization +{ + internal class JsonFormatterConverter : IFormatterConverter + { + private readonly JsonSerializerInternalReader _reader; + private readonly JsonISerializableContract _contract; + private readonly JsonProperty _member; + + public JsonFormatterConverter(JsonSerializerInternalReader reader, JsonISerializableContract contract, JsonProperty member) + { + ValidationUtils.ArgumentNotNull(reader, nameof(reader)); + ValidationUtils.ArgumentNotNull(contract, nameof(contract)); + + _reader = reader; + _contract = contract; + _member = member; + } + + private T GetTokenValue(object value) + { + ValidationUtils.ArgumentNotNull(value, nameof(value)); + + JValue v = (JValue)value; + return (T)System.Convert.ChangeType(v.Value, typeof(T), CultureInfo.InvariantCulture); + } + + public object Convert(object value, Type type) + { + ValidationUtils.ArgumentNotNull(value, nameof(value)); + + JToken token = value as JToken; + if (token == null) + { + throw new ArgumentException("Value is not a JToken.", nameof(value)); + } + + return _reader.CreateISerializableItem(token, type, _contract, _member); + } + + public object Convert(object value, TypeCode typeCode) + { + ValidationUtils.ArgumentNotNull(value, nameof(value)); + + if (value is JValue) + { + value = ((JValue)value).Value; + } + + return System.Convert.ChangeType(value, typeCode, CultureInfo.InvariantCulture); + } + + public bool ToBoolean(object value) + { + return GetTokenValue(value); + } + + public byte ToByte(object value) + { + return GetTokenValue(value); + } + + public char ToChar(object value) + { + return GetTokenValue(value); + } + + public DateTime ToDateTime(object value) + { + return GetTokenValue(value); + } + + public decimal ToDecimal(object value) + { + return GetTokenValue(value); + } + + public double ToDouble(object value) + { + return GetTokenValue(value); + } + + public short ToInt16(object value) + { + return GetTokenValue(value); + } + + public int ToInt32(object value) + { + return GetTokenValue(value); + } + + public long ToInt64(object value) + { + return GetTokenValue(value); + } + + public sbyte ToSByte(object value) + { + return GetTokenValue(value); + } + + public float ToSingle(object value) + { + return GetTokenValue(value); + } + + public string ToString(object value) + { + return GetTokenValue(value); + } + + public ushort ToUInt16(object value) + { + return GetTokenValue(value); + } + + public uint ToUInt32(object value) + { + return GetTokenValue(value); + } + + public ulong ToUInt64(object value) + { + return GetTokenValue(value); + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/JsonISerializableContract.cs b/Common/00-1Json8.3/Json8.3/Serialization/JsonISerializableContract.cs new file mode 100644 index 0000000..0e8dc09 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/JsonISerializableContract.cs @@ -0,0 +1,55 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(DOTNET || PORTABLE || PORTABLE40) +using System; +using System.Runtime.Serialization; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Contract details for a used by the . + /// + public class JsonISerializableContract : JsonContainerContract + { + /// + /// Gets or sets the ISerializable object constructor. + /// + /// The ISerializable object constructor. + public ObjectConstructor ISerializableCreator { get; set; } + + /// + /// Initializes a new instance of the class. + /// + /// The underlying type for the contract. + public JsonISerializableContract(Type underlyingType) + : base(underlyingType) + { + ContractType = JsonContractType.Serializable; + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/JsonLinqContract.cs b/Common/00-1Json8.3/Json8.3/Serialization/JsonLinqContract.cs new file mode 100644 index 0000000..c91b3f0 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/JsonLinqContract.cs @@ -0,0 +1,45 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Contract details for a used by the . + /// + public class JsonLinqContract : JsonContract + { + /// + /// Initializes a new instance of the class. + /// + /// The underlying type for the contract. + public JsonLinqContract(Type underlyingType) + : base(underlyingType) + { + ContractType = JsonContractType.Linq; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/JsonObjectContract.cs b/Common/00-1Json8.3/Json8.3/Serialization/JsonObjectContract.cs new file mode 100644 index 0000000..ff81d12 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/JsonObjectContract.cs @@ -0,0 +1,227 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Globalization; +using System.Reflection; +using System.Runtime.Serialization; +using System.Security; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Contract details for a used by the . + /// + public class JsonObjectContract : JsonContainerContract + { + /// + /// Gets or sets the object member serialization. + /// + /// The member object serialization. + public MemberSerialization MemberSerialization { get; set; } + + /// + /// Gets or sets a value that indicates whether the object's properties are required. + /// + /// + /// A value indicating whether the object's properties are required. + /// + public Required? ItemRequired { get; set; } + + /// + /// Gets the object's properties. + /// + /// The object's properties. + public JsonPropertyCollection Properties { get; private set; } + + /// + /// Gets the constructor parameters required for any non-default constructor + /// + [Obsolete("ConstructorParameters is obsolete. Use CreatorParameters instead.")] + public JsonPropertyCollection ConstructorParameters + { + get { return CreatorParameters; } + } + + /// + /// Gets a collection of instances that define the parameters used with . + /// + public JsonPropertyCollection CreatorParameters + { + get + { + if (_creatorParameters == null) + { + _creatorParameters = new JsonPropertyCollection(UnderlyingType); + } + + return _creatorParameters; + } + } + + /// + /// Gets or sets the override constructor used to create the object. + /// This is set when a constructor is marked up using the + /// JsonConstructor attribute. + /// + /// The override constructor. + [Obsolete("OverrideConstructor is obsolete. Use OverrideCreator instead.")] + public ConstructorInfo OverrideConstructor + { + get { return _overrideConstructor; } + set + { + _overrideConstructor = value; + _overrideCreator = (value != null) ? JsonTypeReflector.ReflectionDelegateFactory.CreateParameterizedConstructor(value) : null; + } + } + + /// + /// Gets or sets the parametrized constructor used to create the object. + /// + /// The parametrized constructor. + [Obsolete("ParametrizedConstructor is obsolete. Use OverrideCreator instead.")] + public ConstructorInfo ParametrizedConstructor + { + get { return _parametrizedConstructor; } + set + { + _parametrizedConstructor = value; + _parameterizedCreator = (value != null) ? JsonTypeReflector.ReflectionDelegateFactory.CreateParameterizedConstructor(value) : null; + } + } + + /// + /// Gets or sets the function used to create the object. When set this function will override . + /// This function is called with a collection of arguments which are defined by the collection. + /// + /// The function used to create the object. + public ObjectConstructor OverrideCreator + { + get { return _overrideCreator; } + set + { + _overrideCreator = value; + _overrideConstructor = null; + } + } + + internal ObjectConstructor ParameterizedCreator + { + get { return _parameterizedCreator; } + } + + /// + /// Gets or sets the extension data setter. + /// + public ExtensionDataSetter ExtensionDataSetter { get; set; } + + /// + /// Gets or sets the extension data getter. + /// + public ExtensionDataGetter ExtensionDataGetter { get; set; } + + /// + /// Gets or sets the extension data value type. + /// + public Type ExtensionDataValueType + { + get { return _extensionDataValueType; } + set + { + _extensionDataValueType = value; + ExtensionDataIsJToken = (value != null && typeof(JToken).IsAssignableFrom(value)); + } + } + + internal bool ExtensionDataIsJToken; + private bool? _hasRequiredOrDefaultValueProperties; + private ConstructorInfo _parametrizedConstructor; + private ConstructorInfo _overrideConstructor; + private ObjectConstructor _overrideCreator; + private ObjectConstructor _parameterizedCreator; + private JsonPropertyCollection _creatorParameters; + private Type _extensionDataValueType; + + internal bool HasRequiredOrDefaultValueProperties + { + get + { + if (_hasRequiredOrDefaultValueProperties == null) + { + _hasRequiredOrDefaultValueProperties = false; + + if (ItemRequired.GetValueOrDefault(Required.Default) != Required.Default) + { + _hasRequiredOrDefaultValueProperties = true; + } + else + { + foreach (JsonProperty property in Properties) + { + if (property.Required != Required.Default || (property.DefaultValueHandling & DefaultValueHandling.Populate) == DefaultValueHandling.Populate) + { + _hasRequiredOrDefaultValueProperties = true; + break; + } + } + } + } + + return _hasRequiredOrDefaultValueProperties.GetValueOrDefault(); + } + } + + /// + /// Initializes a new instance of the class. + /// + /// The underlying type for the contract. + public JsonObjectContract(Type underlyingType) + : base(underlyingType) + { + ContractType = JsonContractType.Object; + + Properties = new JsonPropertyCollection(UnderlyingType); + } + +#if !(DOTNET || PORTABLE40 || PORTABLE) +#if !(NET20 || NET35) + [SecuritySafeCritical] +#endif + internal object GetUninitializedObject() + { + // we should never get here if the environment is not fully trusted, check just in case + if (!JsonTypeReflector.FullyTrusted) + { + throw new JsonException("Insufficient permissions. Creating an uninitialized '{0}' type requires full trust.".FormatWith(CultureInfo.InvariantCulture, NonNullableUnderlyingType)); + } + + return FormatterServices.GetUninitializedObject(NonNullableUnderlyingType); + } +#endif + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/JsonPrimitiveContract.cs b/Common/00-1Json8.3/Json8.3/Serialization/JsonPrimitiveContract.cs new file mode 100644 index 0000000..8130868 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/JsonPrimitiveContract.cs @@ -0,0 +1,75 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Contract details for a used by the . + /// + public class JsonPrimitiveContract : JsonContract + { + internal PrimitiveTypeCode TypeCode { get; set; } + + /// + /// Initializes a new instance of the class. + /// + /// The underlying type for the contract. + public JsonPrimitiveContract(Type underlyingType) + : base(underlyingType) + { + ContractType = JsonContractType.Primitive; + + TypeCode = ConvertUtils.GetTypeCode(underlyingType); + IsReadOnlyOrFixedSize = true; + + ReadType readType; + if (ReadTypeMap.TryGetValue(NonNullableUnderlyingType, out readType)) + { + InternalReadType = readType; + } + } + + private static readonly Dictionary ReadTypeMap = new Dictionary + { + [typeof(byte[])] = ReadType.ReadAsBytes, + [typeof(byte)] = ReadType.ReadAsInt32, + [typeof(short)] = ReadType.ReadAsInt32, + [typeof(int)] = ReadType.ReadAsInt32, + [typeof(decimal)] = ReadType.ReadAsDecimal, + [typeof(bool)] = ReadType.ReadAsBoolean, + [typeof(string)] = ReadType.ReadAsString, + [typeof(DateTime)] = ReadType.ReadAsDateTime, +#if !NET20 + [typeof(DateTimeOffset)] = ReadType.ReadAsDateTimeOffset, +#endif + [typeof(float)] = ReadType.ReadAsDouble, + [typeof(double)] = ReadType.ReadAsDouble + }; + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/JsonProperty.cs b/Common/00-1Json8.3/Json8.3/Serialization/JsonProperty.cs new file mode 100644 index 0000000..9b0ab58 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/JsonProperty.cs @@ -0,0 +1,308 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Reflection; +using Newtonsoft.Json.Utilities; + +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#endif + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Maps a JSON property to a .NET member or constructor parameter. + /// + public class JsonProperty + { + internal Required? _required; + internal bool _hasExplicitDefaultValue; + + private object _defaultValue; + private bool _hasGeneratedDefaultValue; + private string _propertyName; + internal bool _skipPropertyNameEscape; + private Type _propertyType; + + // use to cache contract during deserialization + internal JsonContract PropertyContract { get; set; } + + /// + /// Gets or sets the name of the property. + /// + /// The name of the property. + public string PropertyName + { + get { return _propertyName; } + set + { + _propertyName = value; + _skipPropertyNameEscape = !JavaScriptUtils.ShouldEscapeJavaScriptString(_propertyName, JavaScriptUtils.HtmlCharEscapeFlags); + } + } + + /// + /// Gets or sets the type that declared this property. + /// + /// The type that declared this property. + public Type DeclaringType { get; set; } + + /// + /// Gets or sets the order of serialization of a member. + /// + /// The numeric order of serialization. + public int? Order { get; set; } + + /// + /// Gets or sets the name of the underlying member or parameter. + /// + /// The name of the underlying member or parameter. + public string UnderlyingName { get; set; } + + /// + /// Gets the that will get and set the during serialization. + /// + /// The that will get and set the during serialization. + public IValueProvider ValueProvider { get; set; } + + /// + /// Gets or sets the for this property. + /// + /// The for this property. + public IAttributeProvider AttributeProvider { get; set; } + + /// + /// Gets or sets the type of the property. + /// + /// The type of the property. + public Type PropertyType + { + get { return _propertyType; } + set + { + if (_propertyType != value) + { + _propertyType = value; + _hasGeneratedDefaultValue = false; + } + } + } + + /// + /// Gets or sets the for the property. + /// If set this converter takes presidence over the contract converter for the property type. + /// + /// The converter. + public JsonConverter Converter { get; set; } + + /// + /// Gets or sets the member converter. + /// + /// The member converter. + public JsonConverter MemberConverter { get; set; } + + /// + /// Gets or sets a value indicating whether this is ignored. + /// + /// true if ignored; otherwise, false. + public bool Ignored { get; set; } + + /// + /// Gets or sets a value indicating whether this is readable. + /// + /// true if readable; otherwise, false. + public bool Readable { get; set; } + + /// + /// Gets or sets a value indicating whether this is writable. + /// + /// true if writable; otherwise, false. + public bool Writable { get; set; } + + /// + /// Gets or sets a value indicating whether this has a member attribute. + /// + /// true if has a member attribute; otherwise, false. + public bool HasMemberAttribute { get; set; } + + /// + /// Gets the default value. + /// + /// The default value. + public object DefaultValue + { + get + { + if (!_hasExplicitDefaultValue) + { + return null; + } + + return _defaultValue; + } + set + { + _hasExplicitDefaultValue = true; + _defaultValue = value; + } + } + + internal object GetResolvedDefaultValue() + { + if (_propertyType == null) + { + return null; + } + + if (!_hasExplicitDefaultValue && !_hasGeneratedDefaultValue) + { + _defaultValue = ReflectionUtils.GetDefaultValue(PropertyType); + _hasGeneratedDefaultValue = true; + } + + return _defaultValue; + } + + /// + /// Gets or sets a value indicating whether this is required. + /// + /// A value indicating whether this is required. + public Required Required + { + get { return _required ?? Required.Default; } + set { _required = value; } + } + + /// + /// Gets or sets a value indicating whether this property preserves object references. + /// + /// + /// true if this instance is reference; otherwise, false. + /// + public bool? IsReference { get; set; } + + /// + /// Gets or sets the property null value handling. + /// + /// The null value handling. + public NullValueHandling? NullValueHandling { get; set; } + + /// + /// Gets or sets the property default value handling. + /// + /// The default value handling. + public DefaultValueHandling? DefaultValueHandling { get; set; } + + /// + /// Gets or sets the property reference loop handling. + /// + /// The reference loop handling. + public ReferenceLoopHandling? ReferenceLoopHandling { get; set; } + + /// + /// Gets or sets the property object creation handling. + /// + /// The object creation handling. + public ObjectCreationHandling? ObjectCreationHandling { get; set; } + + /// + /// Gets or sets or sets the type name handling. + /// + /// The type name handling. + public TypeNameHandling? TypeNameHandling { get; set; } + + /// + /// Gets or sets a predicate used to determine whether the property should be serialize. + /// + /// A predicate used to determine whether the property should be serialize. + public Predicate ShouldSerialize { get; set; } + + /// + /// Gets or sets a predicate used to determine whether the property should be deserialized. + /// + /// A predicate used to determine whether the property should be deserialized. + public Predicate ShouldDeserialize { get; set; } + + /// + /// Gets or sets a predicate used to determine whether the property should be serialized. + /// + /// A predicate used to determine whether the property should be serialized. + public Predicate GetIsSpecified { get; set; } + + /// + /// Gets or sets an action used to set whether the property has been deserialized. + /// + /// An action used to set whether the property has been deserialized. + public Action SetIsSpecified { get; set; } + + /// + /// Returns a that represents this instance. + /// + /// + /// A that represents this instance. + /// + public override string ToString() + { + return PropertyName; + } + + /// + /// Gets or sets the converter used when serializing the property's collection items. + /// + /// The collection's items converter. + public JsonConverter ItemConverter { get; set; } + + /// + /// Gets or sets whether this property's collection items are serialized as a reference. + /// + /// Whether this property's collection items are serialized as a reference. + public bool? ItemIsReference { get; set; } + + /// + /// Gets or sets the the type name handling used when serializing the property's collection items. + /// + /// The collection's items type name handling. + public TypeNameHandling? ItemTypeNameHandling { get; set; } + + /// + /// Gets or sets the the reference loop handling used when serializing the property's collection items. + /// + /// The collection's items reference loop handling. + public ReferenceLoopHandling? ItemReferenceLoopHandling { get; set; } + + internal void WritePropertyName(JsonWriter writer) + { + if (_skipPropertyNameEscape) + { + writer.WritePropertyName(PropertyName, false); + } + else + { + writer.WritePropertyName(PropertyName); + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/JsonPropertyCollection.cs b/Common/00-1Json8.3/Json8.3/Serialization/JsonPropertyCollection.cs new file mode 100644 index 0000000..3da2518 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/JsonPropertyCollection.cs @@ -0,0 +1,180 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Text; +using System.Collections.ObjectModel; +using Newtonsoft.Json.Utilities; +using System.Globalization; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// A collection of objects. + /// + public class JsonPropertyCollection : KeyedCollection + { + private readonly Type _type; + private readonly List _list; + + /// + /// Initializes a new instance of the class. + /// + /// The type. + public JsonPropertyCollection(Type type) + : base(StringComparer.Ordinal) + { + ValidationUtils.ArgumentNotNull(type, "type"); + _type = type; + + // foreach over List to avoid boxing the Enumerator + _list = (List)Items; + } + + /// + /// When implemented in a derived class, extracts the key from the specified element. + /// + /// The element from which to extract the key. + /// The key for the specified element. + protected override string GetKeyForItem(JsonProperty item) + { + return item.PropertyName; + } + + /// + /// Adds a object. + /// + /// The property to add to the collection. + public void AddProperty(JsonProperty property) + { + if (Contains(property.PropertyName)) + { + // don't overwrite existing property with ignored property + if (property.Ignored) + { + return; + } + + JsonProperty existingProperty = this[property.PropertyName]; + bool duplicateProperty = true; + + if (existingProperty.Ignored) + { + // remove ignored property so it can be replaced in collection + Remove(existingProperty); + duplicateProperty = false; + } + else + { + if (property.DeclaringType != null && existingProperty.DeclaringType != null) + { + if (property.DeclaringType.IsSubclassOf(existingProperty.DeclaringType) + || (existingProperty.DeclaringType.IsInterface() && property.DeclaringType.ImplementInterface(existingProperty.DeclaringType))) + { + // current property is on a derived class and hides the existing + Remove(existingProperty); + duplicateProperty = false; + } + if (existingProperty.DeclaringType.IsSubclassOf(property.DeclaringType) + || (property.DeclaringType.IsInterface() && existingProperty.DeclaringType.ImplementInterface(property.DeclaringType))) + { + // current property is hidden by the existing so don't add it + return; + } + } + } + + if (duplicateProperty) + { + throw new JsonSerializationException("A member with the name '{0}' already exists on '{1}'. Use the JsonPropertyAttribute to specify another name.".FormatWith(CultureInfo.InvariantCulture, property.PropertyName, _type)); + } + } + + Add(property); + } + + /// + /// Gets the closest matching object. + /// First attempts to get an exact case match of propertyName and then + /// a case insensitive match. + /// + /// Name of the property. + /// A matching property if found. + public JsonProperty GetClosestMatchProperty(string propertyName) + { + JsonProperty property = GetProperty(propertyName, StringComparison.Ordinal); + if (property == null) + { + property = GetProperty(propertyName, StringComparison.OrdinalIgnoreCase); + } + + return property; + } + + private bool TryGetValue(string key, out JsonProperty item) + { + if (Dictionary == null) + { + item = default(JsonProperty); + return false; + } + + return Dictionary.TryGetValue(key, out item); + } + + /// + /// Gets a property by property name. + /// + /// The name of the property to get. + /// Type property name string comparison. + /// A matching property if found. + public JsonProperty GetProperty(string propertyName, StringComparison comparisonType) + { + // KeyedCollection has an ordinal comparer + if (comparisonType == StringComparison.Ordinal) + { + JsonProperty property; + if (TryGetValue(propertyName, out property)) + { + return property; + } + + return null; + } + + for (int i = 0; i < _list.Count; i++) + { + JsonProperty property = _list[i]; + if (string.Equals(propertyName, property.PropertyName, comparisonType)) + { + return property; + } + } + + return null; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/JsonSerializerInternalBase.cs b/Common/00-1Json8.3/Json8.3/Serialization/JsonSerializerInternalBase.cs new file mode 100644 index 0000000..f7e09fa --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/JsonSerializerInternalBase.cs @@ -0,0 +1,149 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Serialization +{ + internal abstract class JsonSerializerInternalBase + { + private class ReferenceEqualsEqualityComparer : IEqualityComparer + { + bool IEqualityComparer.Equals(object x, object y) + { + return ReferenceEquals(x, y); + } + + int IEqualityComparer.GetHashCode(object obj) + { + // put objects in a bucket based on their reference + return RuntimeHelpers.GetHashCode(obj); + } + } + + private ErrorContext _currentErrorContext; + private BidirectionalDictionary _mappings; + + internal readonly JsonSerializer Serializer; + internal readonly ITraceWriter TraceWriter; + protected JsonSerializerProxy InternalSerializer; + + protected JsonSerializerInternalBase(JsonSerializer serializer) + { + ValidationUtils.ArgumentNotNull(serializer, nameof(serializer)); + + Serializer = serializer; + TraceWriter = serializer.TraceWriter; + } + + internal BidirectionalDictionary DefaultReferenceMappings + { + get + { + // override equality comparer for object key dictionary + // object will be modified as it deserializes and might have mutable hashcode + if (_mappings == null) + { + _mappings = new BidirectionalDictionary( + EqualityComparer.Default, + new ReferenceEqualsEqualityComparer(), + "A different value already has the Id '{0}'.", + "A different Id has already been assigned for value '{0}'."); + } + + return _mappings; + } + } + + private ErrorContext GetErrorContext(object currentObject, object member, string path, Exception error) + { + if (_currentErrorContext == null) + { + _currentErrorContext = new ErrorContext(currentObject, member, path, error); + } + + if (_currentErrorContext.Error != error) + { + throw new InvalidOperationException("Current error context error is different to requested error."); + } + + return _currentErrorContext; + } + + protected void ClearErrorContext() + { + if (_currentErrorContext == null) + { + throw new InvalidOperationException("Could not clear error context. Error context is already null."); + } + + _currentErrorContext = null; + } + + protected bool IsErrorHandled(object currentObject, JsonContract contract, object keyValue, IJsonLineInfo lineInfo, string path, Exception ex) + { + ErrorContext errorContext = GetErrorContext(currentObject, keyValue, path, ex); + + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Error && !errorContext.Traced) + { + // only write error once + errorContext.Traced = true; + + // kind of a hack but meh. might clean this up later + string message = (GetType() == typeof(JsonSerializerInternalWriter)) ? "Error serializing" : "Error deserializing"; + if (contract != null) + { + message += " " + contract.UnderlyingType; + } + message += ". " + ex.Message; + + // add line information to non-json.net exception message + if (!(ex is JsonException)) + { + message = JsonPosition.FormatMessage(lineInfo, path, message); + } + + TraceWriter.Trace(TraceLevel.Error, message, ex); + } + + // attribute method is non-static so don't invoke if no object + if (contract != null && currentObject != null) + { + contract.InvokeOnError(currentObject, Serializer.Context, errorContext); + } + + if (!errorContext.Handled) + { + Serializer.OnError(new ErrorEventArgs(currentObject, errorContext)); + } + + return errorContext.Handled; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/JsonSerializerInternalReader.cs b/Common/00-1Json8.3/Json8.3/Serialization/JsonSerializerInternalReader.cs new file mode 100644 index 0000000..8cea1f6 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/JsonSerializerInternalReader.cs @@ -0,0 +1,2585 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +#if !(NET35 || NET20 || PORTABLE40) +using System.ComponentModel; +using System.Dynamic; +#endif +using System.Diagnostics; +using System.Globalization; +#if !(PORTABLE || PORTABLE40 || NET35 || NET20) +using System.Numerics; +#endif +using System.Reflection; +using System.Runtime.Serialization; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Utilities; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Serialization +{ + internal class JsonSerializerInternalReader : JsonSerializerInternalBase + { + internal enum PropertyPresence + { + None = 0, + Null = 1, + Value = 2 + } + + public JsonSerializerInternalReader(JsonSerializer serializer) + : base(serializer) + { + } + + public void Populate(JsonReader reader, object target) + { + ValidationUtils.ArgumentNotNull(target, nameof(target)); + + Type objectType = target.GetType(); + + JsonContract contract = Serializer._contractResolver.ResolveContract(objectType); + + if (!reader.MoveToContent()) + { + throw JsonSerializationException.Create(reader, "No JSON content found."); + } + + if (reader.TokenType == JsonToken.StartArray) + { + if (contract.ContractType == JsonContractType.Array) + { + JsonArrayContract arrayContract = (JsonArrayContract)contract; + + PopulateList((arrayContract.ShouldCreateWrapper) ? arrayContract.CreateWrapper(target) : (IList)target, reader, arrayContract, null, null); + } + else + { + throw JsonSerializationException.Create(reader, "Cannot populate JSON array onto type '{0}'.".FormatWith(CultureInfo.InvariantCulture, objectType)); + } + } + else if (reader.TokenType == JsonToken.StartObject) + { + reader.ReadAndAssert(); + + string id = null; + if (Serializer.MetadataPropertyHandling != MetadataPropertyHandling.Ignore + && reader.TokenType == JsonToken.PropertyName + && string.Equals(reader.Value.ToString(), JsonTypeReflector.IdPropertyName, StringComparison.Ordinal)) + { + reader.ReadAndAssert(); + id = (reader.Value != null) ? reader.Value.ToString() : null; + reader.ReadAndAssert(); + } + + if (contract.ContractType == JsonContractType.Dictionary) + { + JsonDictionaryContract dictionaryContract = (JsonDictionaryContract)contract; + PopulateDictionary((dictionaryContract.ShouldCreateWrapper) ? dictionaryContract.CreateWrapper(target) : (IDictionary)target, reader, dictionaryContract, null, id); + } + else if (contract.ContractType == JsonContractType.Object) + { + PopulateObject(target, reader, (JsonObjectContract)contract, null, id); + } + else + { + throw JsonSerializationException.Create(reader, "Cannot populate JSON object onto type '{0}'.".FormatWith(CultureInfo.InvariantCulture, objectType)); + } + } + else + { + throw JsonSerializationException.Create(reader, "Unexpected initial token '{0}' when populating object. Expected JSON object or array.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + } + } + + private JsonContract GetContractSafe(Type type) + { + if (type == null) + { + return null; + } + + return Serializer._contractResolver.ResolveContract(type); + } + + public object Deserialize(JsonReader reader, Type objectType, bool checkAdditionalContent) + { + if (reader == null) + { + throw new ArgumentNullException(nameof(reader)); + } + + JsonContract contract = GetContractSafe(objectType); + + try + { + JsonConverter converter = GetConverter(contract, null, null, null); + + if (reader.TokenType == JsonToken.None && !ReadForType(reader, contract, converter != null)) + { + if (contract != null && !contract.IsNullable) + { + throw JsonSerializationException.Create(reader, "No JSON content found and type '{0}' is not nullable.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); + } + + return null; + } + + object deserializedValue; + + if (converter != null && converter.CanRead) + { + deserializedValue = DeserializeConvertable(converter, reader, objectType, null); + } + else + { + deserializedValue = CreateValueInternal(reader, objectType, contract, null, null, null, null); + } + + if (checkAdditionalContent) + { + if (reader.Read() && reader.TokenType != JsonToken.Comment) + { + throw new JsonSerializationException("Additional text found in JSON string after finishing deserializing object."); + } + } + + return deserializedValue; + } + catch (Exception ex) + { + //if (IsErrorHandled(null, contract, null, reader as IJsonLineInfo, reader.Path, ex)) + //{ + // HandleError(reader, false, 0); + // return null; + //} + //else + //{ + // // clear context in case serializer is being used inside a converter + // // if the converter wraps the error then not clearing the context will cause this error: + // // "Current error context error is different to requested error." + // ClearErrorContext(); + // throw; + //} + return null; + } + } + + private JsonSerializerProxy GetInternalSerializer() + { + if (InternalSerializer == null) + { + InternalSerializer = new JsonSerializerProxy(this); + } + + return InternalSerializer; + } + + private JToken CreateJToken(JsonReader reader, JsonContract contract) + { + ValidationUtils.ArgumentNotNull(reader, nameof(reader)); + + if (contract != null) + { + if (contract.UnderlyingType == typeof(JRaw)) + { + return JRaw.Create(reader); + } + if (reader.TokenType == JsonToken.Null + && !(contract.UnderlyingType == typeof(JValue) || contract.UnderlyingType == typeof(JToken))) + { + return null; + } + } + + JToken token; + using (JTokenWriter writer = new JTokenWriter()) + { + writer.WriteToken(reader); + token = writer.Token; + } + + return token; + } + + private JToken CreateJObject(JsonReader reader) + { + ValidationUtils.ArgumentNotNull(reader, nameof(reader)); + + // this is needed because we've already read inside the object, looking for metadata properties + using (JTokenWriter writer = new JTokenWriter()) + { + writer.WriteStartObject(); + + do + { + if (reader.TokenType == JsonToken.PropertyName) + { + string propertyName = (string)reader.Value; + if (!reader.ReadAndMoveToContent()) + { + break; + } + + if (CheckPropertyName(reader, propertyName)) + { + continue; + } + + writer.WritePropertyName(propertyName); + writer.WriteToken(reader, true, true, false); + } + else if (reader.TokenType == JsonToken.Comment) + { + // eat + } + else + { + writer.WriteEndObject(); + return writer.Token; + } + } while (reader.Read()); + + throw JsonSerializationException.Create(reader, "Unexpected end when deserializing object."); + } + } + + private object CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, object existingValue) + { + if (contract != null && contract.ContractType == JsonContractType.Linq) + { + return CreateJToken(reader, contract); + } + + do + { + switch (reader.TokenType) + { + // populate a typed object or generic dictionary/array + // depending upon whether an objectType was supplied + case JsonToken.StartObject: + return CreateObject(reader, objectType, contract, member, containerContract, containerMember, existingValue); + case JsonToken.StartArray: + return CreateList(reader, objectType, contract, member, existingValue, null); + case JsonToken.Integer: + case JsonToken.Float: + case JsonToken.Boolean: + case JsonToken.Date: + case JsonToken.Bytes: + return EnsureType(reader, reader.Value, CultureInfo.InvariantCulture, contract, objectType); + case JsonToken.String: + string s = (string)reader.Value; + + // convert empty string to null automatically for nullable types + if (CoerceEmptyStringToNull(objectType, contract, s)) + { + return null; + } + + // string that needs to be returned as a byte array should be base 64 decoded + if (objectType == typeof(byte[])) + { + return Convert.FromBase64String(s); + } + + return EnsureType(reader, s, CultureInfo.InvariantCulture, contract, objectType); + case JsonToken.StartConstructor: + string constructorName = reader.Value.ToString(); + + return EnsureType(reader, constructorName, CultureInfo.InvariantCulture, contract, objectType); + case JsonToken.Null: + case JsonToken.Undefined: +#if !(DOTNET || PORTABLE40 || PORTABLE) + if (objectType == typeof(DBNull)) + { + return DBNull.Value; + } +#endif + + return EnsureType(reader, reader.Value, CultureInfo.InvariantCulture, contract, objectType); + case JsonToken.Raw: + return new JRaw((string)reader.Value); + case JsonToken.Comment: + // ignore + break; + default: + throw JsonSerializationException.Create(reader, "Unexpected token while deserializing object: " + reader.TokenType); + } + } while (reader.Read()); + + throw JsonSerializationException.Create(reader, "Unexpected end when deserializing object."); + } + + private static bool CoerceEmptyStringToNull(Type objectType, JsonContract contract, string s) + { + return string.IsNullOrEmpty(s) && objectType != null && objectType != typeof(string) && objectType != typeof(object) && contract != null && contract.IsNullable; + } + + internal string GetExpectedDescription(JsonContract contract) + { + switch (contract.ContractType) + { + case JsonContractType.Object: + case JsonContractType.Dictionary: +#if !(DOTNET || PORTABLE || PORTABLE40) + case JsonContractType.Serializable: +#endif +#if !(NET35 || NET20 || PORTABLE40) + case JsonContractType.Dynamic: +#endif + return @"JSON object (e.g. {""name"":""value""})"; + case JsonContractType.Array: + return @"JSON array (e.g. [1,2,3])"; + case JsonContractType.Primitive: + return @"JSON primitive value (e.g. string, number, boolean, null)"; + case JsonContractType.String: + return @"JSON string value"; + default: + throw new ArgumentOutOfRangeException(); + } + } + + private JsonConverter GetConverter(JsonContract contract, JsonConverter memberConverter, JsonContainerContract containerContract, JsonProperty containerProperty) + { + JsonConverter converter = null; + if (memberConverter != null) + { + // member attribute converter + converter = memberConverter; + } + else if (containerProperty != null && containerProperty.ItemConverter != null) + { + converter = containerProperty.ItemConverter; + } + else if (containerContract != null && containerContract.ItemConverter != null) + { + converter = containerContract.ItemConverter; + } + else if (contract != null) + { + JsonConverter matchingConverter; + if (contract.Converter != null) + { + // class attribute converter + converter = contract.Converter; + } + else if ((matchingConverter = Serializer.GetMatchingConverter(contract.UnderlyingType)) != null) + { + // passed in converters + converter = matchingConverter; + } + else if (contract.InternalConverter != null) + { + // internally specified converter + converter = contract.InternalConverter; + } + } + return converter; + } + + private object CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, object existingValue) + { + string id; + Type resolvedObjectType = objectType; + + if (Serializer.MetadataPropertyHandling == MetadataPropertyHandling.Ignore) + { + // don't look for metadata properties + reader.ReadAndAssert(); + id = null; + } + else if (Serializer.MetadataPropertyHandling == MetadataPropertyHandling.ReadAhead) + { + JTokenReader tokenReader = reader as JTokenReader; + if (tokenReader == null) + { + JToken t = JToken.ReadFrom(reader); + tokenReader = (JTokenReader)t.CreateReader(); + tokenReader.Culture = reader.Culture; + tokenReader.DateFormatString = reader.DateFormatString; + tokenReader.DateParseHandling = reader.DateParseHandling; + tokenReader.DateTimeZoneHandling = reader.DateTimeZoneHandling; + tokenReader.FloatParseHandling = reader.FloatParseHandling; + tokenReader.SupportMultipleContent = reader.SupportMultipleContent; + + // start + tokenReader.ReadAndAssert(); + + reader = tokenReader; + } + + object newValue; + if (ReadMetadataPropertiesToken(tokenReader, ref resolvedObjectType, ref contract, member, containerContract, containerMember, existingValue, out newValue, out id)) + { + return newValue; + } + } + else + { + reader.ReadAndAssert(); + object newValue; + if (ReadMetadataProperties(reader, ref resolvedObjectType, ref contract, member, containerContract, containerMember, existingValue, out newValue, out id)) + { + return newValue; + } + } + + if (HasNoDefinedType(contract)) + { + return CreateJObject(reader); + } + + switch (contract.ContractType) + { + case JsonContractType.Object: + { + bool createdFromNonDefaultCreator = false; + JsonObjectContract objectContract = (JsonObjectContract)contract; + object targetObject; + // check that if type name handling is being used that the existing value is compatible with the specified type + if (existingValue != null && (resolvedObjectType == objectType || resolvedObjectType.IsAssignableFrom(existingValue.GetType()))) + { + targetObject = existingValue; + } + else + { + targetObject = CreateNewObject(reader, objectContract, member, containerMember, id, out createdFromNonDefaultCreator); + } + + // don't populate if read from non-default creator because the object has already been read + if (createdFromNonDefaultCreator) + { + return targetObject; + } + + return PopulateObject(targetObject, reader, objectContract, member, id); + } + case JsonContractType.Primitive: + { + JsonPrimitiveContract primitiveContract = (JsonPrimitiveContract)contract; + // if the content is inside $value then read past it + if (Serializer.MetadataPropertyHandling != MetadataPropertyHandling.Ignore + && reader.TokenType == JsonToken.PropertyName + && string.Equals(reader.Value.ToString(), JsonTypeReflector.ValuePropertyName, StringComparison.Ordinal)) + { + reader.ReadAndAssert(); + + // the token should not be an object because the $type value could have been included in the object + // without needing the $value property + if (reader.TokenType == JsonToken.StartObject) + { + throw JsonSerializationException.Create(reader, "Unexpected token when deserializing primitive value: " + reader.TokenType); + } + + object value = CreateValueInternal(reader, resolvedObjectType, primitiveContract, member, null, null, existingValue); + + reader.ReadAndAssert(); + return value; + } + break; + } + case JsonContractType.Dictionary: + { + JsonDictionaryContract dictionaryContract = (JsonDictionaryContract)contract; + object targetDictionary; + + if (existingValue == null) + { + bool createdFromNonDefaultCreator; + IDictionary dictionary = CreateNewDictionary(reader, dictionaryContract, out createdFromNonDefaultCreator); + + if (createdFromNonDefaultCreator) + { + if (id != null) + { + throw JsonSerializationException.Create(reader, "Cannot preserve reference to readonly dictionary, or dictionary created from a non-default constructor: {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); + } + + if (contract.OnSerializingCallbacks.Count > 0) + { + throw JsonSerializationException.Create(reader, "Cannot call OnSerializing on readonly dictionary, or dictionary created from a non-default constructor: {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); + } + + if (contract.OnErrorCallbacks.Count > 0) + { + throw JsonSerializationException.Create(reader, "Cannot call OnError on readonly list, or dictionary created from a non-default constructor: {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); + } + + if (!dictionaryContract.HasParameterizedCreatorInternal) + { + throw JsonSerializationException.Create(reader, "Cannot deserialize readonly or fixed size dictionary: {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); + } + } + + PopulateDictionary(dictionary, reader, dictionaryContract, member, id); + + if (createdFromNonDefaultCreator) + { + ObjectConstructor creator = dictionaryContract.OverrideCreator ?? dictionaryContract.ParameterizedCreator; + + return creator(dictionary); + } + else if (dictionary is IWrappedDictionary) + { + return ((IWrappedDictionary)dictionary).UnderlyingDictionary; + } + + targetDictionary = dictionary; + } + else + { + targetDictionary = PopulateDictionary(dictionaryContract.ShouldCreateWrapper ? dictionaryContract.CreateWrapper(existingValue) : (IDictionary)existingValue, reader, dictionaryContract, member, id); + } + + return targetDictionary; + } +#if !(NET35 || NET20 || PORTABLE40) + case JsonContractType.Dynamic: + JsonDynamicContract dynamicContract = (JsonDynamicContract)contract; + return CreateDynamic(reader, dynamicContract, member, id); +#endif +#if !(DOTNET || PORTABLE40 || PORTABLE) + case JsonContractType.Serializable: + JsonISerializableContract serializableContract = (JsonISerializableContract)contract; + return CreateISerializable(reader, serializableContract, member, id); +#endif + } + + string message = @"Cannot deserialize the current JSON object (e.g. {{""name"":""value""}}) into type '{0}' because the type requires a {1} to deserialize correctly." + Environment.NewLine + + @"To fix this error either change the JSON to a {1} or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object." + Environment.NewLine; + message = message.FormatWith(CultureInfo.InvariantCulture, resolvedObjectType, GetExpectedDescription(contract)); + + throw JsonSerializationException.Create(reader, message); + } + + private bool ReadMetadataPropertiesToken(JTokenReader reader, ref Type objectType, ref JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, object existingValue, out object newValue, out string id) + { + id = null; + newValue = null; + + if (reader.TokenType == JsonToken.StartObject) + { + JObject current = (JObject)reader.CurrentToken; + + JToken refToken = current[JsonTypeReflector.RefPropertyName]; + if (refToken != null) + { + if (refToken.Type != JTokenType.String && refToken.Type != JTokenType.Null) + { + throw JsonSerializationException.Create(refToken, refToken.Path, "JSON reference {0} property must have a string or null value.".FormatWith(CultureInfo.InvariantCulture, JsonTypeReflector.RefPropertyName), null); + } + + JToken property = refToken.Parent; + JToken additionalContent = null; + if (property.Next != null) + { + additionalContent = property.Next; + } + else if (property.Previous != null) + { + additionalContent = property.Previous; + } + + string reference = (string)refToken; + + if (reference != null) + { + if (additionalContent != null) + { + throw JsonSerializationException.Create(additionalContent, additionalContent.Path, "Additional content found in JSON reference object. A JSON reference object should only have a {0} property.".FormatWith(CultureInfo.InvariantCulture, JsonTypeReflector.RefPropertyName), null); + } + + newValue = Serializer.GetReferenceResolver().ResolveReference(this, reference); + + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Info) + { + TraceWriter.Trace(TraceLevel.Info, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "Resolved object reference '{0}' to {1}.".FormatWith(CultureInfo.InvariantCulture, reference, newValue.GetType())), null); + } + + reader.Skip(); + return true; + } + } + JToken typeToken = current[JsonTypeReflector.TypePropertyName]; + if (typeToken != null) + { + string qualifiedTypeName = (string)typeToken; + JsonReader typeTokenReader = typeToken.CreateReader(); + typeTokenReader.ReadAndAssert(); + ResolveTypeName(typeTokenReader, ref objectType, ref contract, member, containerContract, containerMember, qualifiedTypeName); + + JToken valueToken = current[JsonTypeReflector.ValuePropertyName]; + if (valueToken != null) + { + while (true) + { + reader.ReadAndAssert(); + if (reader.TokenType == JsonToken.PropertyName) + { + if ((string)reader.Value == JsonTypeReflector.ValuePropertyName) + { + return false; + } + } + + reader.ReadAndAssert(); + reader.Skip(); + } + } + } + JToken idToken = current[JsonTypeReflector.IdPropertyName]; + if (idToken != null) + { + id = (string)idToken; + } + JToken valuesToken = current[JsonTypeReflector.ArrayValuesPropertyName]; + if (valuesToken != null) + { + JsonReader listReader = valuesToken.CreateReader(); + listReader.ReadAndAssert(); + newValue = CreateList(listReader, objectType, contract, member, existingValue, id); + + reader.Skip(); + return true; + } + } + + reader.ReadAndAssert(); + return false; + } + + private bool ReadMetadataProperties(JsonReader reader, ref Type objectType, ref JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, object existingValue, out object newValue, out string id) + { + id = null; + newValue = null; + + if (reader.TokenType == JsonToken.PropertyName) + { + string propertyName = reader.Value.ToString(); + + if (propertyName.Length > 0 && propertyName[0] == '$') + { + // read metadata properties + // $type, $id, $ref, etc + bool metadataProperty; + + do + { + propertyName = reader.Value.ToString(); + + if (string.Equals(propertyName, JsonTypeReflector.RefPropertyName, StringComparison.Ordinal)) + { + reader.ReadAndAssert(); + if (reader.TokenType != JsonToken.String && reader.TokenType != JsonToken.Null) + { + throw JsonSerializationException.Create(reader, "JSON reference {0} property must have a string or null value.".FormatWith(CultureInfo.InvariantCulture, JsonTypeReflector.RefPropertyName)); + } + + string reference = (reader.Value != null) ? reader.Value.ToString() : null; + + reader.ReadAndAssert(); + + if (reference != null) + { + if (reader.TokenType == JsonToken.PropertyName) + { + throw JsonSerializationException.Create(reader, "Additional content found in JSON reference object. A JSON reference object should only have a {0} property.".FormatWith(CultureInfo.InvariantCulture, JsonTypeReflector.RefPropertyName)); + } + + newValue = Serializer.GetReferenceResolver().ResolveReference(this, reference); + + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Info) + { + TraceWriter.Trace(TraceLevel.Info, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "Resolved object reference '{0}' to {1}.".FormatWith(CultureInfo.InvariantCulture, reference, newValue.GetType())), null); + } + + return true; + } + else + { + metadataProperty = true; + } + } + else if (string.Equals(propertyName, JsonTypeReflector.TypePropertyName, StringComparison.Ordinal)) + { + reader.ReadAndAssert(); + string qualifiedTypeName = reader.Value.ToString(); + + ResolveTypeName(reader, ref objectType, ref contract, member, containerContract, containerMember, qualifiedTypeName); + + reader.ReadAndAssert(); + + metadataProperty = true; + } + else if (string.Equals(propertyName, JsonTypeReflector.IdPropertyName, StringComparison.Ordinal)) + { + reader.ReadAndAssert(); + + id = (reader.Value != null) ? reader.Value.ToString() : null; + + reader.ReadAndAssert(); + metadataProperty = true; + } + else if (string.Equals(propertyName, JsonTypeReflector.ArrayValuesPropertyName, StringComparison.Ordinal)) + { + reader.ReadAndAssert(); + object list = CreateList(reader, objectType, contract, member, existingValue, id); + reader.ReadAndAssert(); + newValue = list; + return true; + } + else + { + metadataProperty = false; + } + } while (metadataProperty && reader.TokenType == JsonToken.PropertyName); + } + } + return false; + } + + private void ResolveTypeName(JsonReader reader, ref Type objectType, ref JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, string qualifiedTypeName) + { + TypeNameHandling resolvedTypeNameHandling = + ((member != null) ? member.TypeNameHandling : null) + ?? ((containerContract != null) ? containerContract.ItemTypeNameHandling : null) + ?? ((containerMember != null) ? containerMember.ItemTypeNameHandling : null) + ?? Serializer._typeNameHandling; + + if (resolvedTypeNameHandling != TypeNameHandling.None) + { + string typeName; + string assemblyName; + ReflectionUtils.SplitFullyQualifiedTypeName(qualifiedTypeName, out typeName, out assemblyName); + + Type specifiedType; + try + { + specifiedType = Serializer._binder.BindToType(assemblyName, typeName); + } + catch (Exception ex) + { + throw JsonSerializationException.Create(reader, "Error resolving type specified in JSON '{0}'.".FormatWith(CultureInfo.InvariantCulture, qualifiedTypeName), ex); + } + + if (specifiedType == null) + { + throw JsonSerializationException.Create(reader, "Type specified in JSON '{0}' was not resolved.".FormatWith(CultureInfo.InvariantCulture, qualifiedTypeName)); + } + + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) + { + TraceWriter.Trace(TraceLevel.Verbose, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "Resolved type '{0}' to {1}.".FormatWith(CultureInfo.InvariantCulture, qualifiedTypeName, specifiedType)), null); + } + + if (objectType != null +#if !(NET35 || NET20 || PORTABLE40) + && objectType != typeof(IDynamicMetaObjectProvider) +#endif + && !objectType.IsAssignableFrom(specifiedType)) + { + throw JsonSerializationException.Create(reader, "Type specified in JSON '{0}' is not compatible with '{1}'.".FormatWith(CultureInfo.InvariantCulture, specifiedType.AssemblyQualifiedName, objectType.AssemblyQualifiedName)); + } + + objectType = specifiedType; + contract = GetContractSafe(specifiedType); + } + } + + private JsonArrayContract EnsureArrayContract(JsonReader reader, Type objectType, JsonContract contract) + { + if (contract == null) + { + throw JsonSerializationException.Create(reader, "Could not resolve type '{0}' to a JsonContract.".FormatWith(CultureInfo.InvariantCulture, objectType)); + } + + JsonArrayContract arrayContract = contract as JsonArrayContract; + if (arrayContract == null) + { + string message = @"Cannot deserialize the current JSON array (e.g. [1,2,3]) into type '{0}' because the type requires a {1} to deserialize correctly." + Environment.NewLine + + @"To fix this error either change the JSON to a {1} or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array." + Environment.NewLine; + message = message.FormatWith(CultureInfo.InvariantCulture, objectType, GetExpectedDescription(contract)); + + throw JsonSerializationException.Create(reader, message); + } + + return arrayContract; + } + + private object CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, object existingValue, string id) + { + object value; + + if (HasNoDefinedType(contract)) + { + return CreateJToken(reader, contract); + } + + JsonArrayContract arrayContract = EnsureArrayContract(reader, objectType, contract); + + if (existingValue == null) + { + bool createdFromNonDefaultCreator; + IList list = CreateNewList(reader, arrayContract, out createdFromNonDefaultCreator); + + if (createdFromNonDefaultCreator) + { + if (id != null) + { + throw JsonSerializationException.Create(reader, "Cannot preserve reference to array or readonly list, or list created from a non-default constructor: {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); + } + + if (contract.OnSerializingCallbacks.Count > 0) + { + throw JsonSerializationException.Create(reader, "Cannot call OnSerializing on an array or readonly list, or list created from a non-default constructor: {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); + } + + if (contract.OnErrorCallbacks.Count > 0) + { + throw JsonSerializationException.Create(reader, "Cannot call OnError on an array or readonly list, or list created from a non-default constructor: {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); + } + + if (!arrayContract.HasParameterizedCreatorInternal && !arrayContract.IsArray) + { + throw JsonSerializationException.Create(reader, "Cannot deserialize readonly or fixed size list: {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); + } + } + + if (!arrayContract.IsMultidimensionalArray) + { + PopulateList(list, reader, arrayContract, member, id); + } + else + { + PopulateMultidimensionalArray(list, reader, arrayContract, member, id); + } + + if (createdFromNonDefaultCreator) + { + if (arrayContract.IsMultidimensionalArray) + { + list = CollectionUtils.ToMultidimensionalArray(list, arrayContract.CollectionItemType, contract.CreatedType.GetArrayRank()); + } + else if (arrayContract.IsArray) + { + Array a = Array.CreateInstance(arrayContract.CollectionItemType, list.Count); + list.CopyTo(a, 0); + list = a; + } + else + { + ObjectConstructor creator = arrayContract.OverrideCreator ?? arrayContract.ParameterizedCreator; + + return creator(list); + } + } + else if (list is IWrappedCollection) + { + return ((IWrappedCollection)list).UnderlyingCollection; + } + + value = list; + } + else + { + if (!arrayContract.CanDeserialize) + { + throw JsonSerializationException.Create(reader, "Cannot populate list type {0}.".FormatWith(CultureInfo.InvariantCulture, contract.CreatedType)); + } + + value = PopulateList((arrayContract.ShouldCreateWrapper) ? arrayContract.CreateWrapper(existingValue) : (IList)existingValue, reader, arrayContract, member, id); + } + + return value; + } + + private bool HasNoDefinedType(JsonContract contract) + { + return (contract == null || contract.UnderlyingType == typeof(object) || contract.ContractType == JsonContractType.Linq +#if !(NET35 || NET20 || PORTABLE40) + || contract.UnderlyingType == typeof(IDynamicMetaObjectProvider) +#endif + ); + } + + private object EnsureType(JsonReader reader, object value, CultureInfo culture, JsonContract contract, Type targetType) + { + if (targetType == null) + { + return value; + } + + Type valueType = ReflectionUtils.GetObjectType(value); + + // type of value and type of target don't match + // attempt to convert value's type to target's type + if (valueType != targetType) + { + if (value == null && contract.IsNullable) + { + return null; + } + + try + { + if (contract.IsConvertable) + { + JsonPrimitiveContract primitiveContract = (JsonPrimitiveContract)contract; + + if (contract.IsEnum) + { + if (value is string) + { + return Enum.Parse(contract.NonNullableUnderlyingType, value.ToString(), true); + } + if (ConvertUtils.IsInteger(primitiveContract.TypeCode)) + { + return Enum.ToObject(contract.NonNullableUnderlyingType, value); + } + } + +#if !(PORTABLE || PORTABLE40 || NET35 || NET20) + if (value is BigInteger) + { + return ConvertUtils.FromBigInteger((BigInteger)value, contract.NonNullableUnderlyingType); + } +#endif + + // this won't work when converting to a custom IConvertible + return Convert.ChangeType(value, contract.NonNullableUnderlyingType, culture); + } + + return ConvertUtils.ConvertOrCast(value, culture, contract.NonNullableUnderlyingType); + } + catch (Exception ex) + { + throw JsonSerializationException.Create(reader, "Error converting value {0} to type '{1}'.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.FormatValueForPrint(value), targetType), ex); + } + } + + return value; + } + + private bool SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, object target) + { + object currentValue; + bool useExistingValue; + JsonContract propertyContract; + bool gottenCurrentValue; + + if (CalculatePropertyDetails(property, ref propertyConverter, containerContract, containerProperty, reader, target, out useExistingValue, out currentValue, out propertyContract, out gottenCurrentValue)) + { + return false; + } + + object value; + + if (propertyConverter != null && propertyConverter.CanRead) + { + if (!gottenCurrentValue && target != null && property.Readable) + { + currentValue = property.ValueProvider.GetValue(target); + } + + value = DeserializeConvertable(propertyConverter, reader, property.PropertyType, currentValue); + } + else + { + value = CreateValueInternal(reader, property.PropertyType, propertyContract, property, containerContract, containerProperty, (useExistingValue) ? currentValue : null); + } + + // always set the value if useExistingValue is false, + // otherwise also set it if CreateValue returns a new value compared to the currentValue + // this could happen because of a JsonConverter against the type + if ((!useExistingValue || value != currentValue) + && ShouldSetPropertyValue(property, value)) + { + property.ValueProvider.SetValue(target, value); + + if (property.SetIsSpecified != null) + { + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) + { + TraceWriter.Trace(TraceLevel.Verbose, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "IsSpecified for property '{0}' on {1} set to true.".FormatWith(CultureInfo.InvariantCulture, property.PropertyName, property.DeclaringType)), null); + } + + property.SetIsSpecified(target, true); + } + + return true; + } + + // the value wasn't set be JSON was populated onto the existing value + return useExistingValue; + } + + private bool CalculatePropertyDetails(JsonProperty property, ref JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, object target, out bool useExistingValue, out object currentValue, out JsonContract propertyContract, out bool gottenCurrentValue) + { + currentValue = null; + useExistingValue = false; + propertyContract = null; + gottenCurrentValue = false; + + if (property.Ignored) + { + return true; + } + + JsonToken tokenType = reader.TokenType; + + if (property.PropertyContract == null) + { + property.PropertyContract = GetContractSafe(property.PropertyType); + } + + ObjectCreationHandling objectCreationHandling = + property.ObjectCreationHandling.GetValueOrDefault(Serializer._objectCreationHandling); + + if ((objectCreationHandling != ObjectCreationHandling.Replace) + && (tokenType == JsonToken.StartArray || tokenType == JsonToken.StartObject) + && property.Readable) + { + currentValue = property.ValueProvider.GetValue(target); + gottenCurrentValue = true; + + if (currentValue != null) + { + propertyContract = GetContractSafe(currentValue.GetType()); + + useExistingValue = (!propertyContract.IsReadOnlyOrFixedSize && !propertyContract.UnderlyingType.IsValueType()); + } + } + + if (!property.Writable && !useExistingValue) + { + return true; + } + + // test tokentype here because null might not be convertable to some types, e.g. ignoring null when applied to DateTime + if (property.NullValueHandling.GetValueOrDefault(Serializer._nullValueHandling) == NullValueHandling.Ignore && tokenType == JsonToken.Null) + { + return true; + } + + // test tokentype here because default value might not be convertable to actual type, e.g. default of "" for DateTime + if (HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer._defaultValueHandling), DefaultValueHandling.Ignore) + && !HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer._defaultValueHandling), DefaultValueHandling.Populate) + && JsonTokenUtils.IsPrimitiveToken(tokenType) + && MiscellaneousUtils.ValueEquals(reader.Value, property.GetResolvedDefaultValue())) + { + return true; + } + + if (currentValue == null) + { + propertyContract = property.PropertyContract; + } + else + { + propertyContract = GetContractSafe(currentValue.GetType()); + + if (propertyContract != property.PropertyContract) + { + propertyConverter = GetConverter(propertyContract, property.MemberConverter, containerContract, containerProperty); + } + } + + return false; + } + + private void AddReference(JsonReader reader, string id, object value) + { + try + { + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) + { + TraceWriter.Trace(TraceLevel.Verbose, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "Read object reference Id '{0}' for {1}.".FormatWith(CultureInfo.InvariantCulture, id, value.GetType())), null); + } + + Serializer.GetReferenceResolver().AddReference(this, id, value); + } + catch (Exception ex) + { + throw JsonSerializationException.Create(reader, "Error reading object reference '{0}'.".FormatWith(CultureInfo.InvariantCulture, id), ex); + } + } + + private bool HasFlag(DefaultValueHandling value, DefaultValueHandling flag) + { + return ((value & flag) == flag); + } + + private bool ShouldSetPropertyValue(JsonProperty property, object value) + { + if (property.NullValueHandling.GetValueOrDefault(Serializer._nullValueHandling) == NullValueHandling.Ignore && value == null) + { + return false; + } + + if (HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer._defaultValueHandling), DefaultValueHandling.Ignore) + && !HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer._defaultValueHandling), DefaultValueHandling.Populate) + && MiscellaneousUtils.ValueEquals(value, property.GetResolvedDefaultValue())) + { + return false; + } + + if (!property.Writable) + { + return false; + } + + return true; + } + + private IList CreateNewList(JsonReader reader, JsonArrayContract contract, out bool createdFromNonDefaultCreator) + { + // some types like non-generic IEnumerable can be serialized but not deserialized + if (!contract.CanDeserialize) + { + throw JsonSerializationException.Create(reader, "Cannot create and populate list type {0}.".FormatWith(CultureInfo.InvariantCulture, contract.CreatedType)); + } + + if (contract.OverrideCreator != null) + { + if (contract.HasParameterizedCreator) + { + createdFromNonDefaultCreator = true; + return contract.CreateTemporaryCollection(); + } + else + { + createdFromNonDefaultCreator = false; + return (IList)contract.OverrideCreator(); + } + } + else if (contract.IsReadOnlyOrFixedSize) + { + createdFromNonDefaultCreator = true; + IList list = contract.CreateTemporaryCollection(); + + if (contract.ShouldCreateWrapper) + { + list = contract.CreateWrapper(list); + } + + return list; + } + else if (contract.DefaultCreator != null && (!contract.DefaultCreatorNonPublic || Serializer._constructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor)) + { + object list = contract.DefaultCreator(); + + if (contract.ShouldCreateWrapper) + { + list = contract.CreateWrapper(list); + } + + createdFromNonDefaultCreator = false; + return (IList)list; + } + else if (contract.HasParameterizedCreatorInternal) + { + createdFromNonDefaultCreator = true; + return contract.CreateTemporaryCollection(); + } + else + { + if (!contract.IsInstantiable) + { + throw JsonSerializationException.Create(reader, "Could not create an instance of type {0}. Type is an interface or abstract class and cannot be instantiated.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); + } + + throw JsonSerializationException.Create(reader, "Unable to find a constructor to use for type {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); + } + } + + private IDictionary CreateNewDictionary(JsonReader reader, JsonDictionaryContract contract, out bool createdFromNonDefaultCreator) + { + if (contract.OverrideCreator != null) + { + if (contract.HasParameterizedCreator) + { + createdFromNonDefaultCreator = true; + return contract.CreateTemporaryDictionary(); + } + else + { + createdFromNonDefaultCreator = false; + return (IDictionary)contract.OverrideCreator(); + } + } + else if (contract.IsReadOnlyOrFixedSize) + { + createdFromNonDefaultCreator = true; + return contract.CreateTemporaryDictionary(); + } + else if (contract.DefaultCreator != null && (!contract.DefaultCreatorNonPublic || Serializer._constructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor)) + { + object dictionary = contract.DefaultCreator(); + + if (contract.ShouldCreateWrapper) + { + dictionary = contract.CreateWrapper(dictionary); + } + + createdFromNonDefaultCreator = false; + return (IDictionary)dictionary; + } + else if (contract.HasParameterizedCreatorInternal) + { + createdFromNonDefaultCreator = true; + return contract.CreateTemporaryDictionary(); + } + else + { + if (!contract.IsInstantiable) + { + throw JsonSerializationException.Create(reader, "Could not create an instance of type {0}. Type is an interface or abstract class and cannot be instantiated.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); + } + + throw JsonSerializationException.Create(reader, "Unable to find a default constructor to use for type {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); + } + } + + private void OnDeserializing(JsonReader reader, JsonContract contract, object value) + { + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Info) + { + TraceWriter.Trace(TraceLevel.Info, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "Started deserializing {0}".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)), null); + } + + contract.InvokeOnDeserializing(value, Serializer._context); + } + + private void OnDeserialized(JsonReader reader, JsonContract contract, object value) + { + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Info) + { + TraceWriter.Trace(TraceLevel.Info, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "Finished deserializing {0}".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)), null); + } + + contract.InvokeOnDeserialized(value, Serializer._context); + } + + private object PopulateDictionary(IDictionary dictionary, JsonReader reader, JsonDictionaryContract contract, JsonProperty containerProperty, string id) + { + IWrappedDictionary wrappedDictionary = dictionary as IWrappedDictionary; + object underlyingDictionary = wrappedDictionary != null ? wrappedDictionary.UnderlyingDictionary : dictionary; + + if (id != null) + { + AddReference(reader, id, underlyingDictionary); + } + + OnDeserializing(reader, contract, underlyingDictionary); + + int initialDepth = reader.Depth; + + if (contract.KeyContract == null) + { + contract.KeyContract = GetContractSafe(contract.DictionaryKeyType); + } + + if (contract.ItemContract == null) + { + contract.ItemContract = GetContractSafe(contract.DictionaryValueType); + } + + JsonConverter dictionaryValueConverter = contract.ItemConverter ?? GetConverter(contract.ItemContract, null, contract, containerProperty); + PrimitiveTypeCode keyTypeCode = (contract.KeyContract is JsonPrimitiveContract) ? ((JsonPrimitiveContract)contract.KeyContract).TypeCode : PrimitiveTypeCode.Empty; + + bool finished = false; + do + { + switch (reader.TokenType) + { + case JsonToken.PropertyName: + object keyValue = reader.Value; + if (CheckPropertyName(reader, keyValue.ToString())) + { + continue; + } + + try + { + try + { + // this is for correctly reading ISO and MS formatted dictionary keys + switch (keyTypeCode) + { + case PrimitiveTypeCode.DateTime: + case PrimitiveTypeCode.DateTimeNullable: + { + DateTime dt; + if (DateTimeUtils.TryParseDateTime(keyValue.ToString(), reader.DateTimeZoneHandling, reader.DateFormatString, reader.Culture, out dt)) + { + keyValue = dt; + } + else + { + keyValue = EnsureType(reader, keyValue, CultureInfo.InvariantCulture, contract.KeyContract, contract.DictionaryKeyType); + } + break; + } +#if !NET20 + case PrimitiveTypeCode.DateTimeOffset: + case PrimitiveTypeCode.DateTimeOffsetNullable: + { + DateTimeOffset dt; + if (DateTimeUtils.TryParseDateTimeOffset(keyValue.ToString(), reader.DateFormatString, reader.Culture, out dt)) + { + keyValue = dt; + } + else + { + keyValue = EnsureType(reader, keyValue, CultureInfo.InvariantCulture, contract.KeyContract, contract.DictionaryKeyType); + } + break; + } +#endif + default: + keyValue = EnsureType(reader, keyValue, CultureInfo.InvariantCulture, contract.KeyContract, contract.DictionaryKeyType); + break; + } + } + catch (Exception ex) + { + throw JsonSerializationException.Create(reader, "Could not convert string '{0}' to dictionary key type '{1}'. Create a TypeConverter to convert from the string to the key type object.".FormatWith(CultureInfo.InvariantCulture, reader.Value, contract.DictionaryKeyType), ex); + } + + if (!ReadForType(reader, contract.ItemContract, dictionaryValueConverter != null)) + { + throw JsonSerializationException.Create(reader, "Unexpected end when deserializing object."); + } + + object itemValue; + if (dictionaryValueConverter != null && dictionaryValueConverter.CanRead) + { + itemValue = DeserializeConvertable(dictionaryValueConverter, reader, contract.DictionaryValueType, null); + } + else + { + itemValue = CreateValueInternal(reader, contract.DictionaryValueType, contract.ItemContract, null, contract, containerProperty, null); + } + + dictionary[keyValue] = itemValue; + } + catch (Exception ex) + { + if (IsErrorHandled(underlyingDictionary, contract, keyValue, reader as IJsonLineInfo, reader.Path, ex)) + { + HandleError(reader, true, initialDepth); + } + else + { + throw; + } + } + break; + case JsonToken.Comment: + break; + case JsonToken.EndObject: + finished = true; + break; + default: + throw JsonSerializationException.Create(reader, "Unexpected token when deserializing object: " + reader.TokenType); + } + } while (!finished && reader.Read()); + + if (!finished) + { + ThrowUnexpectedEndException(reader, contract, underlyingDictionary, "Unexpected end when deserializing object."); + } + + OnDeserialized(reader, contract, underlyingDictionary); + return underlyingDictionary; + } + + private object PopulateMultidimensionalArray(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, string id) + { + int rank = contract.UnderlyingType.GetArrayRank(); + + if (id != null) + { + AddReference(reader, id, list); + } + + OnDeserializing(reader, contract, list); + + JsonContract collectionItemContract = GetContractSafe(contract.CollectionItemType); + JsonConverter collectionItemConverter = GetConverter(collectionItemContract, null, contract, containerProperty); + + int? previousErrorIndex = null; + Stack listStack = new Stack(); + listStack.Push(list); + IList currentList = list; + + bool finished = false; + do + { + int initialDepth = reader.Depth; + + if (listStack.Count == rank) + { + try + { + if (ReadForType(reader, collectionItemContract, collectionItemConverter != null)) + { + switch (reader.TokenType) + { + case JsonToken.EndArray: + listStack.Pop(); + currentList = listStack.Peek(); + previousErrorIndex = null; + break; + default: + object value; + + if (collectionItemConverter != null && collectionItemConverter.CanRead) + { + value = DeserializeConvertable(collectionItemConverter, reader, contract.CollectionItemType, null); + } + else + { + value = CreateValueInternal(reader, contract.CollectionItemType, collectionItemContract, null, contract, containerProperty, null); + } + + currentList.Add(value); + break; + } + } + else + { + break; + } + } + catch (Exception ex) + { + JsonPosition errorPosition = reader.GetPosition(initialDepth); + + if (IsErrorHandled(list, contract, errorPosition.Position, reader as IJsonLineInfo, reader.Path, ex)) + { + HandleError(reader, true, initialDepth); + + if (previousErrorIndex != null && previousErrorIndex == errorPosition.Position) + { + // reader index has not moved since previous error handling + // break out of reading array to prevent infinite loop + throw JsonSerializationException.Create(reader, "Infinite loop detected from error handling.", ex); + } + else + { + previousErrorIndex = errorPosition.Position; + } + } + else + { + throw; + } + } + } + else + { + if (reader.Read()) + { + switch (reader.TokenType) + { + case JsonToken.StartArray: + IList newList = new List(); + currentList.Add(newList); + listStack.Push(newList); + currentList = newList; + break; + case JsonToken.EndArray: + listStack.Pop(); + + if (listStack.Count > 0) + { + currentList = listStack.Peek(); + } + else + { + finished = true; + } + break; + case JsonToken.Comment: + break; + default: + throw JsonSerializationException.Create(reader, "Unexpected token when deserializing multidimensional array: " + reader.TokenType); + } + } + else + { + break; + } + } + } while (!finished); + + if (!finished) + { + ThrowUnexpectedEndException(reader, contract, list, "Unexpected end when deserializing array."); + } + + OnDeserialized(reader, contract, list); + return list; + } + + private void ThrowUnexpectedEndException(JsonReader reader, JsonContract contract, object currentObject, string message) + { + try + { + throw JsonSerializationException.Create(reader, message); + } + catch (Exception ex) + { + if (IsErrorHandled(currentObject, contract, null, reader as IJsonLineInfo, reader.Path, ex)) + { + HandleError(reader, false, 0); + } + else + { + throw; + } + } + } + + private object PopulateList(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, string id) + { + IWrappedCollection wrappedCollection = list as IWrappedCollection; + object underlyingList = wrappedCollection != null ? wrappedCollection.UnderlyingCollection : list; + + if (id != null) + { + AddReference(reader, id, underlyingList); + } + + // can't populate an existing array + if (list.IsFixedSize) + { + reader.Skip(); + return underlyingList; + } + + OnDeserializing(reader, contract, underlyingList); + + int initialDepth = reader.Depth; + + if (contract.ItemContract == null) + { + contract.ItemContract = GetContractSafe(contract.CollectionItemType); + } + + JsonConverter collectionItemConverter = GetConverter(contract.ItemContract, null, contract, containerProperty); + + int? previousErrorIndex = null; + + bool finished = false; + do + { + try + { + if (ReadForType(reader, contract.ItemContract, collectionItemConverter != null)) + { + switch (reader.TokenType) + { + case JsonToken.EndArray: + finished = true; + break; + default: + object value; + + if (collectionItemConverter != null && collectionItemConverter.CanRead) + { + value = DeserializeConvertable(collectionItemConverter, reader, contract.CollectionItemType, null); + } + else + { + value = CreateValueInternal(reader, contract.CollectionItemType, contract.ItemContract, null, contract, containerProperty, null); + } + + list.Add(value); + break; + } + } + else + { + break; + } + } + catch (Exception ex) + { + JsonPosition errorPosition = reader.GetPosition(initialDepth); + + if (IsErrorHandled(underlyingList, contract, errorPosition.Position, reader as IJsonLineInfo, reader.Path, ex)) + { + HandleError(reader, true, initialDepth); + + if (previousErrorIndex != null && previousErrorIndex == errorPosition.Position) + { + // reader index has not moved since previous error handling + // break out of reading array to prevent infinite loop + throw JsonSerializationException.Create(reader, "Infinite loop detected from error handling.", ex); + } + else + { + previousErrorIndex = errorPosition.Position; + } + } + else + { + throw; + } + } + } while (!finished); + + if (!finished) + { + ThrowUnexpectedEndException(reader, contract, underlyingList, "Unexpected end when deserializing array."); + } + + OnDeserialized(reader, contract, underlyingList); + return underlyingList; + } + +#if !(DOTNET || PORTABLE40 || PORTABLE) + private object CreateISerializable(JsonReader reader, JsonISerializableContract contract, JsonProperty member, string id) + { + Type objectType = contract.UnderlyingType; + + if (!JsonTypeReflector.FullyTrusted) + { + string message = @"Type '{0}' implements ISerializable but cannot be deserialized using the ISerializable interface because the current application is not fully trusted and ISerializable can expose secure data." + Environment.NewLine + + @"To fix this error either change the environment to be fully trusted, change the application to not deserialize the type, add JsonObjectAttribute to the type or change the JsonSerializer setting ContractResolver to use a new DefaultContractResolver with IgnoreSerializableInterface set to true." + Environment.NewLine; + message = message.FormatWith(CultureInfo.InvariantCulture, objectType); + + throw JsonSerializationException.Create(reader, message); + } + + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Info) + { + TraceWriter.Trace(TraceLevel.Info, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "Deserializing {0} using ISerializable constructor.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)), null); + } + + SerializationInfo serializationInfo = new SerializationInfo(contract.UnderlyingType, new JsonFormatterConverter(this, contract, member)); + + bool finished = false; + do + { + switch (reader.TokenType) + { + case JsonToken.PropertyName: + string memberName = reader.Value.ToString(); + if (!reader.Read()) + { + throw JsonSerializationException.Create(reader, "Unexpected end when setting {0}'s value.".FormatWith(CultureInfo.InvariantCulture, memberName)); + } + serializationInfo.AddValue(memberName, JToken.ReadFrom(reader)); + break; + case JsonToken.Comment: + break; + case JsonToken.EndObject: + finished = true; + break; + default: + throw JsonSerializationException.Create(reader, "Unexpected token when deserializing object: " + reader.TokenType); + } + } while (!finished && reader.Read()); + + if (!finished) + { + ThrowUnexpectedEndException(reader, contract, serializationInfo, "Unexpected end when deserializing object."); + } + + if (contract.ISerializableCreator == null) + { + throw JsonSerializationException.Create(reader, "ISerializable type '{0}' does not have a valid constructor. To correctly implement ISerializable a constructor that takes SerializationInfo and StreamingContext parameters should be present.".FormatWith(CultureInfo.InvariantCulture, objectType)); + } + + object createdObject = contract.ISerializableCreator(serializationInfo, Serializer._context); + + if (id != null) + { + AddReference(reader, id, createdObject); + } + + // these are together because OnDeserializing takes an object but for an ISerializable the object is fully created in the constructor + OnDeserializing(reader, contract, createdObject); + OnDeserialized(reader, contract, createdObject); + + return createdObject; + } + + internal object CreateISerializableItem(JToken token, Type type, JsonISerializableContract contract, JsonProperty member) + { + JsonContract itemContract = GetContractSafe(type); + JsonConverter itemConverter = GetConverter(itemContract, null, contract, member); + + JsonReader tokenReader = token.CreateReader(); + tokenReader.ReadAndAssert(); // Move to first token + + object result; + if (itemConverter != null && itemConverter.CanRead) + { + result = DeserializeConvertable(itemConverter, tokenReader, type, null); + } + else + { + result = CreateValueInternal(tokenReader, type, itemContract, null, contract, member, null); + } + + return result; + } +#endif + +#if !(NET35 || NET20 || PORTABLE40) + private object CreateDynamic(JsonReader reader, JsonDynamicContract contract, JsonProperty member, string id) + { + IDynamicMetaObjectProvider newObject; + + if (!contract.IsInstantiable) + { + throw JsonSerializationException.Create(reader, "Could not create an instance of type {0}. Type is an interface or abstract class and cannot be instantiated.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); + } + + if (contract.DefaultCreator != null && + (!contract.DefaultCreatorNonPublic || Serializer._constructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor)) + { + newObject = (IDynamicMetaObjectProvider)contract.DefaultCreator(); + } + else + { + throw JsonSerializationException.Create(reader, "Unable to find a default constructor to use for type {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); + } + + if (id != null) + { + AddReference(reader, id, newObject); + } + + OnDeserializing(reader, contract, newObject); + + int initialDepth = reader.Depth; + + bool finished = false; + do + { + switch (reader.TokenType) + { + case JsonToken.PropertyName: + string memberName = reader.Value.ToString(); + + try + { + if (!reader.Read()) + { + throw JsonSerializationException.Create(reader, "Unexpected end when setting {0}'s value.".FormatWith(CultureInfo.InvariantCulture, memberName)); + } + + // first attempt to find a settable property, otherwise fall back to a dynamic set without type + JsonProperty property = contract.Properties.GetClosestMatchProperty(memberName); + + if (property != null && property.Writable && !property.Ignored) + { + if (property.PropertyContract == null) + { + property.PropertyContract = GetContractSafe(property.PropertyType); + } + + JsonConverter propertyConverter = GetConverter(property.PropertyContract, property.MemberConverter, null, null); + + if (!SetPropertyValue(property, propertyConverter, null, member, reader, newObject)) + { + reader.Skip(); + } + } + else + { + Type t = (JsonTokenUtils.IsPrimitiveToken(reader.TokenType)) ? reader.ValueType : typeof(IDynamicMetaObjectProvider); + + JsonContract dynamicMemberContract = GetContractSafe(t); + JsonConverter dynamicMemberConverter = GetConverter(dynamicMemberContract, null, null, member); + + object value; + if (dynamicMemberConverter != null && dynamicMemberConverter.CanRead) + { + value = DeserializeConvertable(dynamicMemberConverter, reader, t, null); + } + else + { + value = CreateValueInternal(reader, t, dynamicMemberContract, null, null, member, null); + } + + contract.TrySetMember(newObject, memberName, value); + } + } + catch (Exception ex) + { + if (IsErrorHandled(newObject, contract, memberName, reader as IJsonLineInfo, reader.Path, ex)) + { + HandleError(reader, true, initialDepth); + } + else + { + throw; + } + } + break; + case JsonToken.EndObject: + finished = true; + break; + default: + throw JsonSerializationException.Create(reader, "Unexpected token when deserializing object: " + reader.TokenType); + } + } while (!finished && reader.Read()); + + if (!finished) + { + ThrowUnexpectedEndException(reader, contract, newObject, "Unexpected end when deserializing object."); + } + + OnDeserialized(reader, contract, newObject); + + return newObject; + } +#endif + + internal class CreatorPropertyContext + { + public string Name; + public JsonProperty Property; + public JsonProperty ConstructorProperty; + public PropertyPresence? Presence; + public object Value; + public bool Used; + } + + private object CreateObjectUsingCreatorWithParameters(JsonReader reader, JsonObjectContract contract, JsonProperty containerProperty, ObjectConstructor creator, string id) + { + ValidationUtils.ArgumentNotNull(creator, nameof(creator)); + + // only need to keep a track of properies presence if they are required or a value should be defaulted if missing + bool trackPresence = (contract.HasRequiredOrDefaultValueProperties || HasFlag(Serializer._defaultValueHandling, DefaultValueHandling.Populate)); + + Type objectType = contract.UnderlyingType; + + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Info) + { + string parameters = string.Join(", ", contract.CreatorParameters.Select(p => p.PropertyName).ToArray()); + TraceWriter.Trace(TraceLevel.Info, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "Deserializing {0} using creator with parameters: {1}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType, parameters)), null); + } + + List propertyContexts = ResolvePropertyAndCreatorValues(contract, containerProperty, reader, objectType); + if (trackPresence) + { + foreach (JsonProperty property in contract.Properties) + { + if (propertyContexts.All(p => p.Property != property)) + { + propertyContexts.Add(new CreatorPropertyContext + { + Property = property, + Name = property.PropertyName, + Presence = PropertyPresence.None + }); + } + } + } + + object[] creatorParameterValues = new object[contract.CreatorParameters.Count]; + + foreach (CreatorPropertyContext context in propertyContexts) + { + // set presence of read values + if (trackPresence) + { + if (context.Property != null && context.Presence == null) + { + object v = context.Value; + PropertyPresence propertyPresence; + if (v == null) + { + propertyPresence = PropertyPresence.Null; + } + else if (v is string) + { + propertyPresence = CoerceEmptyStringToNull(context.Property.PropertyType, context.Property.PropertyContract, (string)v) + ? PropertyPresence.Null + : PropertyPresence.Value; + } + else + { + propertyPresence = PropertyPresence.Value; + } + + context.Presence = propertyPresence; + } + } + + JsonProperty constructorProperty = context.ConstructorProperty; + if (constructorProperty == null && context.Property != null) + { + constructorProperty = contract.CreatorParameters.ForgivingCaseSensitiveFind(p => p.PropertyName, context.Property.UnderlyingName); + } + + if (constructorProperty != null && !constructorProperty.Ignored) + { + // handle giving default values to creator parameters + // this needs to happen before the call to creator + if (trackPresence) + { + if (context.Presence == PropertyPresence.None || context.Presence == PropertyPresence.Null) + { + if (constructorProperty.PropertyContract == null) + { + constructorProperty.PropertyContract = GetContractSafe(constructorProperty.PropertyType); + } + + if (HasFlag(constructorProperty.DefaultValueHandling.GetValueOrDefault(Serializer._defaultValueHandling), DefaultValueHandling.Populate)) + { + context.Value = EnsureType( + reader, + constructorProperty.GetResolvedDefaultValue(), + CultureInfo.InvariantCulture, + constructorProperty.PropertyContract, + constructorProperty.PropertyType); + } + } + } + + int i = contract.CreatorParameters.IndexOf(constructorProperty); + creatorParameterValues[i] = context.Value; + + context.Used = true; + } + } + + object createdObject = creator(creatorParameterValues); + + if (id != null) + { + AddReference(reader, id, createdObject); + } + + OnDeserializing(reader, contract, createdObject); + + // go through unused values and set the newly created object's properties + foreach (CreatorPropertyContext context in propertyContexts) + { + if (context.Used || + context.Property == null || + context.Property.Ignored || + context.Presence == PropertyPresence.None) + { + continue; + } + + JsonProperty property = context.Property; + object value = context.Value; + + if (ShouldSetPropertyValue(property, value)) + { + property.ValueProvider.SetValue(createdObject, value); + context.Used = true; + } + else if (!property.Writable && value != null) + { + // handle readonly collection/dictionary properties + JsonContract propertyContract = Serializer._contractResolver.ResolveContract(property.PropertyType); + + if (propertyContract.ContractType == JsonContractType.Array) + { + JsonArrayContract propertyArrayContract = (JsonArrayContract)propertyContract; + + object createdObjectCollection = property.ValueProvider.GetValue(createdObject); + if (createdObjectCollection != null) + { + IWrappedCollection createdObjectCollectionWrapper = propertyArrayContract.CreateWrapper(createdObjectCollection); + IWrappedCollection newValues = propertyArrayContract.CreateWrapper(value); + + foreach (object newValue in newValues) + { + createdObjectCollectionWrapper.Add(newValue); + } + } + } + else if (propertyContract.ContractType == JsonContractType.Dictionary) + { + JsonDictionaryContract dictionaryContract = (JsonDictionaryContract)propertyContract; + + object createdObjectDictionary = property.ValueProvider.GetValue(createdObject); + if (createdObjectDictionary != null) + { + IDictionary targetDictionary = (dictionaryContract.ShouldCreateWrapper) ? dictionaryContract.CreateWrapper(createdObjectDictionary) : (IDictionary)createdObjectDictionary; + IDictionary newValues = (dictionaryContract.ShouldCreateWrapper) ? dictionaryContract.CreateWrapper(value) : (IDictionary)value; + + foreach (DictionaryEntry newValue in newValues) + { + targetDictionary.Add(newValue.Key, newValue.Value); + } + } + } + + context.Used = true; + } + } + + if (contract.ExtensionDataSetter != null) + { + foreach (CreatorPropertyContext propertyValue in propertyContexts) + { + if (!propertyValue.Used) + { + contract.ExtensionDataSetter(createdObject, propertyValue.Name, propertyValue.Value); + } + } + } + + if (trackPresence) + { + foreach (CreatorPropertyContext context in propertyContexts) + { + if (context.Property == null) + { + continue; + } + + EndProcessProperty( + createdObject, + reader, + contract, + reader.Depth, + context.Property, + context.Presence.GetValueOrDefault(), + !context.Used); + } + } + + OnDeserialized(reader, contract, createdObject); + return createdObject; + } + + private object DeserializeConvertable(JsonConverter converter, JsonReader reader, Type objectType, object existingValue) + { + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Info) + { + TraceWriter.Trace(TraceLevel.Info, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "Started deserializing {0} with converter {1}.".FormatWith(CultureInfo.InvariantCulture, objectType, converter.GetType())), null); + } + + object value = converter.ReadJson(reader, objectType, existingValue, GetInternalSerializer()); + + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Info) + { + TraceWriter.Trace(TraceLevel.Info, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "Finished deserializing {0} with converter {1}.".FormatWith(CultureInfo.InvariantCulture, objectType, converter.GetType())), null); + } + + return value; + } + + private List ResolvePropertyAndCreatorValues(JsonObjectContract contract, JsonProperty containerProperty, JsonReader reader, Type objectType) + { + List propertyValues = new List(); + bool exit = false; + do + { + switch (reader.TokenType) + { + case JsonToken.PropertyName: + string memberName = reader.Value.ToString(); + + CreatorPropertyContext creatorPropertyContext = new CreatorPropertyContext + { + Name = reader.Value.ToString(), + ConstructorProperty = contract.CreatorParameters.GetClosestMatchProperty(memberName), + Property = contract.Properties.GetClosestMatchProperty(memberName) + }; + propertyValues.Add(creatorPropertyContext); + + JsonProperty property = creatorPropertyContext.ConstructorProperty ?? creatorPropertyContext.Property; + if (property != null && !property.Ignored) + { + if (property.PropertyContract == null) + { + property.PropertyContract = GetContractSafe(property.PropertyType); + } + + JsonConverter propertyConverter = GetConverter(property.PropertyContract, property.MemberConverter, contract, containerProperty); + + if (!ReadForType(reader, property.PropertyContract, propertyConverter != null)) + { + throw JsonSerializationException.Create(reader, "Unexpected end when setting {0}'s value.".FormatWith(CultureInfo.InvariantCulture, memberName)); + } + + if (propertyConverter != null && propertyConverter.CanRead) + { + creatorPropertyContext.Value = DeserializeConvertable(propertyConverter, reader, property.PropertyType, null); + } + else + { + creatorPropertyContext.Value = CreateValueInternal(reader, property.PropertyType, property.PropertyContract, property, contract, containerProperty, null); + } + + continue; + } + else + { + if (!reader.Read()) + { + throw JsonSerializationException.Create(reader, "Unexpected end when setting {0}'s value.".FormatWith(CultureInfo.InvariantCulture, memberName)); + } + + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) + { + TraceWriter.Trace(TraceLevel.Verbose, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "Could not find member '{0}' on {1}.".FormatWith(CultureInfo.InvariantCulture, memberName, contract.UnderlyingType)), null); + } + + if (Serializer._missingMemberHandling == MissingMemberHandling.Error) + { + throw JsonSerializationException.Create(reader, "Could not find member '{0}' on object of type '{1}'".FormatWith(CultureInfo.InvariantCulture, memberName, objectType.Name)); + } + } + + if (contract.ExtensionDataSetter != null) + { + creatorPropertyContext.Value = ReadExtensionDataValue(contract, containerProperty, reader); + } + else + { + reader.Skip(); + } + break; + case JsonToken.Comment: + break; + case JsonToken.EndObject: + exit = true; + break; + default: + throw JsonSerializationException.Create(reader, "Unexpected token when deserializing object: " + reader.TokenType); + } + } while (!exit && reader.Read()); + + return propertyValues; + } + + private bool ReadForType(JsonReader reader, JsonContract contract, bool hasConverter) + { + // don't read properties with converters as a specific value + // the value might be a string which will then get converted which will error if read as date for example + if (hasConverter) + { + return reader.Read(); + } + + ReadType t = (contract != null) ? contract.InternalReadType : ReadType.Read; + + switch (t) + { + case ReadType.Read: + return reader.ReadAndMoveToContent(); + case ReadType.ReadAsInt32: + reader.ReadAsInt32(); + break; + case ReadType.ReadAsDecimal: + reader.ReadAsDecimal(); + break; + case ReadType.ReadAsDouble: + reader.ReadAsDouble(); + break; + case ReadType.ReadAsBytes: + reader.ReadAsBytes(); + break; + case ReadType.ReadAsBoolean: + reader.ReadAsBoolean(); + break; + case ReadType.ReadAsString: + reader.ReadAsString(); + break; + case ReadType.ReadAsDateTime: + reader.ReadAsDateTime(); + break; +#if !NET20 + case ReadType.ReadAsDateTimeOffset: + reader.ReadAsDateTimeOffset(); + break; +#endif + default: + throw new ArgumentOutOfRangeException(); + } + + return (reader.TokenType != JsonToken.None); + } + + public object CreateNewObject(JsonReader reader, JsonObjectContract objectContract, JsonProperty containerMember, JsonProperty containerProperty, string id, out bool createdFromNonDefaultCreator) + { + object newObject = null; + + if (objectContract.OverrideCreator != null) + { + if (objectContract.CreatorParameters.Count > 0) + { + createdFromNonDefaultCreator = true; + return CreateObjectUsingCreatorWithParameters(reader, objectContract, containerMember, objectContract.OverrideCreator, id); + } + + newObject = objectContract.OverrideCreator(new object[0]); + } + else if (objectContract.DefaultCreator != null && + (!objectContract.DefaultCreatorNonPublic || Serializer._constructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor || objectContract.ParameterizedCreator == null)) + { + // use the default constructor if it is... + // public + // non-public and the user has change constructor handling settings + // non-public and there is no other creator + newObject = objectContract.DefaultCreator(); + } + else if (objectContract.ParameterizedCreator != null) + { + createdFromNonDefaultCreator = true; + return CreateObjectUsingCreatorWithParameters(reader, objectContract, containerMember, objectContract.ParameterizedCreator, id); + } + + if (newObject == null) + { + if (!objectContract.IsInstantiable) + { + throw JsonSerializationException.Create(reader, "Could not create an instance of type {0}. Type is an interface or abstract class and cannot be instantiated.".FormatWith(CultureInfo.InvariantCulture, objectContract.UnderlyingType)); + } + + throw JsonSerializationException.Create(reader, "Unable to find a constructor to use for type {0}. A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute.".FormatWith(CultureInfo.InvariantCulture, objectContract.UnderlyingType)); + } + + createdFromNonDefaultCreator = false; + return newObject; + } + + private object PopulateObject(object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, string id) + { + OnDeserializing(reader, contract, newObject); + + // only need to keep a track of properies presence if they are required or a value should be defaulted if missing + Dictionary propertiesPresence = (contract.HasRequiredOrDefaultValueProperties || HasFlag(Serializer._defaultValueHandling, DefaultValueHandling.Populate)) + ? contract.Properties.ToDictionary(m => m, m => PropertyPresence.None) + : null; + + if (id != null) + { + AddReference(reader, id, newObject); + } + + int initialDepth = reader.Depth; + + bool finished = false; + do + { + switch (reader.TokenType) + { + case JsonToken.PropertyName: + { + string memberName = reader.Value.ToString(); + + if (CheckPropertyName(reader, memberName)) + { + continue; + } + + try + { + // attempt exact case match first + // then try match ignoring case + JsonProperty property = contract.Properties.GetClosestMatchProperty(memberName); + + if (property == null) + { + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) + { + TraceWriter.Trace(TraceLevel.Verbose, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "Could not find member '{0}' on {1}".FormatWith(CultureInfo.InvariantCulture, memberName, contract.UnderlyingType)), null); + } + + if (Serializer._missingMemberHandling == MissingMemberHandling.Error) + { + throw JsonSerializationException.Create(reader, "Could not find member '{0}' on object of type '{1}'".FormatWith(CultureInfo.InvariantCulture, memberName, contract.UnderlyingType.Name)); + } + + if (!reader.Read()) + { + break; + } + + SetExtensionData(contract, member, reader, memberName, newObject); + continue; + } + + if (property.Ignored || !ShouldDeserialize(reader, property, newObject)) + { + if (!reader.Read()) + { + break; + } + + SetPropertyPresence(reader, property, propertiesPresence); + SetExtensionData(contract, member, reader, memberName, newObject); + } + else + { + if (property.PropertyContract == null) + { + property.PropertyContract = GetContractSafe(property.PropertyType); + } + + JsonConverter propertyConverter = GetConverter(property.PropertyContract, property.MemberConverter, contract, member); + + if (!ReadForType(reader, property.PropertyContract, propertyConverter != null)) + { + throw JsonSerializationException.Create(reader, "Unexpected end when setting {0}'s value.".FormatWith(CultureInfo.InvariantCulture, memberName)); + } + + SetPropertyPresence(reader, property, propertiesPresence); + + // set extension data if property is ignored or readonly + if (!SetPropertyValue(property, propertyConverter, contract, member, reader, newObject)) + { + SetExtensionData(contract, member, reader, memberName, newObject); + } + } + } + catch (Exception ex) + { + if (IsErrorHandled(newObject, contract, memberName, reader as IJsonLineInfo, reader.Path, ex)) + { + HandleError(reader, true, initialDepth); + } + else + { + throw; + } + } + break; + } + case JsonToken.EndObject: + finished = true; + break; + case JsonToken.Comment: + // ignore + break; + default: + throw JsonSerializationException.Create(reader, "Unexpected token when deserializing object: " + reader.TokenType); + } + } while (!finished && reader.Read()); + + if (!finished) + { + ThrowUnexpectedEndException(reader, contract, newObject, "Unexpected end when deserializing object."); + } + + if (propertiesPresence != null) + { + foreach (KeyValuePair propertyPresence in propertiesPresence) + { + JsonProperty property = propertyPresence.Key; + PropertyPresence presence = propertyPresence.Value; + + EndProcessProperty(newObject, reader, contract, initialDepth, property, presence, true); + } + } + + OnDeserialized(reader, contract, newObject); + return newObject; + } + + private bool ShouldDeserialize(JsonReader reader, JsonProperty property, object target) + { + if (property.ShouldDeserialize == null) + { + return true; + } + + bool shouldDeserialize = property.ShouldDeserialize(target); + + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) + { + TraceWriter.Trace(TraceLevel.Verbose, JsonPosition.FormatMessage(null, reader.Path, "ShouldDeserialize result for property '{0}' on {1}: {2}".FormatWith(CultureInfo.InvariantCulture, property.PropertyName, property.DeclaringType, shouldDeserialize)), null); + } + + return shouldDeserialize; + } + + private bool CheckPropertyName(JsonReader reader, string memberName) + { + if (Serializer.MetadataPropertyHandling == MetadataPropertyHandling.ReadAhead) + { + switch (memberName) + { + case JsonTypeReflector.IdPropertyName: + case JsonTypeReflector.RefPropertyName: + case JsonTypeReflector.TypePropertyName: + case JsonTypeReflector.ArrayValuesPropertyName: + reader.Skip(); + return true; + } + } + return false; + } + + private void SetExtensionData(JsonObjectContract contract, JsonProperty member, JsonReader reader, string memberName, object o) + { + if (contract.ExtensionDataSetter != null) + { + try + { + object value = ReadExtensionDataValue(contract, member, reader); + + contract.ExtensionDataSetter(o, memberName, value); + } + catch (Exception ex) + { + throw JsonSerializationException.Create(reader, "Error setting value in extension data for type '{0}'.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType), ex); + } + } + else + { + reader.Skip(); + } + } + + private object ReadExtensionDataValue(JsonObjectContract contract, JsonProperty member, JsonReader reader) + { + object value; + if (contract.ExtensionDataIsJToken) + { + value = JToken.ReadFrom(reader); + } + else + { + value = CreateValueInternal(reader, null, null, null, contract, member, null); + } + return value; + } + + private void EndProcessProperty(object newObject, JsonReader reader, JsonObjectContract contract, int initialDepth, JsonProperty property, PropertyPresence presence, bool setDefaultValue) + { + if (presence == PropertyPresence.None || presence == PropertyPresence.Null) + { + try + { + Required resolvedRequired = property._required ?? contract.ItemRequired ?? Required.Default; + + switch (presence) + { + case PropertyPresence.None: + if (resolvedRequired == Required.AllowNull || resolvedRequired == Required.Always) + { + throw JsonSerializationException.Create(reader, "Required property '{0}' not found in JSON.".FormatWith(CultureInfo.InvariantCulture, property.PropertyName)); + } + + if (setDefaultValue && !property.Ignored) + { + if (property.PropertyContract == null) + { + property.PropertyContract = GetContractSafe(property.PropertyType); + } + + if (HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer._defaultValueHandling), DefaultValueHandling.Populate) && property.Writable) + { + property.ValueProvider.SetValue(newObject, EnsureType(reader, property.GetResolvedDefaultValue(), CultureInfo.InvariantCulture, property.PropertyContract, property.PropertyType)); + } + } + break; + case PropertyPresence.Null: + if (resolvedRequired == Required.Always) + { + throw JsonSerializationException.Create(reader, "Required property '{0}' expects a value but got null.".FormatWith(CultureInfo.InvariantCulture, property.PropertyName)); + } + if (resolvedRequired == Required.DisallowNull) + { + throw JsonSerializationException.Create(reader, "Required property '{0}' expects a non-null value.".FormatWith(CultureInfo.InvariantCulture, property.PropertyName)); + } + break; + } + } + catch (Exception ex) + { + if (IsErrorHandled(newObject, contract, property.PropertyName, reader as IJsonLineInfo, reader.Path, ex)) + { + HandleError(reader, true, initialDepth); + } + else + { + throw; + } + } + } + } + + private void SetPropertyPresence(JsonReader reader, JsonProperty property, Dictionary requiredProperties) + { + if (property != null && requiredProperties != null) + { + PropertyPresence propertyPresence; + switch (reader.TokenType) + { + case JsonToken.String: + propertyPresence = (CoerceEmptyStringToNull(property.PropertyType, property.PropertyContract, (string)reader.Value)) + ? PropertyPresence.Null + : PropertyPresence.Value; + break; + case JsonToken.Null: + case JsonToken.Undefined: + propertyPresence = PropertyPresence.Null; + break; + default: + propertyPresence = PropertyPresence.Value; + break; + } + + requiredProperties[property] = propertyPresence; + } + } + + private void HandleError(JsonReader reader, bool readPastError, int initialDepth) + { + ClearErrorContext(); + + if (readPastError) + { + reader.Skip(); + + while (reader.Depth > (initialDepth + 1)) + { + if (!reader.Read()) + { + break; + } + } + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/JsonSerializerInternalWriter.cs b/Common/00-1Json8.3/Json8.3/Serialization/JsonSerializerInternalWriter.cs new file mode 100644 index 0000000..d5b8496 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/JsonSerializerInternalWriter.cs @@ -0,0 +1,1196 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +#if !(NET35 || NET20 || PORTABLE40) +using System.Dynamic; +#endif +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Security; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Utilities; +using System.Runtime.Serialization; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Serialization +{ + internal class JsonSerializerInternalWriter : JsonSerializerInternalBase + { + private Type _rootType; + private int _rootLevel; + private readonly List _serializeStack = new List(); + + public JsonSerializerInternalWriter(JsonSerializer serializer) + : base(serializer) + { + } + + public void Serialize(JsonWriter jsonWriter, object value, Type objectType) + { + if (jsonWriter == null) + { + throw new ArgumentNullException(nameof(jsonWriter)); + } + + _rootType = objectType; + _rootLevel = _serializeStack.Count + 1; + + JsonContract contract = GetContractSafe(value); + + try + { + if (ShouldWriteReference(value, null, contract, null, null)) + { + WriteReference(jsonWriter, value); + } + else + { + SerializeValue(jsonWriter, value, contract, null, null, null); + } + } + catch (Exception ex) + { + if (IsErrorHandled(null, contract, null, null, jsonWriter.Path, ex)) + { + HandleError(jsonWriter, 0); + } + else + { + // clear context in case serializer is being used inside a converter + // if the converter wraps the error then not clearing the context will cause this error: + // "Current error context error is different to requested error." + ClearErrorContext(); + throw; + } + } + finally + { + // clear root contract to ensure that if level was > 1 then it won't + // accidently be used for non root values + _rootType = null; + } + } + + private JsonSerializerProxy GetInternalSerializer() + { + if (InternalSerializer == null) + { + InternalSerializer = new JsonSerializerProxy(this); + } + + return InternalSerializer; + } + + private JsonContract GetContractSafe(object value) + { + if (value == null) + { + return null; + } + + return Serializer._contractResolver.ResolveContract(value.GetType()); + } + + private void SerializePrimitive(JsonWriter writer, object value, JsonPrimitiveContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) + { + if (contract.TypeCode == PrimitiveTypeCode.Bytes) + { + // if type name handling is enabled then wrap the base64 byte string in an object with the type name + bool includeTypeDetails = ShouldWriteType(TypeNameHandling.Objects, contract, member, containerContract, containerProperty); + if (includeTypeDetails) + { + writer.WriteStartObject(); + WriteTypeProperty(writer, contract.CreatedType); + writer.WritePropertyName(JsonTypeReflector.ValuePropertyName, false); + + JsonWriter.WriteValue(writer, contract.TypeCode, value); + + writer.WriteEndObject(); + return; + } + } + + JsonWriter.WriteValue(writer, contract.TypeCode, value); + } + + private void SerializeValue(JsonWriter writer, object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) + { + if (value == null) + { + writer.WriteNull(); + return; + } + + JsonConverter converter = + ((member != null) ? member.Converter : null) ?? + ((containerProperty != null) ? containerProperty.ItemConverter : null) ?? + ((containerContract != null) ? containerContract.ItemConverter : null) ?? + valueContract.Converter ?? + Serializer.GetMatchingConverter(valueContract.UnderlyingType) ?? + valueContract.InternalConverter; + + if (converter != null && converter.CanWrite) + { + SerializeConvertable(writer, converter, value, valueContract, containerContract, containerProperty); + return; + } + + switch (valueContract.ContractType) + { + case JsonContractType.Object: + SerializeObject(writer, value, (JsonObjectContract)valueContract, member, containerContract, containerProperty); + break; + case JsonContractType.Array: + JsonArrayContract arrayContract = (JsonArrayContract)valueContract; + if (!arrayContract.IsMultidimensionalArray) + { + SerializeList(writer, (IEnumerable)value, arrayContract, member, containerContract, containerProperty); + } + else + { + SerializeMultidimensionalArray(writer, (Array)value, arrayContract, member, containerContract, containerProperty); + } + break; + case JsonContractType.Primitive: + SerializePrimitive(writer, value, (JsonPrimitiveContract)valueContract, member, containerContract, containerProperty); + break; + case JsonContractType.String: + SerializeString(writer, value, (JsonStringContract)valueContract); + break; + case JsonContractType.Dictionary: + JsonDictionaryContract dictionaryContract = (JsonDictionaryContract)valueContract; + SerializeDictionary(writer, (value is IDictionary) ? (IDictionary)value : dictionaryContract.CreateWrapper(value), dictionaryContract, member, containerContract, containerProperty); + break; +#if !(NET35 || NET20 || PORTABLE40) + case JsonContractType.Dynamic: + SerializeDynamic(writer, (IDynamicMetaObjectProvider)value, (JsonDynamicContract)valueContract, member, containerContract, containerProperty); + break; +#endif +#if !(DOTNET || PORTABLE40 || PORTABLE) + case JsonContractType.Serializable: + SerializeISerializable(writer, (ISerializable)value, (JsonISerializableContract)valueContract, member, containerContract, containerProperty); + break; +#endif + case JsonContractType.Linq: + ((JToken)value).WriteTo(writer, Serializer.Converters.ToArray()); + break; + } + } + + private bool? ResolveIsReference(JsonContract contract, JsonProperty property, JsonContainerContract collectionContract, JsonProperty containerProperty) + { + bool? isReference = null; + + // value could be coming from a dictionary or array and not have a property + if (property != null) + { + isReference = property.IsReference; + } + + if (isReference == null && containerProperty != null) + { + isReference = containerProperty.ItemIsReference; + } + + if (isReference == null && collectionContract != null) + { + isReference = collectionContract.ItemIsReference; + } + + if (isReference == null) + { + isReference = contract.IsReference; + } + + return isReference; + } + + private bool ShouldWriteReference(object value, JsonProperty property, JsonContract valueContract, JsonContainerContract collectionContract, JsonProperty containerProperty) + { + if (value == null) + { + return false; + } + if (valueContract.ContractType == JsonContractType.Primitive || valueContract.ContractType == JsonContractType.String) + { + return false; + } + + bool? isReference = ResolveIsReference(valueContract, property, collectionContract, containerProperty); + + if (isReference == null) + { + if (valueContract.ContractType == JsonContractType.Array) + { + isReference = HasFlag(Serializer._preserveReferencesHandling, PreserveReferencesHandling.Arrays); + } + else + { + isReference = HasFlag(Serializer._preserveReferencesHandling, PreserveReferencesHandling.Objects); + } + } + + if (!isReference.GetValueOrDefault()) + { + return false; + } + + return Serializer.GetReferenceResolver().IsReferenced(this, value); + } + + private bool ShouldWriteProperty(object memberValue, JsonProperty property) + { + if (property.NullValueHandling.GetValueOrDefault(Serializer._nullValueHandling) == NullValueHandling.Ignore && + memberValue == null) + { + return false; + } + + if (HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer._defaultValueHandling), DefaultValueHandling.Ignore) + && MiscellaneousUtils.ValueEquals(memberValue, property.GetResolvedDefaultValue())) + { + return false; + } + + return true; + } + + private bool CheckForCircularReference(JsonWriter writer, object value, JsonProperty property, JsonContract contract, JsonContainerContract containerContract, JsonProperty containerProperty) + { + if (value == null || contract.ContractType == JsonContractType.Primitive || contract.ContractType == JsonContractType.String) + { + return true; + } + + ReferenceLoopHandling? referenceLoopHandling = null; + + if (property != null) + { + referenceLoopHandling = property.ReferenceLoopHandling; + } + + if (referenceLoopHandling == null && containerProperty != null) + { + referenceLoopHandling = containerProperty.ItemReferenceLoopHandling; + } + + if (referenceLoopHandling == null && containerContract != null) + { + referenceLoopHandling = containerContract.ItemReferenceLoopHandling; + } + + bool exists = (Serializer._equalityComparer != null) + ? _serializeStack.Contains(value, Serializer._equalityComparer) + : _serializeStack.Contains(value); + + if (exists) + { + string message = "Self referencing loop detected"; + if (property != null) + { + message += " for property '{0}'".FormatWith(CultureInfo.InvariantCulture, property.PropertyName); + } + message += " with type '{0}'.".FormatWith(CultureInfo.InvariantCulture, value.GetType()); + + switch (referenceLoopHandling.GetValueOrDefault(Serializer._referenceLoopHandling)) + { + case ReferenceLoopHandling.Error: + throw JsonSerializationException.Create(null, writer.ContainerPath, message, null); + case ReferenceLoopHandling.Ignore: + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) + { + TraceWriter.Trace(TraceLevel.Verbose, JsonPosition.FormatMessage(null, writer.Path, message + ". Skipping serializing self referenced value."), null); + } + + return false; + case ReferenceLoopHandling.Serialize: + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) + { + TraceWriter.Trace(TraceLevel.Verbose, JsonPosition.FormatMessage(null, writer.Path, message + ". Serializing self referenced value."), null); + } + + return true; + } + } + + return true; + } + + private void WriteReference(JsonWriter writer, object value) + { + string reference = GetReference(writer, value); + + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Info) + { + TraceWriter.Trace(TraceLevel.Info, JsonPosition.FormatMessage(null, writer.Path, "Writing object reference to Id '{0}' for {1}.".FormatWith(CultureInfo.InvariantCulture, reference, value.GetType())), null); + } + + writer.WriteStartObject(); + writer.WritePropertyName(JsonTypeReflector.RefPropertyName, false); + writer.WriteValue(reference); + writer.WriteEndObject(); + } + + private string GetReference(JsonWriter writer, object value) + { + try + { + string reference = Serializer.GetReferenceResolver().GetReference(this, value); + + return reference; + } + catch (Exception ex) + { + throw JsonSerializationException.Create(null, writer.ContainerPath, "Error writing object reference for '{0}'.".FormatWith(CultureInfo.InvariantCulture, value.GetType()), ex); + } + } + + internal static bool TryConvertToString(object value, Type type, out string s) + { +#if !(DOTNET || PORTABLE40 || PORTABLE) + TypeConverter converter = ConvertUtils.GetConverter(type); + + // use the objectType's TypeConverter if it has one and can convert to a string + if (converter != null + && !(converter is ComponentConverter) + && converter.GetType() != typeof(TypeConverter)) + { + if (converter.CanConvertTo(typeof(string))) + { + s = converter.ConvertToInvariantString(value); + return true; + } + } +#endif + +#if (DOTNET || PORTABLE) + if (value is Guid || value is Uri || value is TimeSpan) + { + s = value.ToString(); + return true; + } +#endif + + if (value is Type) + { + s = ((Type)value).AssemblyQualifiedName; + return true; + } + + s = null; + return false; + } + + private void SerializeString(JsonWriter writer, object value, JsonStringContract contract) + { + OnSerializing(writer, contract, value); + + string s; + TryConvertToString(value, contract.UnderlyingType, out s); + writer.WriteValue(s); + + OnSerialized(writer, contract, value); + } + + private void OnSerializing(JsonWriter writer, JsonContract contract, object value) + { + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Info) + { + TraceWriter.Trace(TraceLevel.Info, JsonPosition.FormatMessage(null, writer.Path, "Started serializing {0}".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)), null); + } + + contract.InvokeOnSerializing(value, Serializer._context); + } + + private void OnSerialized(JsonWriter writer, JsonContract contract, object value) + { + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Info) + { + TraceWriter.Trace(TraceLevel.Info, JsonPosition.FormatMessage(null, writer.Path, "Finished serializing {0}".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)), null); + } + + contract.InvokeOnSerialized(value, Serializer._context); + } + + private void SerializeObject(JsonWriter writer, object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) + { + OnSerializing(writer, contract, value); + + _serializeStack.Add(value); + + WriteObjectStart(writer, value, contract, member, collectionContract, containerProperty); + + int initialDepth = writer.Top; + + for (int index = 0; index < contract.Properties.Count; index++) + { + JsonProperty property = contract.Properties[index]; + try + { + object memberValue; + JsonContract memberContract; + + if (!CalculatePropertyValues(writer, value, contract, member, property, out memberContract, out memberValue)) + { + continue; + } + + property.WritePropertyName(writer); + SerializeValue(writer, memberValue, memberContract, property, contract, member); + } + catch (Exception ex) + { + if (IsErrorHandled(value, contract, property.PropertyName, null, writer.ContainerPath, ex)) + { + HandleError(writer, initialDepth); + } + else + { + throw; + } + } + } + + if (contract.ExtensionDataGetter != null) + { + IEnumerable> extensionData = contract.ExtensionDataGetter(value); + if (extensionData != null) + { + foreach (KeyValuePair e in extensionData) + { + JsonContract keyContract = GetContractSafe(e.Key); + JsonContract valueContract = GetContractSafe(e.Value); + + bool escape; + string propertyName = GetPropertyName(writer, e.Key, keyContract, out escape); + + if (ShouldWriteReference(e.Value, null, valueContract, contract, member)) + { + writer.WritePropertyName(propertyName); + WriteReference(writer, e.Value); + } + else + { + if (!CheckForCircularReference(writer, e.Value, null, valueContract, contract, member)) + { + continue; + } + + writer.WritePropertyName(propertyName); + + SerializeValue(writer, e.Value, valueContract, null, contract, member); + } + } + } + } + + writer.WriteEndObject(); + + _serializeStack.RemoveAt(_serializeStack.Count - 1); + + OnSerialized(writer, contract, value); + } + + private bool CalculatePropertyValues(JsonWriter writer, object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, out JsonContract memberContract, out object memberValue) + { + if (!property.Ignored && property.Readable && ShouldSerialize(writer, property, value) && IsSpecified(writer, property, value)) + { + if (property.PropertyContract == null) + { + property.PropertyContract = Serializer._contractResolver.ResolveContract(property.PropertyType); + } + + memberValue = property.ValueProvider.GetValue(value); + memberContract = (property.PropertyContract.IsSealed) ? property.PropertyContract : GetContractSafe(memberValue); + + if (ShouldWriteProperty(memberValue, property)) + { + if (ShouldWriteReference(memberValue, property, memberContract, contract, member)) + { + property.WritePropertyName(writer); + WriteReference(writer, memberValue); + return false; + } + + if (!CheckForCircularReference(writer, memberValue, property, memberContract, contract, member)) + { + return false; + } + + if (memberValue == null) + { + JsonObjectContract objectContract = contract as JsonObjectContract; + Required resolvedRequired = property._required ?? ((objectContract != null) ? objectContract.ItemRequired : null) ?? Required.Default; + if (resolvedRequired == Required.Always) + { + throw JsonSerializationException.Create(null, writer.ContainerPath, "Cannot write a null value for property '{0}'. Property requires a value.".FormatWith(CultureInfo.InvariantCulture, property.PropertyName), null); + } + if (resolvedRequired == Required.DisallowNull) + { + throw JsonSerializationException.Create(null, writer.ContainerPath, "Cannot write a null value for property '{0}'. Property requires a non-null value.".FormatWith(CultureInfo.InvariantCulture, property.PropertyName), null); + } + } + + return true; + } + } + + memberContract = null; + memberValue = null; + return false; + } + + private void WriteObjectStart(JsonWriter writer, object value, JsonContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) + { + writer.WriteStartObject(); + + bool isReference = ResolveIsReference(contract, member, collectionContract, containerProperty) ?? HasFlag(Serializer._preserveReferencesHandling, PreserveReferencesHandling.Objects); + // don't make readonly fields the referenced value because they can't be deserialized to + if (isReference && (member == null || member.Writable)) + { + WriteReferenceIdProperty(writer, contract.UnderlyingType, value); + } + if (ShouldWriteType(TypeNameHandling.Objects, contract, member, collectionContract, containerProperty)) + { + WriteTypeProperty(writer, contract.UnderlyingType); + } + } + + private void WriteReferenceIdProperty(JsonWriter writer, Type type, object value) + { + string reference = GetReference(writer, value); + + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) + { + TraceWriter.Trace(TraceLevel.Verbose, JsonPosition.FormatMessage(null, writer.Path, "Writing object reference Id '{0}' for {1}.".FormatWith(CultureInfo.InvariantCulture, reference, type)), null); + } + + writer.WritePropertyName(JsonTypeReflector.IdPropertyName, false); + writer.WriteValue(reference); + } + + private void WriteTypeProperty(JsonWriter writer, Type type) + { + string typeName = ReflectionUtils.GetTypeName(type, Serializer._typeNameAssemblyFormat, Serializer._binder); + + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) + { + TraceWriter.Trace(TraceLevel.Verbose, JsonPosition.FormatMessage(null, writer.Path, "Writing type name '{0}' for {1}.".FormatWith(CultureInfo.InvariantCulture, typeName, type)), null); + } + + writer.WritePropertyName(JsonTypeReflector.TypePropertyName, false); + writer.WriteValue(typeName); + } + + private bool HasFlag(DefaultValueHandling value, DefaultValueHandling flag) + { + return ((value & flag) == flag); + } + + private bool HasFlag(PreserveReferencesHandling value, PreserveReferencesHandling flag) + { + return ((value & flag) == flag); + } + + private bool HasFlag(TypeNameHandling value, TypeNameHandling flag) + { + return ((value & flag) == flag); + } + + private void SerializeConvertable(JsonWriter writer, JsonConverter converter, object value, JsonContract contract, JsonContainerContract collectionContract, JsonProperty containerProperty) + { + if (ShouldWriteReference(value, null, contract, collectionContract, containerProperty)) + { + WriteReference(writer, value); + } + else + { + if (!CheckForCircularReference(writer, value, null, contract, collectionContract, containerProperty)) + { + return; + } + + _serializeStack.Add(value); + + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Info) + { + TraceWriter.Trace(TraceLevel.Info, JsonPosition.FormatMessage(null, writer.Path, "Started serializing {0} with converter {1}.".FormatWith(CultureInfo.InvariantCulture, value.GetType(), converter.GetType())), null); + } + + converter.WriteJson(writer, value, GetInternalSerializer()); + + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Info) + { + TraceWriter.Trace(TraceLevel.Info, JsonPosition.FormatMessage(null, writer.Path, "Finished serializing {0} with converter {1}.".FormatWith(CultureInfo.InvariantCulture, value.GetType(), converter.GetType())), null); + } + + _serializeStack.RemoveAt(_serializeStack.Count - 1); + } + } + + private void SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) + { + IWrappedCollection wrappedCollection = values as IWrappedCollection; + object underlyingList = wrappedCollection != null ? wrappedCollection.UnderlyingCollection : values; + + OnSerializing(writer, contract, underlyingList); + + _serializeStack.Add(underlyingList); + + bool hasWrittenMetadataObject = WriteStartArray(writer, underlyingList, contract, member, collectionContract, containerProperty); + + writer.WriteStartArray(); + + int initialDepth = writer.Top; + + int index = 0; + // note that an error in the IEnumerable won't be caught + foreach (object value in values) + { + try + { + JsonContract valueContract = contract.FinalItemContract ?? GetContractSafe(value); + + if (ShouldWriteReference(value, null, valueContract, contract, member)) + { + WriteReference(writer, value); + } + else + { + if (CheckForCircularReference(writer, value, null, valueContract, contract, member)) + { + SerializeValue(writer, value, valueContract, null, contract, member); + } + } + } + catch (Exception ex) + { + if (IsErrorHandled(underlyingList, contract, index, null, writer.ContainerPath, ex)) + { + HandleError(writer, initialDepth); + } + else + { + throw; + } + } + finally + { + index++; + } + } + + writer.WriteEndArray(); + + if (hasWrittenMetadataObject) + { + writer.WriteEndObject(); + } + + _serializeStack.RemoveAt(_serializeStack.Count - 1); + + OnSerialized(writer, contract, underlyingList); + } + + private void SerializeMultidimensionalArray(JsonWriter writer, Array values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) + { + OnSerializing(writer, contract, values); + + _serializeStack.Add(values); + + bool hasWrittenMetadataObject = WriteStartArray(writer, values, contract, member, collectionContract, containerProperty); + + SerializeMultidimensionalArray(writer, values, contract, member, writer.Top, new int[0]); + + if (hasWrittenMetadataObject) + { + writer.WriteEndObject(); + } + + _serializeStack.RemoveAt(_serializeStack.Count - 1); + + OnSerialized(writer, contract, values); + } + + private void SerializeMultidimensionalArray(JsonWriter writer, Array values, JsonArrayContract contract, JsonProperty member, int initialDepth, int[] indices) + { + int dimension = indices.Length; + int[] newIndices = new int[dimension + 1]; + for (int i = 0; i < dimension; i++) + { + newIndices[i] = indices[i]; + } + + writer.WriteStartArray(); + + for (int i = values.GetLowerBound(dimension); i <= values.GetUpperBound(dimension); i++) + { + newIndices[dimension] = i; + bool isTopLevel = (newIndices.Length == values.Rank); + + if (isTopLevel) + { + object value = values.GetValue(newIndices); + + try + { + JsonContract valueContract = contract.FinalItemContract ?? GetContractSafe(value); + + if (ShouldWriteReference(value, null, valueContract, contract, member)) + { + WriteReference(writer, value); + } + else + { + if (CheckForCircularReference(writer, value, null, valueContract, contract, member)) + { + SerializeValue(writer, value, valueContract, null, contract, member); + } + } + } + catch (Exception ex) + { + if (IsErrorHandled(values, contract, i, null, writer.ContainerPath, ex)) + { + HandleError(writer, initialDepth + 1); + } + else + { + throw; + } + } + } + else + { + SerializeMultidimensionalArray(writer, values, contract, member, initialDepth + 1, newIndices); + } + } + + writer.WriteEndArray(); + } + + private bool WriteStartArray(JsonWriter writer, object values, JsonArrayContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) + { + bool isReference = ResolveIsReference(contract, member, containerContract, containerProperty) ?? HasFlag(Serializer._preserveReferencesHandling, PreserveReferencesHandling.Arrays); + // don't make readonly fields the referenced value because they can't be deserialized to + isReference = (isReference && (member == null || member.Writable)); + + bool includeTypeDetails = ShouldWriteType(TypeNameHandling.Arrays, contract, member, containerContract, containerProperty); + bool writeMetadataObject = isReference || includeTypeDetails; + + if (writeMetadataObject) + { + writer.WriteStartObject(); + + if (isReference) + { + WriteReferenceIdProperty(writer, contract.UnderlyingType, values); + } + if (includeTypeDetails) + { + WriteTypeProperty(writer, values.GetType()); + } + writer.WritePropertyName(JsonTypeReflector.ArrayValuesPropertyName, false); + } + + if (contract.ItemContract == null) + { + contract.ItemContract = Serializer._contractResolver.ResolveContract(contract.CollectionItemType ?? typeof(object)); + } + + return writeMetadataObject; + } + +#if !(DOTNET || PORTABLE40 || PORTABLE) +#if !(NET20 || NET35) + [SecuritySafeCritical] +#endif + private void SerializeISerializable(JsonWriter writer, ISerializable value, JsonISerializableContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) + { + if (!JsonTypeReflector.FullyTrusted) + { + string message = @"Type '{0}' implements ISerializable but cannot be serialized using the ISerializable interface because the current application is not fully trusted and ISerializable can expose secure data." + Environment.NewLine + + @"To fix this error either change the environment to be fully trusted, change the application to not deserialize the type, add JsonObjectAttribute to the type or change the JsonSerializer setting ContractResolver to use a new DefaultContractResolver with IgnoreSerializableInterface set to true." + Environment.NewLine; + message = message.FormatWith(CultureInfo.InvariantCulture, value.GetType()); + + throw JsonSerializationException.Create(null, writer.ContainerPath, message, null); + } + + OnSerializing(writer, contract, value); + _serializeStack.Add(value); + + WriteObjectStart(writer, value, contract, member, collectionContract, containerProperty); + + SerializationInfo serializationInfo = new SerializationInfo(contract.UnderlyingType, new FormatterConverter()); + value.GetObjectData(serializationInfo, Serializer._context); + + foreach (SerializationEntry serializationEntry in serializationInfo) + { + JsonContract valueContract = GetContractSafe(serializationEntry.Value); + + if (ShouldWriteReference(serializationEntry.Value, null, valueContract, contract, member)) + { + writer.WritePropertyName(serializationEntry.Name); + WriteReference(writer, serializationEntry.Value); + } + else if (CheckForCircularReference(writer, serializationEntry.Value, null, valueContract, contract, member)) + { + writer.WritePropertyName(serializationEntry.Name); + SerializeValue(writer, serializationEntry.Value, valueContract, null, contract, member); + } + } + + writer.WriteEndObject(); + + _serializeStack.RemoveAt(_serializeStack.Count - 1); + OnSerialized(writer, contract, value); + } +#endif + +#if !(NET35 || NET20 || PORTABLE40) + private void SerializeDynamic(JsonWriter writer, IDynamicMetaObjectProvider value, JsonDynamicContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) + { + OnSerializing(writer, contract, value); + _serializeStack.Add(value); + + WriteObjectStart(writer, value, contract, member, collectionContract, containerProperty); + + int initialDepth = writer.Top; + + for (int index = 0; index < contract.Properties.Count; index++) + { + JsonProperty property = contract.Properties[index]; + + // only write non-dynamic properties that have an explicit attribute + if (property.HasMemberAttribute) + { + try + { + object memberValue; + JsonContract memberContract; + + if (!CalculatePropertyValues(writer, value, contract, member, property, out memberContract, out memberValue)) + { + continue; + } + + property.WritePropertyName(writer); + SerializeValue(writer, memberValue, memberContract, property, contract, member); + } + catch (Exception ex) + { + if (IsErrorHandled(value, contract, property.PropertyName, null, writer.ContainerPath, ex)) + { + HandleError(writer, initialDepth); + } + else + { + throw; + } + } + } + } + + foreach (string memberName in value.GetDynamicMemberNames()) + { + object memberValue; + if (contract.TryGetMember(value, memberName, out memberValue)) + { + try + { + JsonContract valueContract = GetContractSafe(memberValue); + + if (!ShouldWriteDynamicProperty(memberValue)) + { + continue; + } + + if (CheckForCircularReference(writer, memberValue, null, valueContract, contract, member)) + { + string resolvedPropertyName = (contract.PropertyNameResolver != null) + ? contract.PropertyNameResolver(memberName) + : memberName; + + writer.WritePropertyName(resolvedPropertyName); + SerializeValue(writer, memberValue, valueContract, null, contract, member); + } + } + catch (Exception ex) + { + if (IsErrorHandled(value, contract, memberName, null, writer.ContainerPath, ex)) + { + HandleError(writer, initialDepth); + } + else + { + throw; + } + } + } + } + + writer.WriteEndObject(); + + _serializeStack.RemoveAt(_serializeStack.Count - 1); + OnSerialized(writer, contract, value); + } +#endif + + private bool ShouldWriteDynamicProperty(object memberValue) + { + if (Serializer._nullValueHandling == NullValueHandling.Ignore && memberValue == null) + { + return false; + } + + if (HasFlag(Serializer._defaultValueHandling, DefaultValueHandling.Ignore) && + (memberValue == null || MiscellaneousUtils.ValueEquals(memberValue, ReflectionUtils.GetDefaultValue(memberValue.GetType())))) + { + return false; + } + + return true; + } + + private bool ShouldWriteType(TypeNameHandling typeNameHandlingFlag, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) + { + TypeNameHandling resolvedTypeNameHandling = + ((member != null) ? member.TypeNameHandling : null) + ?? ((containerProperty != null) ? containerProperty.ItemTypeNameHandling : null) + ?? ((containerContract != null) ? containerContract.ItemTypeNameHandling : null) + ?? Serializer._typeNameHandling; + + if (HasFlag(resolvedTypeNameHandling, typeNameHandlingFlag)) + { + return true; + } + + // instance type and the property's type's contract default type are different (no need to put the type in JSON because the type will be created by default) + if (HasFlag(resolvedTypeNameHandling, TypeNameHandling.Auto)) + { + if (member != null) + { + if (contract.UnderlyingType != member.PropertyContract.CreatedType) + { + return true; + } + } + else if (containerContract != null) + { + if (containerContract.ItemContract == null || contract.UnderlyingType != containerContract.ItemContract.CreatedType) + { + return true; + } + } + else if (_rootType != null && _serializeStack.Count == _rootLevel) + { + JsonContract rootContract = Serializer._contractResolver.ResolveContract(_rootType); + + if (contract.UnderlyingType != rootContract.CreatedType) + { + return true; + } + } + } + + return false; + } + + private void SerializeDictionary(JsonWriter writer, IDictionary values, JsonDictionaryContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) + { + IWrappedDictionary wrappedDictionary = values as IWrappedDictionary; + object underlyingDictionary = wrappedDictionary != null ? wrappedDictionary.UnderlyingDictionary : values; + + OnSerializing(writer, contract, underlyingDictionary); + _serializeStack.Add(underlyingDictionary); + + WriteObjectStart(writer, underlyingDictionary, contract, member, collectionContract, containerProperty); + + if (contract.ItemContract == null) + { + contract.ItemContract = Serializer._contractResolver.ResolveContract(contract.DictionaryValueType ?? typeof(object)); + } + + if (contract.KeyContract == null) + { + contract.KeyContract = Serializer._contractResolver.ResolveContract(contract.DictionaryKeyType ?? typeof(object)); + } + + int initialDepth = writer.Top; + + foreach (DictionaryEntry entry in values) + { + bool escape; + string propertyName = GetPropertyName(writer, entry.Key, contract.KeyContract, out escape); + + propertyName = (contract.DictionaryKeyResolver != null) + ? contract.DictionaryKeyResolver(propertyName) + : propertyName; + + try + { + object value = entry.Value; + JsonContract valueContract = contract.FinalItemContract ?? GetContractSafe(value); + + if (ShouldWriteReference(value, null, valueContract, contract, member)) + { + writer.WritePropertyName(propertyName, escape); + WriteReference(writer, value); + } + else + { + if (!CheckForCircularReference(writer, value, null, valueContract, contract, member)) + { + continue; + } + + writer.WritePropertyName(propertyName, escape); + + SerializeValue(writer, value, valueContract, null, contract, member); + } + } + catch (Exception ex) + { + if (IsErrorHandled(underlyingDictionary, contract, propertyName, null, writer.ContainerPath, ex)) + { + HandleError(writer, initialDepth); + } + else + { + throw; + } + } + } + + writer.WriteEndObject(); + + _serializeStack.RemoveAt(_serializeStack.Count - 1); + + OnSerialized(writer, contract, underlyingDictionary); + } + + private string GetPropertyName(JsonWriter writer, object name, JsonContract contract, out bool escape) + { + string propertyName; + + if (contract.ContractType == JsonContractType.Primitive) + { + JsonPrimitiveContract primitiveContract = (JsonPrimitiveContract)contract; + if (primitiveContract.TypeCode == PrimitiveTypeCode.DateTime || primitiveContract.TypeCode == PrimitiveTypeCode.DateTimeNullable) + { + DateTime dt = DateTimeUtils.EnsureDateTime((DateTime)name, writer.DateTimeZoneHandling); + + escape = false; + StringWriter sw = new StringWriter(CultureInfo.InvariantCulture); + DateTimeUtils.WriteDateTimeString(sw, dt, writer.DateFormatHandling, writer.DateFormatString, writer.Culture); + return sw.ToString(); + } +#if !NET20 + else if (primitiveContract.TypeCode == PrimitiveTypeCode.DateTimeOffset || primitiveContract.TypeCode == PrimitiveTypeCode.DateTimeOffsetNullable) + { + escape = false; + StringWriter sw = new StringWriter(CultureInfo.InvariantCulture); + DateTimeUtils.WriteDateTimeOffsetString(sw, (DateTimeOffset)name, writer.DateFormatHandling, writer.DateFormatString, writer.Culture); + return sw.ToString(); + } +#endif + else + { + escape = true; + return Convert.ToString(name, CultureInfo.InvariantCulture); + } + } + else if (TryConvertToString(name, name.GetType(), out propertyName)) + { + escape = true; + return propertyName; + } + else + { + escape = true; + return name.ToString(); + } + } + + private void HandleError(JsonWriter writer, int initialDepth) + { + ClearErrorContext(); + + if (writer.WriteState == WriteState.Property) + { + writer.WriteNull(); + } + + while (writer.Top > initialDepth) + { + writer.WriteEnd(); + } + } + + private bool ShouldSerialize(JsonWriter writer, JsonProperty property, object target) + { + if (property.ShouldSerialize == null) + { + return true; + } + + bool shouldSerialize = property.ShouldSerialize(target); + + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) + { + TraceWriter.Trace(TraceLevel.Verbose, JsonPosition.FormatMessage(null, writer.Path, "ShouldSerialize result for property '{0}' on {1}: {2}".FormatWith(CultureInfo.InvariantCulture, property.PropertyName, property.DeclaringType, shouldSerialize)), null); + } + + return shouldSerialize; + } + + private bool IsSpecified(JsonWriter writer, JsonProperty property, object target) + { + if (property.GetIsSpecified == null) + { + return true; + } + + bool isSpecified = property.GetIsSpecified(target); + + if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) + { + TraceWriter.Trace(TraceLevel.Verbose, JsonPosition.FormatMessage(null, writer.Path, "IsSpecified result for property '{0}' on {1}: {2}".FormatWith(CultureInfo.InvariantCulture, property.PropertyName, property.DeclaringType, isSpecified)), null); + } + + return isSpecified; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/JsonSerializerProxy.cs b/Common/00-1Json8.3/Json8.3/Serialization/JsonSerializerProxy.cs new file mode 100644 index 0000000..cd1c910 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/JsonSerializerProxy.cs @@ -0,0 +1,278 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections; +using System.Globalization; +using System.Runtime.Serialization.Formatters; +using Newtonsoft.Json.Utilities; +using System.Runtime.Serialization; + +namespace Newtonsoft.Json.Serialization +{ + internal class JsonSerializerProxy : JsonSerializer + { + private readonly JsonSerializerInternalReader _serializerReader; + private readonly JsonSerializerInternalWriter _serializerWriter; + private readonly JsonSerializer _serializer; + + public override event EventHandler Error + { + add { _serializer.Error += value; } + remove { _serializer.Error -= value; } + } + + public override IReferenceResolver ReferenceResolver + { + get { return _serializer.ReferenceResolver; } + set { _serializer.ReferenceResolver = value; } + } + + public override ITraceWriter TraceWriter + { + get { return _serializer.TraceWriter; } + set { _serializer.TraceWriter = value; } + } + + public override IEqualityComparer EqualityComparer + { + get { return _serializer.EqualityComparer; } + set { _serializer.EqualityComparer = value; } + } + + public override JsonConverterCollection Converters + { + get { return _serializer.Converters; } + } + + public override DefaultValueHandling DefaultValueHandling + { + get { return _serializer.DefaultValueHandling; } + set { _serializer.DefaultValueHandling = value; } + } + + public override IContractResolver ContractResolver + { + get { return _serializer.ContractResolver; } + set { _serializer.ContractResolver = value; } + } + + public override MissingMemberHandling MissingMemberHandling + { + get { return _serializer.MissingMemberHandling; } + set { _serializer.MissingMemberHandling = value; } + } + + public override NullValueHandling NullValueHandling + { + get { return _serializer.NullValueHandling; } + set { _serializer.NullValueHandling = value; } + } + + public override ObjectCreationHandling ObjectCreationHandling + { + get { return _serializer.ObjectCreationHandling; } + set { _serializer.ObjectCreationHandling = value; } + } + + public override ReferenceLoopHandling ReferenceLoopHandling + { + get { return _serializer.ReferenceLoopHandling; } + set { _serializer.ReferenceLoopHandling = value; } + } + + public override PreserveReferencesHandling PreserveReferencesHandling + { + get { return _serializer.PreserveReferencesHandling; } + set { _serializer.PreserveReferencesHandling = value; } + } + + public override TypeNameHandling TypeNameHandling + { + get { return _serializer.TypeNameHandling; } + set { _serializer.TypeNameHandling = value; } + } + + public override MetadataPropertyHandling MetadataPropertyHandling + { + get { return _serializer.MetadataPropertyHandling; } + set { _serializer.MetadataPropertyHandling = value; } + } + + public override FormatterAssemblyStyle TypeNameAssemblyFormat + { + get { return _serializer.TypeNameAssemblyFormat; } + set { _serializer.TypeNameAssemblyFormat = value; } + } + + public override ConstructorHandling ConstructorHandling + { + get { return _serializer.ConstructorHandling; } + set { _serializer.ConstructorHandling = value; } + } + + public override SerializationBinder Binder + { + get { return _serializer.Binder; } + set { _serializer.Binder = value; } + } + + public override StreamingContext Context + { + get { return _serializer.Context; } + set { _serializer.Context = value; } + } + + public override Formatting Formatting + { + get { return _serializer.Formatting; } + set { _serializer.Formatting = value; } + } + + public override DateFormatHandling DateFormatHandling + { + get { return _serializer.DateFormatHandling; } + set { _serializer.DateFormatHandling = value; } + } + + public override DateTimeZoneHandling DateTimeZoneHandling + { + get { return _serializer.DateTimeZoneHandling; } + set { _serializer.DateTimeZoneHandling = value; } + } + + public override DateParseHandling DateParseHandling + { + get { return _serializer.DateParseHandling; } + set { _serializer.DateParseHandling = value; } + } + + public override FloatFormatHandling FloatFormatHandling + { + get { return _serializer.FloatFormatHandling; } + set { _serializer.FloatFormatHandling = value; } + } + + public override FloatParseHandling FloatParseHandling + { + get { return _serializer.FloatParseHandling; } + set { _serializer.FloatParseHandling = value; } + } + + public override StringEscapeHandling StringEscapeHandling + { + get { return _serializer.StringEscapeHandling; } + set { _serializer.StringEscapeHandling = value; } + } + + public override string DateFormatString + { + get { return _serializer.DateFormatString; } + set { _serializer.DateFormatString = value; } + } + + public override CultureInfo Culture + { + get { return _serializer.Culture; } + set { _serializer.Culture = value; } + } + + public override int? MaxDepth + { + get { return _serializer.MaxDepth; } + set { _serializer.MaxDepth = value; } + } + + public override bool CheckAdditionalContent + { + get { return _serializer.CheckAdditionalContent; } + set { _serializer.CheckAdditionalContent = value; } + } + + internal JsonSerializerInternalBase GetInternalSerializer() + { + if (_serializerReader != null) + { + return _serializerReader; + } + else + { + return _serializerWriter; + } + } + + public JsonSerializerProxy(JsonSerializerInternalReader serializerReader) + { + ValidationUtils.ArgumentNotNull(serializerReader, nameof(serializerReader)); + + _serializerReader = serializerReader; + _serializer = serializerReader.Serializer; + } + + public JsonSerializerProxy(JsonSerializerInternalWriter serializerWriter) + { + ValidationUtils.ArgumentNotNull(serializerWriter, nameof(serializerWriter)); + + _serializerWriter = serializerWriter; + _serializer = serializerWriter.Serializer; + } + + internal override object DeserializeInternal(JsonReader reader, Type objectType) + { + if (_serializerReader != null) + { + return _serializerReader.Deserialize(reader, objectType, false); + } + else + { + return _serializer.Deserialize(reader, objectType); + } + } + + internal override void PopulateInternal(JsonReader reader, object target) + { + if (_serializerReader != null) + { + _serializerReader.Populate(reader, target); + } + else + { + _serializer.Populate(reader, target); + } + } + + internal override void SerializeInternal(JsonWriter jsonWriter, object value, Type rootType) + { + if (_serializerWriter != null) + { + _serializerWriter.Serialize(jsonWriter, value, rootType); + } + else + { + _serializer.Serialize(jsonWriter, value); + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/JsonStringContract.cs b/Common/00-1Json8.3/Json8.3/Serialization/JsonStringContract.cs new file mode 100644 index 0000000..be096bc --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/JsonStringContract.cs @@ -0,0 +1,45 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Contract details for a used by the . + /// + public class JsonStringContract : JsonPrimitiveContract + { + /// + /// Initializes a new instance of the class. + /// + /// The underlying type for the contract. + public JsonStringContract(Type underlyingType) + : base(underlyingType) + { + ContractType = JsonContractType.String; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/JsonTypeReflector.cs b/Common/00-1Json8.3/Json8.3/Serialization/JsonTypeReflector.cs new file mode 100644 index 0000000..0744b94 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/JsonTypeReflector.cs @@ -0,0 +1,461 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Globalization; +using System.Reflection; +using System.Security; +#if !(DOTNET || PORTABLE || PORTABLE40) +using System.Security.Permissions; +#endif +using Newtonsoft.Json.Utilities; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; +#endif +using System.Runtime.Serialization; + +namespace Newtonsoft.Json.Serialization +{ + internal static class JsonTypeReflector + { + private static bool? _dynamicCodeGeneration; + private static bool? _fullyTrusted; + + public const string IdPropertyName = "$id"; + public const string RefPropertyName = "$ref"; + public const string TypePropertyName = "$type"; + public const string ValuePropertyName = "$value"; + public const string ArrayValuesPropertyName = "$values"; + + public const string ShouldSerializePrefix = "ShouldSerialize"; + public const string SpecifiedPostfix = "Specified"; + + private static readonly ThreadSafeStore> JsonConverterCreatorCache = + new ThreadSafeStore>(GetJsonConverterCreator); + +#if !(NET20 || DOTNET) + private static readonly ThreadSafeStore AssociatedMetadataTypesCache = new ThreadSafeStore(GetAssociateMetadataTypeFromAttribute); + private static ReflectionObject _metadataTypeAttributeReflectionObject; +#endif + + public static T GetCachedAttribute(object attributeProvider) where T : Attribute + { + return CachedAttributeGetter.GetAttribute(attributeProvider); + } + +#if !NET20 + public static DataContractAttribute GetDataContractAttribute(Type type) + { + // DataContractAttribute does not have inheritance + Type currentType = type; + + while (currentType != null) + { + DataContractAttribute result = CachedAttributeGetter.GetAttribute(currentType); + if (result != null) + { + return result; + } + + currentType = currentType.BaseType(); + } + + return null; + } + + public static DataMemberAttribute GetDataMemberAttribute(MemberInfo memberInfo) + { + // DataMemberAttribute does not have inheritance + + // can't override a field + if (memberInfo.MemberType() == MemberTypes.Field) + { + return CachedAttributeGetter.GetAttribute(memberInfo); + } + + // search property and then search base properties if nothing is returned and the property is virtual + PropertyInfo propertyInfo = (PropertyInfo)memberInfo; + DataMemberAttribute result = CachedAttributeGetter.GetAttribute(propertyInfo); + if (result == null) + { + if (propertyInfo.IsVirtual()) + { + Type currentType = propertyInfo.DeclaringType; + + while (result == null && currentType != null) + { + PropertyInfo baseProperty = (PropertyInfo)ReflectionUtils.GetMemberInfoFromType(currentType, propertyInfo); + if (baseProperty != null && baseProperty.IsVirtual()) + { + result = CachedAttributeGetter.GetAttribute(baseProperty); + } + + currentType = currentType.BaseType(); + } + } + } + + return result; + } +#endif + + public static MemberSerialization GetObjectMemberSerialization(Type objectType, bool ignoreSerializableAttribute) + { + JsonObjectAttribute objectAttribute = GetCachedAttribute(objectType); + if (objectAttribute != null) + { + return objectAttribute.MemberSerialization; + } + +#if !NET20 + DataContractAttribute dataContractAttribute = GetDataContractAttribute(objectType); + if (dataContractAttribute != null) + { + return MemberSerialization.OptIn; + } +#endif + +#if !(DOTNET || PORTABLE40 || PORTABLE) + if (!ignoreSerializableAttribute) + { + SerializableAttribute serializableAttribute = GetCachedAttribute(objectType); + if (serializableAttribute != null) + { + return MemberSerialization.Fields; + } + } +#endif + + // the default + return MemberSerialization.OptOut; + } + + public static JsonConverter GetJsonConverter(object attributeProvider) + { + JsonConverterAttribute converterAttribute = GetCachedAttribute(attributeProvider); + + if (converterAttribute != null) + { + Func creator = JsonConverterCreatorCache.Get(converterAttribute.ConverterType); + if (creator != null) + { + return creator(converterAttribute.ConverterParameters); + } + } + + return null; + } + + /// + /// Lookup and create an instance of the JsonConverter type described by the argument. + /// + /// The JsonConverter type to create. + /// Optional arguments to pass to an initializing constructor of the JsonConverter. + /// If null, the default constructor is used. + public static JsonConverter CreateJsonConverterInstance(Type converterType, object[] converterArgs) + { + Func converterCreator = JsonConverterCreatorCache.Get(converterType); + return converterCreator(converterArgs); + } + + /// + /// Create a factory function that can be used to create instances of a JsonConverter described by the + /// argument type. The returned function can then be used to either invoke the converter's default ctor, or any + /// parameterized constructors by way of an object array. + /// + private static Func GetJsonConverterCreator(Type converterType) + { + Func defaultConstructor = (ReflectionUtils.HasDefaultConstructor(converterType, false)) + ? ReflectionDelegateFactory.CreateDefaultConstructor(converterType) + : null; + + return (parameters) => + { + try + { + if (parameters != null) + { + ObjectConstructor parameterizedConstructor = null; + Type[] paramTypes = parameters.Select(param => param.GetType()).ToArray(); + ConstructorInfo parameterizedConstructorInfo = converterType.GetConstructor(paramTypes); + + if (null != parameterizedConstructorInfo) + { + parameterizedConstructor = ReflectionDelegateFactory.CreateParameterizedConstructor(parameterizedConstructorInfo); + return (JsonConverter)parameterizedConstructor(parameters); + } + else + { + throw new JsonException("No matching parameterized constructor found for '{0}'.".FormatWith(CultureInfo.InvariantCulture, converterType)); + } + } + + if (defaultConstructor == null) + { + throw new JsonException("No parameterless constructor defined for '{0}'.".FormatWith(CultureInfo.InvariantCulture, converterType)); + } + + return (JsonConverter)defaultConstructor(); + } + catch (Exception ex) + { + throw new JsonException("Error creating '{0}'.".FormatWith(CultureInfo.InvariantCulture, converterType), ex); + } + }; + } + +#if !(PORTABLE40 || PORTABLE) + public static TypeConverter GetTypeConverter(Type type) + { + return TypeDescriptor.GetConverter(type); + } +#endif + +#if !(NET20 || DOTNET) + private static Type GetAssociatedMetadataType(Type type) + { + return AssociatedMetadataTypesCache.Get(type); + } + + private static Type GetAssociateMetadataTypeFromAttribute(Type type) + { + Attribute[] customAttributes = ReflectionUtils.GetAttributes(type, null, true); + + foreach (Attribute attribute in customAttributes) + { + Type attributeType = attribute.GetType(); + + // only test on attribute type name + // attribute assembly could change because of type forwarding, etc + if (string.Equals(attributeType.FullName, "System.ComponentModel.DataAnnotations.MetadataTypeAttribute", StringComparison.Ordinal)) + { + const string metadataClassTypeName = "MetadataClassType"; + + if (_metadataTypeAttributeReflectionObject == null) + { + _metadataTypeAttributeReflectionObject = ReflectionObject.Create(attributeType, metadataClassTypeName); + } + + return (Type)_metadataTypeAttributeReflectionObject.GetValue(attribute, metadataClassTypeName); + } + } + + return null; + } +#endif + + private static T GetAttribute(Type type) where T : Attribute + { + T attribute; + +#if !(NET20 || DOTNET) + Type metadataType = GetAssociatedMetadataType(type); + if (metadataType != null) + { + attribute = ReflectionUtils.GetAttribute(metadataType, true); + if (attribute != null) + { + return attribute; + } + } +#endif + + attribute = ReflectionUtils.GetAttribute(type, true); + if (attribute != null) + { + return attribute; + } + + foreach (Type typeInterface in type.GetInterfaces()) + { + attribute = ReflectionUtils.GetAttribute(typeInterface, true); + if (attribute != null) + { + return attribute; + } + } + + return null; + } + + private static T GetAttribute(MemberInfo memberInfo) where T : Attribute + { + T attribute; + +#if !(NET20 || DOTNET) + Type metadataType = GetAssociatedMetadataType(memberInfo.DeclaringType); + if (metadataType != null) + { + MemberInfo metadataTypeMemberInfo = ReflectionUtils.GetMemberInfoFromType(metadataType, memberInfo); + + if (metadataTypeMemberInfo != null) + { + attribute = ReflectionUtils.GetAttribute(metadataTypeMemberInfo, true); + if (attribute != null) + { + return attribute; + } + } + } +#endif + + attribute = ReflectionUtils.GetAttribute(memberInfo, true); + if (attribute != null) + { + return attribute; + } + + if (memberInfo.DeclaringType != null) + { + foreach (Type typeInterface in memberInfo.DeclaringType.GetInterfaces()) + { + MemberInfo interfaceTypeMemberInfo = ReflectionUtils.GetMemberInfoFromType(typeInterface, memberInfo); + + if (interfaceTypeMemberInfo != null) + { + attribute = ReflectionUtils.GetAttribute(interfaceTypeMemberInfo, true); + if (attribute != null) + { + return attribute; + } + } + } + } + + return null; + } + + public static T GetAttribute(object provider) where T : Attribute + { + Type type = provider as Type; + if (type != null) + { + return GetAttribute(type); + } + + MemberInfo memberInfo = provider as MemberInfo; + if (memberInfo != null) + { + return GetAttribute(memberInfo); + } + + return ReflectionUtils.GetAttribute(provider, true); + } + +#if DEBUG + internal static void SetFullyTrusted(bool fullyTrusted) + { + _fullyTrusted = fullyTrusted; + } + + internal static void SetDynamicCodeGeneration(bool dynamicCodeGeneration) + { + _dynamicCodeGeneration = dynamicCodeGeneration; + } +#endif + + public static bool DynamicCodeGeneration + { +#if !(NET20 || NET35 || PORTABLE) + [SecuritySafeCritical] +#endif + get + { + if (_dynamicCodeGeneration == null) + { +#if !(DOTNET || PORTABLE40 || PORTABLE) + try + { + new ReflectionPermission(ReflectionPermissionFlag.MemberAccess).Demand(); + new ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess).Demand(); + new SecurityPermission(SecurityPermissionFlag.SkipVerification).Demand(); + new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand(); + new SecurityPermission(PermissionState.Unrestricted).Demand(); + _dynamicCodeGeneration = true; + } + catch (Exception) + { + _dynamicCodeGeneration = false; + } +#else + _dynamicCodeGeneration = false; +#endif + } + + return _dynamicCodeGeneration.GetValueOrDefault(); + } + } + + public static bool FullyTrusted + { + get + { + if (_fullyTrusted == null) + { +#if (DOTNET || PORTABLE || PORTABLE40) + _fullyTrusted = false; +#elif !(NET20 || NET35 || PORTABLE40) + AppDomain appDomain = AppDomain.CurrentDomain; + + _fullyTrusted = appDomain.IsHomogenous && appDomain.IsFullyTrusted; +#else + try + { + new SecurityPermission(PermissionState.Unrestricted).Demand(); + _fullyTrusted = true; + } + catch (Exception) + { + _fullyTrusted = false; + } +#endif + } + + return _fullyTrusted.GetValueOrDefault(); + } + } + + public static ReflectionDelegateFactory ReflectionDelegateFactory + { + get + { +#if !(PORTABLE40 || PORTABLE || DOTNET) + if (DynamicCodeGeneration) + { + return DynamicReflectionDelegateFactory.Instance; + } + + return LateBoundReflectionDelegateFactory.Instance; +#else + return ExpressionReflectionDelegateFactory.Instance; +#endif + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/MemoryTraceWriter.cs b/Common/00-1Json8.3/Json8.3/Serialization/MemoryTraceWriter.cs new file mode 100644 index 0000000..7581216 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/MemoryTraceWriter.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.Text; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Represents a trace writer that writes to memory. When the trace message limit is + /// reached then old trace messages will be removed as new messages are added. + /// + public class MemoryTraceWriter : ITraceWriter + { + private readonly Queue _traceMessages; + + /// + /// Gets the that will be used to filter the trace messages passed to the writer. + /// For example a filter level of Info will exclude Verbose messages and include Info, + /// Warning and Error messages. + /// + /// + /// The that will be used to filter the trace messages passed to the writer. + /// + public TraceLevel LevelFilter { get; set; } + + /// + /// Initializes a new instance of the class. + /// + public MemoryTraceWriter() + { + LevelFilter = TraceLevel.Verbose; + _traceMessages = new Queue(); + } + + /// + /// Writes the specified trace level, message and optional exception. + /// + /// The at which to write this trace. + /// The trace message. + /// The trace exception. This parameter is optional. + public void Trace(TraceLevel level, string message, Exception ex) + { + if (_traceMessages.Count >= 1000) + { + _traceMessages.Dequeue(); + } + + StringBuilder sb = new StringBuilder(); + sb.Append(DateTime.Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff", CultureInfo.InvariantCulture)); + sb.Append(" "); + sb.Append(level.ToString("g")); + sb.Append(" "); + sb.Append(message); + + _traceMessages.Enqueue(sb.ToString()); + } + + /// + /// Returns an enumeration of the most recent trace messages. + /// + /// An enumeration of the most recent trace messages. + public IEnumerable GetTraceMessages() + { + return _traceMessages; + } + + /// + /// Returns a of the most recent trace messages. + /// + /// + /// A of the most recent trace messages. + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + foreach (string traceMessage in _traceMessages) + { + if (sb.Length > 0) + { + sb.AppendLine(); + } + + sb.Append(traceMessage); + } + + return sb.ToString(); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/ObjectConstructor.cs b/Common/00-1Json8.3/Json8.3/Serialization/ObjectConstructor.cs new file mode 100644 index 0000000..380674f --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/ObjectConstructor.cs @@ -0,0 +1,33 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Represents a method that constructs an object. + /// + /// The object type to create. + public delegate object ObjectConstructor(params object[] args); +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/OnErrorAttribute.cs b/Common/00-1Json8.3/Json8.3/Serialization/OnErrorAttribute.cs new file mode 100644 index 0000000..cb33296 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/OnErrorAttribute.cs @@ -0,0 +1,37 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// When applied to a method, specifies that the method is called when an error occurs serializing an object. + /// + [AttributeUsage(AttributeTargets.Method, Inherited = false)] + public sealed class OnErrorAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/ReflectionAttributeProvider.cs b/Common/00-1Json8.3/Json8.3/Serialization/ReflectionAttributeProvider.cs new file mode 100644 index 0000000..5e9bc4e --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/ReflectionAttributeProvider.cs @@ -0,0 +1,71 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Reflection; +using Newtonsoft.Json.Utilities; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Provides methods to get attributes from a , , or . + /// + public class ReflectionAttributeProvider : IAttributeProvider + { + private readonly object _attributeProvider; + + /// + /// Initializes a new instance of the class. + /// + /// The instance to get attributes for. This parameter should be a , , or . + public ReflectionAttributeProvider(object attributeProvider) + { + ValidationUtils.ArgumentNotNull(attributeProvider, nameof(attributeProvider)); + _attributeProvider = attributeProvider; + } + + /// + /// Returns a collection of all of the attributes, or an empty collection if there are no attributes. + /// + /// When true, look up the hierarchy chain for the inherited custom attribute. + /// A collection of s, or an empty collection. + public IList GetAttributes(bool inherit) + { + return ReflectionUtils.GetAttributes(_attributeProvider, null, inherit); + } + + /// + /// Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + /// + /// The type of the attributes. + /// When true, look up the hierarchy chain for the inherited custom attribute. + /// A collection of s, or an empty collection. + public IList GetAttributes(Type attributeType, bool inherit) + { + return ReflectionUtils.GetAttributes(_attributeProvider, attributeType, inherit); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/ReflectionValueProvider.cs b/Common/00-1Json8.3/Json8.3/Serialization/ReflectionValueProvider.cs new file mode 100644 index 0000000..93af29e --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/ReflectionValueProvider.cs @@ -0,0 +1,84 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Reflection; +using Newtonsoft.Json.Utilities; +using System.Globalization; + +namespace Newtonsoft.Json.Serialization +{ + /// + /// Get and set values for a using reflection. + /// + public class ReflectionValueProvider : IValueProvider + { + private readonly MemberInfo _memberInfo; + + /// + /// Initializes a new instance of the class. + /// + /// The member info. + public ReflectionValueProvider(MemberInfo memberInfo) + { + ValidationUtils.ArgumentNotNull(memberInfo, nameof(memberInfo)); + _memberInfo = memberInfo; + } + + /// + /// Sets the value. + /// + /// The target to set the value on. + /// The value to set on the target. + public void SetValue(object target, object value) + { + try + { + ReflectionUtils.SetMemberValue(_memberInfo, target, value); + } + catch (Exception ex) + { + throw new JsonSerializationException("Error setting value to '{0}' on '{1}'.".FormatWith(CultureInfo.InvariantCulture, _memberInfo.Name, target.GetType()), ex); + } + } + + /// + /// Gets the value. + /// + /// The target to get the value from. + /// The value. + public object GetValue(object target) + { + try + { + return ReflectionUtils.GetMemberValue(_memberInfo, target); + } + catch (Exception ex) + { + throw new JsonSerializationException("Error getting value from '{0}' on '{1}'.".FormatWith(CultureInfo.InvariantCulture, _memberInfo.Name, target.GetType()), ex); + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/TraceJsonReader.cs b/Common/00-1Json8.3/Json8.3/Serialization/TraceJsonReader.cs new file mode 100644 index 0000000..78b389e --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/TraceJsonReader.cs @@ -0,0 +1,157 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; + +namespace Newtonsoft.Json.Serialization +{ + internal class TraceJsonReader : JsonReader, IJsonLineInfo + { + private readonly JsonReader _innerReader; + private readonly JsonTextWriter _textWriter; + private readonly StringWriter _sw; + + public TraceJsonReader(JsonReader innerReader) + { + _innerReader = innerReader; + + _sw = new StringWriter(CultureInfo.InvariantCulture); + // prefix the message in the stringwriter to avoid concat with a potentially large JSON string + _sw.Write("Deserialized JSON: " + Environment.NewLine); + + _textWriter = new JsonTextWriter(_sw); + _textWriter.Formatting = Formatting.Indented; + } + + public string GetDeserializedJsonMessage() + { + return _sw.ToString(); + } + + public override bool Read() + { + var value = _innerReader.Read(); + _textWriter.WriteToken(_innerReader, false, false, true); + return value; + } + + public override int? ReadAsInt32() + { + var value = _innerReader.ReadAsInt32(); + _textWriter.WriteToken(_innerReader, false, false, true); + return value; + } + + public override string ReadAsString() + { + var value = _innerReader.ReadAsString(); + _textWriter.WriteToken(_innerReader, false, false, true); + return value; + } + + public override byte[] ReadAsBytes() + { + var value = _innerReader.ReadAsBytes(); + _textWriter.WriteToken(_innerReader, false, false, true); + return value; + } + + public override decimal? ReadAsDecimal() + { + var value = _innerReader.ReadAsDecimal(); + _textWriter.WriteToken(_innerReader, false, false, true); + return value; + } + + public override double? ReadAsDouble() + { + var value = _innerReader.ReadAsDouble(); + _textWriter.WriteToken(_innerReader, false, false, true); + return value; + } + + public override bool? ReadAsBoolean() + { + var value = _innerReader.ReadAsBoolean(); + _textWriter.WriteToken(_innerReader, false, false, true); + return value; + } + + public override DateTime? ReadAsDateTime() + { + var value = _innerReader.ReadAsDateTime(); + _textWriter.WriteToken(_innerReader, false, false, true); + return value; + } + +#if !NET20 + public override DateTimeOffset? ReadAsDateTimeOffset() + { + var value = _innerReader.ReadAsDateTimeOffset(); + _textWriter.WriteToken(_innerReader, false, false, true); + return value; + } +#endif + + public override int Depth + { + get { return _innerReader.Depth; } + } + + public override string Path + { + get { return _innerReader.Path; } + } + + public override char QuoteChar + { + get { return _innerReader.QuoteChar; } + protected internal set { _innerReader.QuoteChar = value; } + } + + public override JsonToken TokenType + { + get { return _innerReader.TokenType; } + } + + public override object Value + { + get { return _innerReader.Value; } + } + + public override Type ValueType + { + get { return _innerReader.ValueType; } + } + + public override void Close() + { + _innerReader.Close(); + } + + bool IJsonLineInfo.HasLineInfo() + { + IJsonLineInfo lineInfo = _innerReader as IJsonLineInfo; + return lineInfo != null && lineInfo.HasLineInfo(); + } + + int IJsonLineInfo.LineNumber + { + get + { + IJsonLineInfo lineInfo = _innerReader as IJsonLineInfo; + return (lineInfo != null) ? lineInfo.LineNumber : 0; + } + } + + int IJsonLineInfo.LinePosition + { + get + { + IJsonLineInfo lineInfo = _innerReader as IJsonLineInfo; + return (lineInfo != null) ? lineInfo.LinePosition : 0; + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Serialization/TraceJsonWriter.cs b/Common/00-1Json8.3/Json8.3/Serialization/TraceJsonWriter.cs new file mode 100644 index 0000000..0d38434 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Serialization/TraceJsonWriter.cs @@ -0,0 +1,322 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +#if !(NET20 || NET35 || PORTABLE || PORTABLE40) +using System.Numerics; +#endif +using System.Text; + +namespace Newtonsoft.Json.Serialization +{ + internal class TraceJsonWriter : JsonWriter + { + private readonly JsonWriter _innerWriter; + private readonly JsonTextWriter _textWriter; + private readonly StringWriter _sw; + + public TraceJsonWriter(JsonWriter innerWriter) + { + _innerWriter = innerWriter; + + _sw = new StringWriter(CultureInfo.InvariantCulture); + // prefix the message in the stringwriter to avoid concat with a potentially large JSON string + _sw.Write("Serialized JSON: " + Environment.NewLine); + + _textWriter = new JsonTextWriter(_sw); + _textWriter.Formatting = Formatting.Indented; + _textWriter.Culture = innerWriter.Culture; + _textWriter.DateFormatHandling = innerWriter.DateFormatHandling; + _textWriter.DateFormatString = innerWriter.DateFormatString; + _textWriter.DateTimeZoneHandling = innerWriter.DateTimeZoneHandling; + _textWriter.FloatFormatHandling = innerWriter.FloatFormatHandling; + } + + public string GetSerializedJsonMessage() + { + return _sw.ToString(); + } + + public override void WriteValue(decimal value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteValue(bool value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteValue(byte value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteValue(byte? value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteValue(char value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteValue(byte[] value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteValue(DateTime value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + +#if !NET20 + public override void WriteValue(DateTimeOffset value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } +#endif + + public override void WriteValue(double value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteUndefined() + { + _textWriter.WriteUndefined(); + _innerWriter.WriteUndefined(); + base.WriteUndefined(); + } + + public override void WriteNull() + { + _textWriter.WriteNull(); + _innerWriter.WriteNull(); + base.WriteUndefined(); + } + + public override void WriteValue(float value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteValue(Guid value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteValue(int value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteValue(long value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteValue(object value) + { +#if !(NET20 || NET35 || PORTABLE || PORTABLE40) + if (value is BigInteger) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + InternalWriteValue(JsonToken.Integer); + } + else +#endif + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + } + + public override void WriteValue(sbyte value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteValue(short value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteValue(string value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteValue(TimeSpan value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteValue(uint value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteValue(ulong value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteValue(Uri value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteValue(ushort value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + base.WriteValue(value); + } + + public override void WriteWhitespace(string ws) + { + _textWriter.WriteWhitespace(ws); + _innerWriter.WriteWhitespace(ws); + base.WriteWhitespace(ws); + } + + public override void WriteComment(string text) + { + _textWriter.WriteComment(text); + _innerWriter.WriteComment(text); + base.WriteComment(text); + } + + public override void WriteStartArray() + { + _textWriter.WriteStartArray(); + _innerWriter.WriteStartArray(); + base.WriteStartArray(); + } + + public override void WriteEndArray() + { + _textWriter.WriteEndArray(); + _innerWriter.WriteEndArray(); + base.WriteEndArray(); + } + + public override void WriteStartConstructor(string name) + { + _textWriter.WriteStartConstructor(name); + _innerWriter.WriteStartConstructor(name); + base.WriteStartConstructor(name); + } + + public override void WriteEndConstructor() + { + _textWriter.WriteEndConstructor(); + _innerWriter.WriteEndConstructor(); + base.WriteEndConstructor(); + } + + public override void WritePropertyName(string name) + { + _textWriter.WritePropertyName(name); + _innerWriter.WritePropertyName(name); + base.WritePropertyName(name); + } + + public override void WritePropertyName(string name, bool escape) + { + _textWriter.WritePropertyName(name, escape); + _innerWriter.WritePropertyName(name, escape); + + // method with escape will error + base.WritePropertyName(name); + } + + public override void WriteStartObject() + { + _textWriter.WriteStartObject(); + _innerWriter.WriteStartObject(); + base.WriteStartObject(); + } + + public override void WriteEndObject() + { + _textWriter.WriteEndObject(); + _innerWriter.WriteEndObject(); + base.WriteEndObject(); + } + + public override void WriteRawValue(string json) + { + _textWriter.WriteRawValue(json); + _innerWriter.WriteRawValue(json); + + // calling base method will write json twice + InternalWriteValue(JsonToken.Undefined); + } + + public override void WriteRaw(string json) + { + _textWriter.WriteRaw(json); + _innerWriter.WriteRaw(json); + base.WriteRaw(json); + } + + public override void Close() + { + _textWriter.Close(); + _innerWriter.Close(); + base.Close(); + } + + public override void Flush() + { + _textWriter.Flush(); + _innerWriter.Flush(); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/StringEscapeHandling.cs b/Common/00-1Json8.3/Json8.3/StringEscapeHandling.cs new file mode 100644 index 0000000..4016eb6 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/StringEscapeHandling.cs @@ -0,0 +1,48 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +namespace Newtonsoft.Json +{ + /// + /// Specifies how strings are escaped when writing JSON text. + /// + public enum StringEscapeHandling + { + /// + /// Only control characters (e.g. newline) are escaped. + /// + Default = 0, + + /// + /// All non-ASCII and control characters (e.g. newline) are escaped. + /// + EscapeNonAscii = 1, + + /// + /// HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + /// + EscapeHtml = 2 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/TypeNameHandling.cs b/Common/00-1Json8.3/Json8.3/TypeNameHandling.cs new file mode 100644 index 0000000..9a5a8cf --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/TypeNameHandling.cs @@ -0,0 +1,67 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Runtime.Serialization; + +namespace Newtonsoft.Json +{ + /// + /// Specifies type name handling options for the . + /// + /// + /// should be used with caution when your application deserializes JSON from an external source. + /// Incoming types should be validated with a custom + /// when deserializing with a value other than TypeNameHandling.None. + /// + [Flags] + public enum TypeNameHandling + { + /// + /// Do not include the .NET type name when serializing types. + /// + None = 0, + + /// + /// Include the .NET type name when serializing into a JSON object structure. + /// + Objects = 1, + + /// + /// Include the .NET type name when serializing into a JSON array structure. + /// + Arrays = 2, + + /// + /// Always include the .NET type name when serializing. + /// + All = Objects | Arrays, + + /// + /// Include the .NET type name when the type of the object being serialized is not the same as its declared type. + /// + Auto = 4 + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/Base64Encoder.cs b/Common/00-1Json8.3/Json8.3/Utilities/Base64Encoder.cs new file mode 100644 index 0000000..8f298d1 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/Base64Encoder.cs @@ -0,0 +1,128 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.IO; + +namespace Newtonsoft.Json.Utilities +{ + internal class Base64Encoder + { + private const int Base64LineSize = 76; + private const int LineSizeInBytes = 57; + + private readonly char[] _charsLine = new char[Base64LineSize]; + private readonly TextWriter _writer; + + private byte[] _leftOverBytes; + private int _leftOverBytesCount; + + public Base64Encoder(TextWriter writer) + { + ValidationUtils.ArgumentNotNull(writer, nameof(writer)); + _writer = writer; + } + + public void Encode(byte[] buffer, int index, int count) + { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + + if (index < 0) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + if (count < 0) + { + throw new ArgumentOutOfRangeException(nameof(count)); + } + + if (count > (buffer.Length - index)) + { + throw new ArgumentOutOfRangeException(nameof(count)); + } + + if (_leftOverBytesCount > 0) + { + int leftOverBytesCount = _leftOverBytesCount; + while (leftOverBytesCount < 3 && count > 0) + { + _leftOverBytes[leftOverBytesCount++] = buffer[index++]; + count--; + } + if (count == 0 && leftOverBytesCount < 3) + { + _leftOverBytesCount = leftOverBytesCount; + return; + } + int num2 = Convert.ToBase64CharArray(_leftOverBytes, 0, 3, _charsLine, 0); + WriteChars(_charsLine, 0, num2); + } + _leftOverBytesCount = count % 3; + if (_leftOverBytesCount > 0) + { + count -= _leftOverBytesCount; + if (_leftOverBytes == null) + { + _leftOverBytes = new byte[3]; + } + for (int i = 0; i < _leftOverBytesCount; i++) + { + _leftOverBytes[i] = buffer[(index + count) + i]; + } + } + int num4 = index + count; + int length = LineSizeInBytes; + while (index < num4) + { + if ((index + length) > num4) + { + length = num4 - index; + } + int num6 = Convert.ToBase64CharArray(buffer, index, length, _charsLine, 0); + WriteChars(_charsLine, 0, num6); + index += length; + } + } + + public void Flush() + { + if (_leftOverBytesCount > 0) + { + int count = Convert.ToBase64CharArray(_leftOverBytes, 0, _leftOverBytesCount, _charsLine, 0); + WriteChars(_charsLine, 0, count); + _leftOverBytesCount = 0; + } + } + + private void WriteChars(char[] chars, int index, int count) + { + _writer.Write(chars, index, count); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/BidirectionalDictionary.cs b/Common/00-1Json8.3/Json8.3/Utilities/BidirectionalDictionary.cs new file mode 100644 index 0000000..b72d56c --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/BidirectionalDictionary.cs @@ -0,0 +1,97 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Globalization; + +namespace Newtonsoft.Json.Utilities +{ + internal class BidirectionalDictionary + { + private readonly IDictionary _firstToSecond; + private readonly IDictionary _secondToFirst; + private readonly string _duplicateFirstErrorMessage; + private readonly string _duplicateSecondErrorMessage; + + public BidirectionalDictionary() + : this(EqualityComparer.Default, EqualityComparer.Default) + { + } + + public BidirectionalDictionary(IEqualityComparer firstEqualityComparer, IEqualityComparer secondEqualityComparer) + : this( + firstEqualityComparer, + secondEqualityComparer, + "Duplicate item already exists for '{0}'.", + "Duplicate item already exists for '{0}'.") + { + } + + public BidirectionalDictionary(IEqualityComparer firstEqualityComparer, IEqualityComparer secondEqualityComparer, + string duplicateFirstErrorMessage, string duplicateSecondErrorMessage) + { + _firstToSecond = new Dictionary(firstEqualityComparer); + _secondToFirst = new Dictionary(secondEqualityComparer); + _duplicateFirstErrorMessage = duplicateFirstErrorMessage; + _duplicateSecondErrorMessage = duplicateSecondErrorMessage; + } + + public void Set(TFirst first, TSecond second) + { + TFirst existingFirst; + TSecond existingSecond; + + if (_firstToSecond.TryGetValue(first, out existingSecond)) + { + if (!existingSecond.Equals(second)) + { + throw new ArgumentException(_duplicateFirstErrorMessage.FormatWith(CultureInfo.InvariantCulture, first)); + } + } + + if (_secondToFirst.TryGetValue(second, out existingFirst)) + { + if (!existingFirst.Equals(first)) + { + throw new ArgumentException(_duplicateSecondErrorMessage.FormatWith(CultureInfo.InvariantCulture, second)); + } + } + + _firstToSecond.Add(first, second); + _secondToFirst.Add(second, first); + } + + public bool TryGetByFirst(TFirst first, out TSecond second) + { + return _firstToSecond.TryGetValue(first, out second); + } + + public bool TryGetBySecond(TSecond second, out TFirst first) + { + return _secondToFirst.TryGetValue(second, out first); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/CollectionUtils.cs b/Common/00-1Json8.3/Json8.3/Utilities/CollectionUtils.cs new file mode 100644 index 0000000..2074b34 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/CollectionUtils.cs @@ -0,0 +1,348 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Reflection; +using System.Text; +using System.Collections; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; +#endif +using System.Globalization; +using Newtonsoft.Json.Serialization; + +namespace Newtonsoft.Json.Utilities +{ + internal static class CollectionUtils + { + /// + /// Determines whether the collection is null or empty. + /// + /// The collection. + /// + /// true if the collection is null or empty; otherwise, false. + /// + public static bool IsNullOrEmpty(ICollection collection) + { + if (collection != null) + { + return (collection.Count == 0); + } + return true; + } + + /// + /// Adds the elements of the specified collection to the specified generic IList. + /// + /// The list to add to. + /// The collection of elements to add. + public static void AddRange(this IList initial, IEnumerable collection) + { + if (initial == null) + { + throw new ArgumentNullException(nameof(initial)); + } + + if (collection == null) + { + return; + } + + foreach (T value in collection) + { + initial.Add(value); + } + } + +#if (NET20 || NET35 || PORTABLE40) + public static void AddRange(this IList initial, IEnumerable collection) + { + ValidationUtils.ArgumentNotNull(initial, nameof(initial)); + + // because earlier versions of .NET didn't support covariant generics + initial.AddRange(collection.Cast()); + } +#endif + + public static bool IsDictionaryType(Type type) + { + ValidationUtils.ArgumentNotNull(type, nameof(type)); + + if (typeof(IDictionary).IsAssignableFrom(type)) + { + return true; + } + if (ReflectionUtils.ImplementsGenericDefinition(type, typeof(IDictionary<,>))) + { + return true; + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + if (ReflectionUtils.ImplementsGenericDefinition(type, typeof(IReadOnlyDictionary<,>))) + { + return true; + } +#endif + + return false; + } + + public static ConstructorInfo ResolveEnumerableCollectionConstructor(Type collectionType, Type collectionItemType) + { + Type genericEnumerable = typeof(IEnumerable<>).MakeGenericType(collectionItemType); + ConstructorInfo match = null; + + foreach (ConstructorInfo constructor in collectionType.GetConstructors(BindingFlags.Public | BindingFlags.Instance)) + { + IList parameters = constructor.GetParameters(); + + if (parameters.Count == 1) + { + if (genericEnumerable == parameters[0].ParameterType) + { + // exact match + match = constructor; + break; + } + + // incase we can't find an exact match, use first inexact + if (match == null) + { + if (genericEnumerable.IsAssignableFrom(parameters[0].ParameterType)) + { + match = constructor; + } + } + } + } + + return match; + } + + public static bool AddDistinct(this IList list, T value) + { + return list.AddDistinct(value, EqualityComparer.Default); + } + + public static bool AddDistinct(this IList list, T value, IEqualityComparer comparer) + { + if (list.ContainsValue(value, comparer)) + { + return false; + } + + list.Add(value); + return true; + } + + // this is here because LINQ Bridge doesn't support Contains with IEqualityComparer + public static bool ContainsValue(this IEnumerable source, TSource value, IEqualityComparer comparer) + { + if (comparer == null) + { + comparer = EqualityComparer.Default; + } + + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + foreach (TSource local in source) + { + if (comparer.Equals(local, value)) + { + return true; + } + } + + return false; + } + + public static bool AddRangeDistinct(this IList list, IEnumerable values, IEqualityComparer comparer) + { + bool allAdded = true; + foreach (T value in values) + { + if (!list.AddDistinct(value, comparer)) + { + allAdded = false; + } + } + + return allAdded; + } + + public static int IndexOf(this IEnumerable collection, Func predicate) + { + int index = 0; + foreach (T value in collection) + { + if (predicate(value)) + { + return index; + } + + index++; + } + + return -1; + } + + public static bool Contains(this IEnumerable list, object value, IEqualityComparer comparer) + { + foreach (object item in list) + { + if (comparer.Equals(item, value)) + { + return true; + } + } + return false; + } + + /// + /// Returns the index of the first occurrence in a sequence by using a specified IEqualityComparer{TSource}. + /// + /// The type of the elements of source. + /// A sequence in which to locate a value. + /// The object to locate in the sequence + /// An equality comparer to compare values. + /// The zero-based index of the first occurrence of value within the entire sequence, if found; otherwise, ?. + public static int IndexOf(this IEnumerable list, TSource value, IEqualityComparer comparer) + { + int index = 0; + foreach (TSource item in list) + { + if (comparer.Equals(item, value)) + { + return index; + } + index++; + } + return -1; + } + + private static IList GetDimensions(IList values, int dimensionsCount) + { + IList dimensions = new List(); + + IList currentArray = values; + while (true) + { + dimensions.Add(currentArray.Count); + + // don't keep calculating dimensions for arrays inside the value array + if (dimensions.Count == dimensionsCount) + { + break; + } + + if (currentArray.Count == 0) + { + break; + } + + object v = currentArray[0]; + if (v is IList) + { + currentArray = (IList)v; + } + else + { + break; + } + } + + return dimensions; + } + + private static void CopyFromJaggedToMultidimensionalArray(IList values, Array multidimensionalArray, int[] indices) + { + int dimension = indices.Length; + if (dimension == multidimensionalArray.Rank) + { + multidimensionalArray.SetValue(JaggedArrayGetValue(values, indices), indices); + return; + } + + int dimensionLength = multidimensionalArray.GetLength(dimension); + IList list = (IList)JaggedArrayGetValue(values, indices); + int currentValuesLength = list.Count; + if (currentValuesLength != dimensionLength) + { + throw new Exception("Cannot deserialize non-cubical array as multidimensional array."); + } + + int[] newIndices = new int[dimension + 1]; + for (int i = 0; i < dimension; i++) + { + newIndices[i] = indices[i]; + } + + for (int i = 0; i < multidimensionalArray.GetLength(dimension); i++) + { + newIndices[dimension] = i; + CopyFromJaggedToMultidimensionalArray(values, multidimensionalArray, newIndices); + } + } + + private static object JaggedArrayGetValue(IList values, int[] indices) + { + IList currentList = values; + for (int i = 0; i < indices.Length; i++) + { + int index = indices[i]; + if (i == indices.Length - 1) + { + return currentList[index]; + } + else + { + currentList = (IList)currentList[index]; + } + } + return currentList; + } + + public static Array ToMultidimensionalArray(IList values, Type type, int rank) + { + IList dimensions = GetDimensions(values, rank); + + while (dimensions.Count < rank) + { + dimensions.Add(0); + } + + Array multidimensionalArray = Array.CreateInstance(type, dimensions.ToArray()); + CopyFromJaggedToMultidimensionalArray(values, multidimensionalArray, new int[0]); + + return multidimensionalArray; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/CollectionWrapper.cs b/Common/00-1Json8.3/Json8.3/Utilities/CollectionWrapper.cs new file mode 100644 index 0000000..6afc9ac --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/CollectionWrapper.cs @@ -0,0 +1,348 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Threading; +using System.Globalization; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Utilities +{ + internal interface IWrappedCollection : IList + { + object UnderlyingCollection { get; } + } + + internal class CollectionWrapper : ICollection, IWrappedCollection + { + private readonly IList _list; + private readonly ICollection _genericCollection; + private object _syncRoot; + + public CollectionWrapper(IList list) + { + ValidationUtils.ArgumentNotNull(list, nameof(list)); + + if (list is ICollection) + { + _genericCollection = (ICollection)list; + } + else + { + _list = list; + } + } + + public CollectionWrapper(ICollection list) + { + ValidationUtils.ArgumentNotNull(list, nameof(list)); + + _genericCollection = list; + } + + public virtual void Add(T item) + { + if (_genericCollection != null) + { + _genericCollection.Add(item); + } + else + { + _list.Add(item); + } + } + + public virtual void Clear() + { + if (_genericCollection != null) + { + _genericCollection.Clear(); + } + else + { + _list.Clear(); + } + } + + public virtual bool Contains(T item) + { + if (_genericCollection != null) + { + return _genericCollection.Contains(item); + } + else + { + return _list.Contains(item); + } + } + + public virtual void CopyTo(T[] array, int arrayIndex) + { + if (_genericCollection != null) + { + _genericCollection.CopyTo(array, arrayIndex); + } + else + { + _list.CopyTo(array, arrayIndex); + } + } + + public virtual int Count + { + get + { + if (_genericCollection != null) + { + return _genericCollection.Count; + } + else + { + return _list.Count; + } + } + } + + public virtual bool IsReadOnly + { + get + { + if (_genericCollection != null) + { + return _genericCollection.IsReadOnly; + } + else + { + return _list.IsReadOnly; + } + } + } + + public virtual bool Remove(T item) + { + if (_genericCollection != null) + { + return _genericCollection.Remove(item); + } + else + { + bool contains = _list.Contains(item); + + if (contains) + { + _list.Remove(item); + } + + return contains; + } + } + + public virtual IEnumerator GetEnumerator() + { + if (_genericCollection != null) + { + return _genericCollection.GetEnumerator(); + } + + return _list.Cast().GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + if (_genericCollection != null) + { + return _genericCollection.GetEnumerator(); + } + else + { + return _list.GetEnumerator(); + } + } + + int IList.Add(object value) + { + VerifyValueType(value); + Add((T)value); + + return (Count - 1); + } + + bool IList.Contains(object value) + { + if (IsCompatibleObject(value)) + { + return Contains((T)value); + } + + return false; + } + + int IList.IndexOf(object value) + { + if (_genericCollection != null) + { + throw new InvalidOperationException("Wrapped ICollection does not support IndexOf."); + } + + if (IsCompatibleObject(value)) + { + return _list.IndexOf((T)value); + } + + return -1; + } + + void IList.RemoveAt(int index) + { + if (_genericCollection != null) + { + throw new InvalidOperationException("Wrapped ICollection does not support RemoveAt."); + } + + _list.RemoveAt(index); + } + + void IList.Insert(int index, object value) + { + if (_genericCollection != null) + { + throw new InvalidOperationException("Wrapped ICollection does not support Insert."); + } + + VerifyValueType(value); + _list.Insert(index, (T)value); + } + + bool IList.IsFixedSize + { + get + { + if (_genericCollection != null) + { + // ICollection only has IsReadOnly + return _genericCollection.IsReadOnly; + } + else + { + return _list.IsFixedSize; + } + } + } + + void IList.Remove(object value) + { + if (IsCompatibleObject(value)) + { + Remove((T)value); + } + } + + object IList.this[int index] + { + get + { + if (_genericCollection != null) + { + throw new InvalidOperationException("Wrapped ICollection does not support indexer."); + } + + return _list[index]; + } + set + { + if (_genericCollection != null) + { + throw new InvalidOperationException("Wrapped ICollection does not support indexer."); + } + + VerifyValueType(value); + _list[index] = (T)value; + } + } + + void ICollection.CopyTo(Array array, int arrayIndex) + { + CopyTo((T[])array, arrayIndex); + } + + bool ICollection.IsSynchronized + { + get { return false; } + } + + object ICollection.SyncRoot + { + get + { + if (_syncRoot == null) + { + Interlocked.CompareExchange(ref _syncRoot, new object(), null); + } + + return _syncRoot; + } + } + + private static void VerifyValueType(object value) + { + if (!IsCompatibleObject(value)) + { + throw new ArgumentException("The value '{0}' is not of type '{1}' and cannot be used in this generic collection.".FormatWith(CultureInfo.InvariantCulture, value, typeof(T)), nameof(value)); + } + } + + private static bool IsCompatibleObject(object value) + { + if (!(value is T) && (value != null || (typeof(T).IsValueType() && !ReflectionUtils.IsNullableType(typeof(T))))) + { + return false; + } + + return true; + } + + public object UnderlyingCollection + { + get + { + if (_genericCollection != null) + { + return _genericCollection; + } + else + { + return _list; + } + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/ConvertUtils.cs b/Common/00-1Json8.3/Json8.3/Utilities/ConvertUtils.cs new file mode 100644 index 0000000..227db86 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/ConvertUtils.cs @@ -0,0 +1,987 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.ComponentModel; +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) +using System.Numerics; +#endif +using System.Text; +using System.Text.RegularExpressions; +using Newtonsoft.Json.Serialization; +using System.Reflection; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#endif +#if !(DOTNET || PORTABLE40 || PORTABLE) +using System.Data.SqlTypes; + +#endif + +namespace Newtonsoft.Json.Utilities +{ + internal enum PrimitiveTypeCode + { + Empty = 0, + Object = 1, + Char = 2, + CharNullable = 3, + Boolean = 4, + BooleanNullable = 5, + SByte = 6, + SByteNullable = 7, + Int16 = 8, + Int16Nullable = 9, + UInt16 = 10, + UInt16Nullable = 11, + Int32 = 12, + Int32Nullable = 13, + Byte = 14, + ByteNullable = 15, + UInt32 = 16, + UInt32Nullable = 17, + Int64 = 18, + Int64Nullable = 19, + UInt64 = 20, + UInt64Nullable = 21, + Single = 22, + SingleNullable = 23, + Double = 24, + DoubleNullable = 25, + DateTime = 26, + DateTimeNullable = 27, + DateTimeOffset = 28, + DateTimeOffsetNullable = 29, + Decimal = 30, + DecimalNullable = 31, + Guid = 32, + GuidNullable = 33, + TimeSpan = 34, + TimeSpanNullable = 35, + BigInteger = 36, + BigIntegerNullable = 37, + Uri = 38, + String = 39, + Bytes = 40, + DBNull = 41 + } + + internal class TypeInformation + { + public Type Type { get; set; } + public PrimitiveTypeCode TypeCode { get; set; } + } + + internal enum ParseResult + { + None = 0, + Success = 1, + Overflow = 2, + Invalid = 3 + } + + internal static class ConvertUtils + { + private static readonly Dictionary TypeCodeMap = + new Dictionary + { + { typeof(char), PrimitiveTypeCode.Char }, + { typeof(char?), PrimitiveTypeCode.CharNullable }, + { typeof(bool), PrimitiveTypeCode.Boolean }, + { typeof(bool?), PrimitiveTypeCode.BooleanNullable }, + { typeof(sbyte), PrimitiveTypeCode.SByte }, + { typeof(sbyte?), PrimitiveTypeCode.SByteNullable }, + { typeof(short), PrimitiveTypeCode.Int16 }, + { typeof(short?), PrimitiveTypeCode.Int16Nullable }, + { typeof(ushort), PrimitiveTypeCode.UInt16 }, + { typeof(ushort?), PrimitiveTypeCode.UInt16Nullable }, + { typeof(int), PrimitiveTypeCode.Int32 }, + { typeof(int?), PrimitiveTypeCode.Int32Nullable }, + { typeof(byte), PrimitiveTypeCode.Byte }, + { typeof(byte?), PrimitiveTypeCode.ByteNullable }, + { typeof(uint), PrimitiveTypeCode.UInt32 }, + { typeof(uint?), PrimitiveTypeCode.UInt32Nullable }, + { typeof(long), PrimitiveTypeCode.Int64 }, + { typeof(long?), PrimitiveTypeCode.Int64Nullable }, + { typeof(ulong), PrimitiveTypeCode.UInt64 }, + { typeof(ulong?), PrimitiveTypeCode.UInt64Nullable }, + { typeof(float), PrimitiveTypeCode.Single }, + { typeof(float?), PrimitiveTypeCode.SingleNullable }, + { typeof(double), PrimitiveTypeCode.Double }, + { typeof(double?), PrimitiveTypeCode.DoubleNullable }, + { typeof(DateTime), PrimitiveTypeCode.DateTime }, + { typeof(DateTime?), PrimitiveTypeCode.DateTimeNullable }, +#if !NET20 + { typeof(DateTimeOffset), PrimitiveTypeCode.DateTimeOffset }, + { typeof(DateTimeOffset?), PrimitiveTypeCode.DateTimeOffsetNullable }, +#endif + { typeof(decimal), PrimitiveTypeCode.Decimal }, + { typeof(decimal?), PrimitiveTypeCode.DecimalNullable }, + { typeof(Guid), PrimitiveTypeCode.Guid }, + { typeof(Guid?), PrimitiveTypeCode.GuidNullable }, + { typeof(TimeSpan), PrimitiveTypeCode.TimeSpan }, + { typeof(TimeSpan?), PrimitiveTypeCode.TimeSpanNullable }, +#if !(PORTABLE || PORTABLE40 || NET35 || NET20) + { typeof(BigInteger), PrimitiveTypeCode.BigInteger }, + { typeof(BigInteger?), PrimitiveTypeCode.BigIntegerNullable }, +#endif + { typeof(Uri), PrimitiveTypeCode.Uri }, + { typeof(string), PrimitiveTypeCode.String }, + { typeof(byte[]), PrimitiveTypeCode.Bytes }, +#if !(PORTABLE || PORTABLE40 || DOTNET) + { typeof(DBNull), PrimitiveTypeCode.DBNull } +#endif + }; + +#if !PORTABLE + private static readonly TypeInformation[] PrimitiveTypeCodes = + { + // need all of these. lookup against the index with TypeCode value + new TypeInformation { Type = typeof(object), TypeCode = PrimitiveTypeCode.Empty }, + new TypeInformation { Type = typeof(object), TypeCode = PrimitiveTypeCode.Object }, + new TypeInformation { Type = typeof(object), TypeCode = PrimitiveTypeCode.DBNull }, + new TypeInformation { Type = typeof(bool), TypeCode = PrimitiveTypeCode.Boolean }, + new TypeInformation { Type = typeof(char), TypeCode = PrimitiveTypeCode.Char }, + new TypeInformation { Type = typeof(sbyte), TypeCode = PrimitiveTypeCode.SByte }, + new TypeInformation { Type = typeof(byte), TypeCode = PrimitiveTypeCode.Byte }, + new TypeInformation { Type = typeof(short), TypeCode = PrimitiveTypeCode.Int16 }, + new TypeInformation { Type = typeof(ushort), TypeCode = PrimitiveTypeCode.UInt16 }, + new TypeInformation { Type = typeof(int), TypeCode = PrimitiveTypeCode.Int32 }, + new TypeInformation { Type = typeof(uint), TypeCode = PrimitiveTypeCode.UInt32 }, + new TypeInformation { Type = typeof(long), TypeCode = PrimitiveTypeCode.Int64 }, + new TypeInformation { Type = typeof(ulong), TypeCode = PrimitiveTypeCode.UInt64 }, + new TypeInformation { Type = typeof(float), TypeCode = PrimitiveTypeCode.Single }, + new TypeInformation { Type = typeof(double), TypeCode = PrimitiveTypeCode.Double }, + new TypeInformation { Type = typeof(decimal), TypeCode = PrimitiveTypeCode.Decimal }, + new TypeInformation { Type = typeof(DateTime), TypeCode = PrimitiveTypeCode.DateTime }, + new TypeInformation { Type = typeof(object), TypeCode = PrimitiveTypeCode.Empty }, // no 17 in TypeCode for some reason + new TypeInformation { Type = typeof(string), TypeCode = PrimitiveTypeCode.String } + }; +#endif + + public static PrimitiveTypeCode GetTypeCode(Type t) + { + bool isEnum; + return GetTypeCode(t, out isEnum); + } + + public static PrimitiveTypeCode GetTypeCode(Type t, out bool isEnum) + { + PrimitiveTypeCode typeCode; + if (TypeCodeMap.TryGetValue(t, out typeCode)) + { + isEnum = false; + return typeCode; + } + + if (t.IsEnum()) + { + isEnum = true; + return GetTypeCode(Enum.GetUnderlyingType(t)); + } + + // performance? + if (ReflectionUtils.IsNullableType(t)) + { + Type nonNullable = Nullable.GetUnderlyingType(t); + if (nonNullable.IsEnum()) + { + Type nullableUnderlyingType = typeof(Nullable<>).MakeGenericType(Enum.GetUnderlyingType(nonNullable)); + isEnum = true; + return GetTypeCode(nullableUnderlyingType); + } + } + + isEnum = false; + return PrimitiveTypeCode.Object; + } + +#if !PORTABLE + public static TypeInformation GetTypeInformation(IConvertible convertable) + { + TypeInformation typeInformation = PrimitiveTypeCodes[(int)convertable.GetTypeCode()]; + return typeInformation; + } +#endif + + public static bool IsConvertible(Type t) + { +#if !PORTABLE + return typeof(IConvertible).IsAssignableFrom(t); +#else + return ( + t == typeof(bool) || t == typeof(byte) || t == typeof(char) || t == typeof(DateTime) || t == typeof(decimal) || t == typeof(double) || t == typeof(short) || t == typeof(int) || + t == typeof(long) || t == typeof(sbyte) || t == typeof(float) || t == typeof(string) || t == typeof(ushort) || t == typeof(uint) || t == typeof(ulong) || t.IsEnum()); +#endif + } + + public static TimeSpan ParseTimeSpan(string input) + { +#if !(NET35 || NET20) + return TimeSpan.Parse(input, CultureInfo.InvariantCulture); +#else + return TimeSpan.Parse(input); +#endif + } + + internal struct TypeConvertKey : IEquatable + { + private readonly Type _initialType; + private readonly Type _targetType; + + public Type InitialType + { + get { return _initialType; } + } + + public Type TargetType + { + get { return _targetType; } + } + + public TypeConvertKey(Type initialType, Type targetType) + { + _initialType = initialType; + _targetType = targetType; + } + + public override int GetHashCode() + { + return _initialType.GetHashCode() ^ _targetType.GetHashCode(); + } + + public override bool Equals(object obj) + { + if (!(obj is TypeConvertKey)) + { + return false; + } + + return Equals((TypeConvertKey)obj); + } + + public bool Equals(TypeConvertKey other) + { + return (_initialType == other._initialType && _targetType == other._targetType); + } + } + + private static readonly ThreadSafeStore> CastConverters = + new ThreadSafeStore>(CreateCastConverter); + + private static Func CreateCastConverter(TypeConvertKey t) + { + MethodInfo castMethodInfo = t.TargetType.GetMethod("op_Implicit", new[] { t.InitialType }); + if (castMethodInfo == null) + { + castMethodInfo = t.TargetType.GetMethod("op_Explicit", new[] { t.InitialType }); + } + + if (castMethodInfo == null) + { + return null; + } + + MethodCall call = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall(castMethodInfo); + + return o => call(null, o); + } + +#if !(NET20 || NET35 || PORTABLE || PORTABLE40) + internal static BigInteger ToBigInteger(object value) + { + if (value is BigInteger) + { + return (BigInteger)value; + } + if (value is string) + { + return BigInteger.Parse((string)value, CultureInfo.InvariantCulture); + } + if (value is float) + { + return new BigInteger((float)value); + } + if (value is double) + { + return new BigInteger((double)value); + } + if (value is decimal) + { + return new BigInteger((decimal)value); + } + if (value is int) + { + return new BigInteger((int)value); + } + if (value is long) + { + return new BigInteger((long)value); + } + if (value is uint) + { + return new BigInteger((uint)value); + } + if (value is ulong) + { + return new BigInteger((ulong)value); + } + if (value is byte[]) + { + return new BigInteger((byte[])value); + } + + throw new InvalidCastException("Cannot convert {0} to BigInteger.".FormatWith(CultureInfo.InvariantCulture, value.GetType())); + } + + public static object FromBigInteger(BigInteger i, Type targetType) + { + if (targetType == typeof(decimal)) + { + return (decimal)i; + } + if (targetType == typeof(double)) + { + return (double)i; + } + if (targetType == typeof(float)) + { + return (float)i; + } + if (targetType == typeof(ulong)) + { + return (ulong)i; + } + if (targetType == typeof(bool)) + { + return i != 0; + } + + try + { + return System.Convert.ChangeType((long)i, targetType, CultureInfo.InvariantCulture); + } + catch (Exception ex) + { + throw new InvalidOperationException("Can not convert from BigInteger to {0}.".FormatWith(CultureInfo.InvariantCulture, targetType), ex); + } + } +#endif + + #region TryConvert + internal enum ConvertResult + { + Success = 0, + CannotConvertNull = 1, + NotInstantiableType = 2, + NoValidConversion = 3 + } + + public static object Convert(object initialValue, CultureInfo culture, Type targetType) + { + object value; + switch (TryConvertInternal(initialValue, culture, targetType, out value)) + { + case ConvertResult.Success: + return value; + case ConvertResult.CannotConvertNull: + throw new Exception("Can not convert null {0} into non-nullable {1}.".FormatWith(CultureInfo.InvariantCulture, initialValue.GetType(), targetType)); + case ConvertResult.NotInstantiableType: + throw new ArgumentException("Target type {0} is not a value type or a non-abstract class.".FormatWith(CultureInfo.InvariantCulture, targetType), nameof(targetType)); + case ConvertResult.NoValidConversion: + throw new InvalidOperationException("Can not convert from {0} to {1}.".FormatWith(CultureInfo.InvariantCulture, initialValue.GetType(), targetType)); + default: + throw new InvalidOperationException("Unexpected conversion result."); + } + } + + private static bool TryConvert(object initialValue, CultureInfo culture, Type targetType, out object value) + { + try + { + if (TryConvertInternal(initialValue, culture, targetType, out value) == ConvertResult.Success) + { + return true; + } + + value = null; + return false; + } + catch + { + value = null; + return false; + } + } + + private static ConvertResult TryConvertInternal(object initialValue, CultureInfo culture, Type targetType, out object value) + { + if (initialValue == null) + { + throw new ArgumentNullException(nameof(initialValue)); + } + + if (ReflectionUtils.IsNullableType(targetType)) + { + targetType = Nullable.GetUnderlyingType(targetType); + } + + Type initialType = initialValue.GetType(); + + if (targetType == initialType) + { + value = initialValue; + return ConvertResult.Success; + } + + // use Convert.ChangeType if both types are IConvertible + if (ConvertUtils.IsConvertible(initialValue.GetType()) && ConvertUtils.IsConvertible(targetType)) + { + if (targetType.IsEnum()) + { + if (initialValue is string) + { + value = Enum.Parse(targetType, initialValue.ToString(), true); + return ConvertResult.Success; + } + else if (IsInteger(initialValue)) + { + value = Enum.ToObject(targetType, initialValue); + return ConvertResult.Success; + } + } + + value = System.Convert.ChangeType(initialValue, targetType, culture); + return ConvertResult.Success; + } + +#if !NET20 + if (initialValue is DateTime && targetType == typeof(DateTimeOffset)) + { + value = new DateTimeOffset((DateTime)initialValue); + return ConvertResult.Success; + } +#endif + + if (initialValue is byte[] && targetType == typeof(Guid)) + { + value = new Guid((byte[])initialValue); + return ConvertResult.Success; + } + + if (initialValue is Guid && targetType == typeof(byte[])) + { + value = ((Guid)initialValue).ToByteArray(); + return ConvertResult.Success; + } + + string s = initialValue as string; + if (s != null) + { + if (targetType == typeof(Guid)) + { + value = new Guid(s); + return ConvertResult.Success; + } + if (targetType == typeof(Uri)) + { + value = new Uri(s, UriKind.RelativeOrAbsolute); + return ConvertResult.Success; + } + if (targetType == typeof(TimeSpan)) + { + value = ParseTimeSpan(s); + return ConvertResult.Success; + } + if (targetType == typeof(byte[])) + { + value = System.Convert.FromBase64String(s); + return ConvertResult.Success; + } + if (targetType == typeof(Version)) + { + Version result; + if (VersionTryParse(s, out result)) + { + value = result; + return ConvertResult.Success; + } + value = null; + return ConvertResult.NoValidConversion; + } + if (typeof(Type).IsAssignableFrom(targetType)) + { + value = Type.GetType(s, true); + return ConvertResult.Success; + } + } + +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (targetType == typeof(BigInteger)) + { + value = ToBigInteger(initialValue); + return ConvertResult.Success; + } + if (initialValue is BigInteger) + { + value = FromBigInteger((BigInteger)initialValue, targetType); + return ConvertResult.Success; + } +#endif + +#if !(PORTABLE40 || PORTABLE) + // see if source or target types have a TypeConverter that converts between the two + TypeConverter toConverter = GetConverter(initialType); + + if (toConverter != null && toConverter.CanConvertTo(targetType)) + { + value = toConverter.ConvertTo(null, culture, initialValue, targetType); + return ConvertResult.Success; + } + + TypeConverter fromConverter = GetConverter(targetType); + + if (fromConverter != null && fromConverter.CanConvertFrom(initialType)) + { + value = fromConverter.ConvertFrom(null, culture, initialValue); + return ConvertResult.Success; + } +#endif +#if !(DOTNET || PORTABLE40 || PORTABLE) + // handle DBNull and INullable + if (initialValue == DBNull.Value) + { + if (ReflectionUtils.IsNullable(targetType)) + { + value = EnsureTypeAssignable(null, initialType, targetType); + return ConvertResult.Success; + } + + // cannot convert null to non-nullable + value = null; + return ConvertResult.CannotConvertNull; + } +#endif +#if !(DOTNET || PORTABLE40 || PORTABLE) + if (initialValue is INullable) + { + value = EnsureTypeAssignable(ToValue((INullable)initialValue), initialType, targetType); + return ConvertResult.Success; + } +#endif + + if (targetType.IsInterface() || targetType.IsGenericTypeDefinition() || targetType.IsAbstract()) + { + value = null; + return ConvertResult.NotInstantiableType; + } + + value = null; + return ConvertResult.NoValidConversion; + } + #endregion + + #region ConvertOrCast + /// + /// Converts the value to the specified type. If the value is unable to be converted, the + /// value is checked whether it assignable to the specified type. + /// + /// The value to convert. + /// The culture to use when converting. + /// The type to convert or cast the value to. + /// + /// The converted type. If conversion was unsuccessful, the initial value + /// is returned if assignable to the target type. + /// + public static object ConvertOrCast(object initialValue, CultureInfo culture, Type targetType) + { + object convertedValue; + + if (targetType == typeof(object)) + { + return initialValue; + } + + if (initialValue == null && ReflectionUtils.IsNullable(targetType)) + { + return null; + } + + if (TryConvert(initialValue, culture, targetType, out convertedValue)) + { + return convertedValue; + } + + return EnsureTypeAssignable(initialValue, ReflectionUtils.GetObjectType(initialValue), targetType); + } + #endregion + + private static object EnsureTypeAssignable(object value, Type initialType, Type targetType) + { + Type valueType = (value != null) ? value.GetType() : null; + + if (value != null) + { + if (targetType.IsAssignableFrom(valueType)) + { + return value; + } + + Func castConverter = CastConverters.Get(new TypeConvertKey(valueType, targetType)); + if (castConverter != null) + { + return castConverter(value); + } + } + else + { + if (ReflectionUtils.IsNullable(targetType)) + { + return null; + } + } + + throw new ArgumentException("Could not cast or convert from {0} to {1}.".FormatWith(CultureInfo.InvariantCulture, (initialType != null) ? initialType.ToString() : "{null}", targetType)); + } + +#if !(DOTNET || PORTABLE40 || PORTABLE) + public static object ToValue(INullable nullableValue) + { + if (nullableValue == null) + { + return null; + } + else if (nullableValue is SqlInt32) + { + return ToValue((SqlInt32)nullableValue); + } + else if (nullableValue is SqlInt64) + { + return ToValue((SqlInt64)nullableValue); + } + else if (nullableValue is SqlBoolean) + { + return ToValue((SqlBoolean)nullableValue); + } + else if (nullableValue is SqlString) + { + return ToValue((SqlString)nullableValue); + } + else if (nullableValue is SqlDateTime) + { + return ToValue((SqlDateTime)nullableValue); + } + + throw new ArgumentException("Unsupported INullable type: {0}".FormatWith(CultureInfo.InvariantCulture, nullableValue.GetType())); + } +#endif + +#if !(PORTABLE40 || PORTABLE) + internal static TypeConverter GetConverter(Type t) + { + return JsonTypeReflector.GetTypeConverter(t); + } +#endif + + public static bool VersionTryParse(string input, out Version result) + { +#if !(NET20 || NET35) + return Version.TryParse(input, out result); +#else + // improve failure performance with regex? + try + { + result = new Version(input); + return true; + } + catch + { + result = null; + return false; + } +#endif + } + + public static bool IsInteger(object value) + { + switch (GetTypeCode(value.GetType())) + { + case PrimitiveTypeCode.SByte: + case PrimitiveTypeCode.Byte: + case PrimitiveTypeCode.Int16: + case PrimitiveTypeCode.UInt16: + case PrimitiveTypeCode.Int32: + case PrimitiveTypeCode.UInt32: + case PrimitiveTypeCode.Int64: + case PrimitiveTypeCode.UInt64: + return true; + default: + return false; + } + } + + public static ParseResult Int32TryParse(char[] chars, int start, int length, out int value) + { + value = 0; + + if (length == 0) + { + return ParseResult.Invalid; + } + + bool isNegative = (chars[start] == '-'); + + if (isNegative) + { + // text just a negative sign + if (length == 1) + { + return ParseResult.Invalid; + } + + start++; + length--; + } + + int end = start + length; + + // Int32.MaxValue and MinValue are 10 chars + // Or is 10 chars and start is greater than two + // Need to improve this! + if (length > 10 || (length == 10 && chars[start] - '0' > 2)) + { + // invalid result takes precedence over overflow + for (int i = start; i < end; i++) + { + int c = chars[i] - '0'; + + if (c < 0 || c > 9) + { + return ParseResult.Invalid; + } + } + + return ParseResult.Overflow; + } + + for (int i = start; i < end; i++) + { + int c = chars[i] - '0'; + + if (c < 0 || c > 9) + { + return ParseResult.Invalid; + } + + int newValue = (10 * value) - c; + + // overflow has caused the number to loop around + if (newValue > value) + { + i++; + + // double check the rest of the string that there wasn't anything invalid + // invalid result takes precedence over overflow result + for (; i < end; i++) + { + c = chars[i] - '0'; + + if (c < 0 || c > 9) + { + return ParseResult.Invalid; + } + } + + return ParseResult.Overflow; + } + + value = newValue; + } + + // go from negative to positive to avoids overflow + // negative can be slightly bigger than positive + if (!isNegative) + { + // negative integer can be one bigger than positive + if (value == int.MinValue) + { + return ParseResult.Overflow; + } + + value = -value; + } + + return ParseResult.Success; + } + + public static ParseResult Int64TryParse(char[] chars, int start, int length, out long value) + { + value = 0; + + if (length == 0) + { + return ParseResult.Invalid; + } + + bool isNegative = (chars[start] == '-'); + + if (isNegative) + { + // text just a negative sign + if (length == 1) + { + return ParseResult.Invalid; + } + + start++; + length--; + } + + int end = start + length; + + // Int64.MaxValue and MinValue are 19 chars + if (length > 19) + { + // invalid result takes precedence over overflow + for (int i = start; i < end; i++) + { + int c = chars[i] - '0'; + + if (c < 0 || c > 9) + { + return ParseResult.Invalid; + } + } + + return ParseResult.Overflow; + } + + for (int i = start; i < end; i++) + { + int c = chars[i] - '0'; + + if (c < 0 || c > 9) + { + return ParseResult.Invalid; + } + + long newValue = (10 * value) - c; + + // overflow has caused the number to loop around + if (newValue > value) + { + i++; + + // double check the rest of the string that there wasn't anything invalid + // invalid result takes precedence over overflow result + for (; i < end; i++) + { + c = chars[i] - '0'; + + if (c < 0 || c > 9) + { + return ParseResult.Invalid; + } + } + + return ParseResult.Overflow; + } + + value = newValue; + } + + // go from negative to positive to avoids overflow + // negative can be slightly bigger than positive + if (!isNegative) + { + // negative integer can be one bigger than positive + if (value == long.MinValue) + { + return ParseResult.Overflow; + } + + value = -value; + } + + return ParseResult.Success; + } + + public static bool TryConvertGuid(string s, out Guid g) + { + // GUID has to have format 00000000-0000-0000-0000-000000000000 +#if NET20 || NET35 + if (s == null) + { + throw new ArgumentNullException("s"); + } + + Regex format = new Regex("^[A-Fa-f0-9]{8}-([A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}$"); + Match match = format.Match(s); + if (match.Success) + { + g = new Guid(s); + return true; + } + + g = Guid.Empty; + return false; +#else + return Guid.TryParseExact(s, "D", out g); +#endif + } + + public static int HexTextToInt(char[] text, int start, int end) + { + int value = 0; + for (int i = start; i < end; i++) + { + value += HexCharToInt(text[i]) << ((end - 1 - i) * 4); + } + return value; + } + + private static int HexCharToInt(char ch) + { + if (ch <= 57 && ch >= 48) + { + return ch - 48; + } + + if (ch <= 70 && ch >= 65) + { + return ch - 55; + } + + if (ch <= 102 && ch >= 97) + { + return ch - 87; + } + + throw new FormatException("Invalid hex character: " + ch); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/DateTimeParser.cs b/Common/00-1Json8.3/Json8.3/Utilities/DateTimeParser.cs new file mode 100644 index 0000000..9addb98 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/DateTimeParser.cs @@ -0,0 +1,277 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json.Utilities +{ + internal enum ParserTimeZone + { + Unspecified = 0, + Utc = 1, + LocalWestOfUtc = 2, + LocalEastOfUtc = 3 + } + + internal struct DateTimeParser + { + static DateTimeParser() + { + Power10 = new[] { -1, 10, 100, 1000, 10000, 100000, 1000000 }; + + Lzyyyy = "yyyy".Length; + Lzyyyy_ = "yyyy-".Length; + Lzyyyy_MM = "yyyy-MM".Length; + Lzyyyy_MM_ = "yyyy-MM-".Length; + Lzyyyy_MM_dd = "yyyy-MM-dd".Length; + Lzyyyy_MM_ddT = "yyyy-MM-ddT".Length; + LzHH = "HH".Length; + LzHH_ = "HH:".Length; + LzHH_mm = "HH:mm".Length; + LzHH_mm_ = "HH:mm:".Length; + LzHH_mm_ss = "HH:mm:ss".Length; + Lz_ = "-".Length; + Lz_zz = "-zz".Length; + } + + public int Year; + public int Month; + public int Day; + public int Hour; + public int Minute; + public int Second; + public int Fraction; + public int ZoneHour; + public int ZoneMinute; + public ParserTimeZone Zone; + + private char[] _text; + private int _end; + + private static readonly int[] Power10; + + private static readonly int Lzyyyy; + private static readonly int Lzyyyy_; + private static readonly int Lzyyyy_MM; + private static readonly int Lzyyyy_MM_; + private static readonly int Lzyyyy_MM_dd; + private static readonly int Lzyyyy_MM_ddT; + private static readonly int LzHH; + private static readonly int LzHH_; + private static readonly int LzHH_mm; + private static readonly int LzHH_mm_; + private static readonly int LzHH_mm_ss; + private static readonly int Lz_; + private static readonly int Lz_zz; + + private const short MaxFractionDigits = 7; + + public bool Parse(char[] text, int startIndex, int length) + { + _text = text; + _end = startIndex + length; + + if (ParseDate(startIndex) && ParseChar(Lzyyyy_MM_dd + startIndex, 'T') && ParseTimeAndZoneAndWhitespace(Lzyyyy_MM_ddT + startIndex)) + { + return true; + } + + return false; + } + + private bool ParseDate(int start) + { + return (Parse4Digit(start, out Year) + && 1 <= Year + && ParseChar(start + Lzyyyy, '-') + && Parse2Digit(start + Lzyyyy_, out Month) + && 1 <= Month + && Month <= 12 + && ParseChar(start + Lzyyyy_MM, '-') + && Parse2Digit(start + Lzyyyy_MM_, out Day) + && 1 <= Day + && Day <= DateTime.DaysInMonth(Year, Month)); + } + + private bool ParseTimeAndZoneAndWhitespace(int start) + { + return (ParseTime(ref start) && ParseZone(start)); + } + + private bool ParseTime(ref int start) + { + if (!(Parse2Digit(start, out Hour) + && Hour <= 24 + && ParseChar(start + LzHH, ':') + && Parse2Digit(start + LzHH_, out Minute) + && Minute < 60 + && ParseChar(start + LzHH_mm, ':') + && Parse2Digit(start + LzHH_mm_, out Second) + && Second < 60 + && (Hour != 24 || (Minute == 0 && Second == 0)))) // hour can be 24 if minute/second is zero) + { + return false; + } + + start += LzHH_mm_ss; + if (ParseChar(start, '.')) + { + Fraction = 0; + int numberOfDigits = 0; + + while (++start < _end && numberOfDigits < MaxFractionDigits) + { + int digit = _text[start] - '0'; + if (digit < 0 || digit > 9) + { + break; + } + + Fraction = (Fraction * 10) + digit; + + numberOfDigits++; + } + + if (numberOfDigits < MaxFractionDigits) + { + if (numberOfDigits == 0) + { + return false; + } + + Fraction *= Power10[MaxFractionDigits - numberOfDigits]; + } + + if (Hour == 24 && Fraction != 0) + { + return false; + } + } + return true; + } + + private bool ParseZone(int start) + { + if (start < _end) + { + char ch = _text[start]; + if (ch == 'Z' || ch == 'z') + { + Zone = ParserTimeZone.Utc; + start++; + } + else + { + if (start + 2 < _end + && Parse2Digit(start + Lz_, out ZoneHour) + && ZoneHour <= 99) + { + switch (ch) + { + case '-': + Zone = ParserTimeZone.LocalWestOfUtc; + start += Lz_zz; + break; + + case '+': + Zone = ParserTimeZone.LocalEastOfUtc; + start += Lz_zz; + break; + } + } + + if (start < _end) + { + if (ParseChar(start, ':')) + { + start += 1; + + if (start + 1 < _end + && Parse2Digit(start, out ZoneMinute) + && ZoneMinute <= 99) + { + start += 2; + } + } + else + { + if (start + 1 < _end + && Parse2Digit(start, out ZoneMinute) + && ZoneMinute <= 99) + { + start += 2; + } + } + } + } + } + + return (start == _end); + } + + private bool Parse4Digit(int start, out int num) + { + if (start + 3 < _end) + { + int digit1 = _text[start] - '0'; + int digit2 = _text[start + 1] - '0'; + int digit3 = _text[start + 2] - '0'; + int digit4 = _text[start + 3] - '0'; + if (0 <= digit1 && digit1 < 10 + && 0 <= digit2 && digit2 < 10 + && 0 <= digit3 && digit3 < 10 + && 0 <= digit4 && digit4 < 10) + { + num = (((((digit1 * 10) + digit2) * 10) + digit3) * 10) + digit4; + return true; + } + } + num = 0; + return false; + } + + private bool Parse2Digit(int start, out int num) + { + if (start + 1 < _end) + { + int digit1 = _text[start] - '0'; + int digit2 = _text[start + 1] - '0'; + if (0 <= digit1 && digit1 < 10 + && 0 <= digit2 && digit2 < 10) + { + num = (digit1 * 10) + digit2; + return true; + } + } + num = 0; + return false; + } + + private bool ParseChar(int start, char ch) + { + return (start < _end && _text[start] == ch); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/DateTimeUtils.cs b/Common/00-1Json8.3/Json8.3/Utilities/DateTimeUtils.cs new file mode 100644 index 0000000..097bfe6 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/DateTimeUtils.cs @@ -0,0 +1,824 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.IO; +using System.Xml; +using System.Globalization; + +namespace Newtonsoft.Json.Utilities +{ + internal static class DateTimeUtils + { + internal static readonly long InitialJavaScriptDateTicks = 621355968000000000; + private const string IsoDateFormat = "yyyy-MM-ddTHH:mm:ss.FFFFFFFK"; + + private const int DaysPer100Years = 36524; + private const int DaysPer400Years = 146097; + private const int DaysPer4Years = 1461; + private const int DaysPerYear = 365; + private const long TicksPerDay = 864000000000L; + private static readonly int[] DaysToMonth365; + private static readonly int[] DaysToMonth366; + + static DateTimeUtils() + { + DaysToMonth365 = new[] { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }; + DaysToMonth366 = new[] { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }; + } + + public static TimeSpan GetUtcOffset(this DateTime d) + { +#if NET20 + return TimeZone.CurrentTimeZone.GetUtcOffset(d); +#else + return TimeZoneInfo.Local.GetUtcOffset(d); +#endif + } + +#if !(PORTABLE40 || PORTABLE) + public static XmlDateTimeSerializationMode ToSerializationMode(DateTimeKind kind) + { + switch (kind) + { + case DateTimeKind.Local: + return XmlDateTimeSerializationMode.Local; + case DateTimeKind.Unspecified: + return XmlDateTimeSerializationMode.Unspecified; + case DateTimeKind.Utc: + return XmlDateTimeSerializationMode.Utc; + default: + throw MiscellaneousUtils.CreateArgumentOutOfRangeException("kind", kind, "Unexpected DateTimeKind value."); + } + } +#endif + + internal static DateTime EnsureDateTime(DateTime value, DateTimeZoneHandling timeZone) + { + switch (timeZone) + { + case DateTimeZoneHandling.Local: + value = SwitchToLocalTime(value); + break; + case DateTimeZoneHandling.Utc: + value = SwitchToUtcTime(value); + break; + case DateTimeZoneHandling.Unspecified: + value = new DateTime(value.Ticks, DateTimeKind.Unspecified); + break; + case DateTimeZoneHandling.RoundtripKind: + break; + default: + throw new ArgumentException("Invalid date time handling value."); + } + + return value; + } + + private static DateTime SwitchToLocalTime(DateTime value) + { + switch (value.Kind) + { + case DateTimeKind.Unspecified: + return new DateTime(value.Ticks, DateTimeKind.Local); + + case DateTimeKind.Utc: + return value.ToLocalTime(); + + case DateTimeKind.Local: + return value; + } + return value; + } + + private static DateTime SwitchToUtcTime(DateTime value) + { + switch (value.Kind) + { + case DateTimeKind.Unspecified: + return new DateTime(value.Ticks, DateTimeKind.Utc); + + case DateTimeKind.Utc: + return value; + + case DateTimeKind.Local: + return value.ToUniversalTime(); + } + return value; + } + + private static long ToUniversalTicks(DateTime dateTime) + { + if (dateTime.Kind == DateTimeKind.Utc) + { + return dateTime.Ticks; + } + + return ToUniversalTicks(dateTime, dateTime.GetUtcOffset()); + } + + private static long ToUniversalTicks(DateTime dateTime, TimeSpan offset) + { + // special case min and max value + // they never have a timezone appended to avoid issues + if (dateTime.Kind == DateTimeKind.Utc || dateTime == DateTime.MaxValue || dateTime == DateTime.MinValue) + { + return dateTime.Ticks; + } + + long ticks = dateTime.Ticks - offset.Ticks; + if (ticks > 3155378975999999999L) + { + return 3155378975999999999L; + } + + if (ticks < 0L) + { + return 0L; + } + + return ticks; + } + + internal static long ConvertDateTimeToJavaScriptTicks(DateTime dateTime, TimeSpan offset) + { + long universialTicks = ToUniversalTicks(dateTime, offset); + + return UniversialTicksToJavaScriptTicks(universialTicks); + } + + internal static long ConvertDateTimeToJavaScriptTicks(DateTime dateTime) + { + return ConvertDateTimeToJavaScriptTicks(dateTime, true); + } + + internal static long ConvertDateTimeToJavaScriptTicks(DateTime dateTime, bool convertToUtc) + { + long ticks = (convertToUtc) ? ToUniversalTicks(dateTime) : dateTime.Ticks; + + return UniversialTicksToJavaScriptTicks(ticks); + } + + private static long UniversialTicksToJavaScriptTicks(long universialTicks) + { + long javaScriptTicks = (universialTicks - InitialJavaScriptDateTicks) / 10000; + + return javaScriptTicks; + } + + internal static DateTime ConvertJavaScriptTicksToDateTime(long javaScriptTicks) + { + DateTime dateTime = new DateTime((javaScriptTicks * 10000) + InitialJavaScriptDateTicks, DateTimeKind.Utc); + + return dateTime; + } + + #region Parse + internal static bool TryParseDateTimeIso(StringReference text, DateTimeZoneHandling dateTimeZoneHandling, out DateTime dt) + { + DateTimeParser dateTimeParser = new DateTimeParser(); + if (!dateTimeParser.Parse(text.Chars, text.StartIndex, text.Length)) + { + dt = default(DateTime); + return false; + } + + DateTime d = CreateDateTime(dateTimeParser); + + long ticks; + + switch (dateTimeParser.Zone) + { + case ParserTimeZone.Utc: + d = new DateTime(d.Ticks, DateTimeKind.Utc); + break; + + case ParserTimeZone.LocalWestOfUtc: + { + TimeSpan offset = new TimeSpan(dateTimeParser.ZoneHour, dateTimeParser.ZoneMinute, 0); + ticks = d.Ticks + offset.Ticks; + if (ticks <= DateTime.MaxValue.Ticks) + { + d = new DateTime(ticks, DateTimeKind.Utc).ToLocalTime(); + } + else + { + ticks += d.GetUtcOffset().Ticks; + if (ticks > DateTime.MaxValue.Ticks) + { + ticks = DateTime.MaxValue.Ticks; + } + + d = new DateTime(ticks, DateTimeKind.Local); + } + break; + } + case ParserTimeZone.LocalEastOfUtc: + { + TimeSpan offset = new TimeSpan(dateTimeParser.ZoneHour, dateTimeParser.ZoneMinute, 0); + ticks = d.Ticks - offset.Ticks; + if (ticks >= DateTime.MinValue.Ticks) + { + d = new DateTime(ticks, DateTimeKind.Utc).ToLocalTime(); + } + else + { + ticks += d.GetUtcOffset().Ticks; + if (ticks < DateTime.MinValue.Ticks) + { + ticks = DateTime.MinValue.Ticks; + } + + d = new DateTime(ticks, DateTimeKind.Local); + } + break; + } + } + + dt = EnsureDateTime(d, dateTimeZoneHandling); + return true; + } + +#if !NET20 + internal static bool TryParseDateTimeOffsetIso(StringReference text, out DateTimeOffset dt) + { + DateTimeParser dateTimeParser = new DateTimeParser(); + if (!dateTimeParser.Parse(text.Chars, text.StartIndex, text.Length)) + { + dt = default(DateTimeOffset); + return false; + } + + DateTime d = CreateDateTime(dateTimeParser); + + TimeSpan offset; + + switch (dateTimeParser.Zone) + { + case ParserTimeZone.Utc: + offset = new TimeSpan(0L); + break; + case ParserTimeZone.LocalWestOfUtc: + offset = new TimeSpan(-dateTimeParser.ZoneHour, -dateTimeParser.ZoneMinute, 0); + break; + case ParserTimeZone.LocalEastOfUtc: + offset = new TimeSpan(dateTimeParser.ZoneHour, dateTimeParser.ZoneMinute, 0); + break; + default: + offset = TimeZoneInfo.Local.GetUtcOffset(d); + break; + } + + long ticks = d.Ticks - offset.Ticks; + if (ticks < 0 || ticks > 3155378975999999999) + { + dt = default(DateTimeOffset); + return false; + } + + dt = new DateTimeOffset(d, offset); + return true; + } +#endif + + private static DateTime CreateDateTime(DateTimeParser dateTimeParser) + { + bool is24Hour; + if (dateTimeParser.Hour == 24) + { + is24Hour = true; + dateTimeParser.Hour = 0; + } + else + { + is24Hour = false; + } + + DateTime d = new DateTime(dateTimeParser.Year, dateTimeParser.Month, dateTimeParser.Day, dateTimeParser.Hour, dateTimeParser.Minute, dateTimeParser.Second); + d = d.AddTicks(dateTimeParser.Fraction); + + if (is24Hour) + { + d = d.AddDays(1); + } + return d; + } + + internal static bool TryParseDateTime(StringReference s, DateTimeZoneHandling dateTimeZoneHandling, string dateFormatString, CultureInfo culture, out DateTime dt) + { + if (s.Length > 0) + { + int i = s.StartIndex; + if (s[i] == '/') + { + if (s.Length >= 9 && s.StartsWith("/Date(") && s.EndsWith(")/")) + { + if (TryParseDateTimeMicrosoft(s, dateTimeZoneHandling, out dt)) + { + return true; + } + } + } + else if (s.Length >= 19 && s.Length <= 40 && char.IsDigit(s[i]) && s[i + 10] == 'T') + { + if (TryParseDateTimeIso(s, dateTimeZoneHandling, out dt)) + { + return true; + } + } + + if (!string.IsNullOrEmpty(dateFormatString)) + { + if (TryParseDateTimeExact(s.ToString(), dateTimeZoneHandling, dateFormatString, culture, out dt)) + { + return true; + } + } + } + + dt = default(DateTime); + return false; + } + + internal static bool TryParseDateTime(string s, DateTimeZoneHandling dateTimeZoneHandling, string dateFormatString, CultureInfo culture, out DateTime dt) + { + if (s.Length > 0) + { + if (s[0] == '/') + { + if (s.Length >= 9 && s.StartsWith("/Date(", StringComparison.Ordinal) && s.EndsWith(")/", StringComparison.Ordinal)) + { + if (TryParseDateTimeMicrosoft(new StringReference(s.ToCharArray(), 0, s.Length), dateTimeZoneHandling, out dt)) + { + return true; + } + } + } + else if (s.Length >= 19 && s.Length <= 40 && char.IsDigit(s[0]) && s[10] == 'T') + { + if (DateTime.TryParseExact(s, IsoDateFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dt)) + { + dt = EnsureDateTime(dt, dateTimeZoneHandling); + return true; + } + } + + if (!string.IsNullOrEmpty(dateFormatString)) + { + if (TryParseDateTimeExact(s, dateTimeZoneHandling, dateFormatString, culture, out dt)) + { + return true; + } + } + } + + dt = default(DateTime); + return false; + } + +#if !NET20 + internal static bool TryParseDateTimeOffset(StringReference s, string dateFormatString, CultureInfo culture, out DateTimeOffset dt) + { + if (s.Length > 0) + { + int i = s.StartIndex; + if (s[i] == '/') + { + if (s.Length >= 9 && s.StartsWith("/Date(") && s.EndsWith(")/")) + { + if (TryParseDateTimeOffsetMicrosoft(s, out dt)) + { + return true; + } + } + } + else if (s.Length >= 19 && s.Length <= 40 && char.IsDigit(s[i]) && s[i + 10] == 'T') + { + if (TryParseDateTimeOffsetIso(s, out dt)) + { + return true; + } + } + + if (!string.IsNullOrEmpty(dateFormatString)) + { + if (TryParseDateTimeOffsetExact(s.ToString(), dateFormatString, culture, out dt)) + { + return true; + } + } + } + + dt = default(DateTimeOffset); + return false; + } + + internal static bool TryParseDateTimeOffset(string s, string dateFormatString, CultureInfo culture, out DateTimeOffset dt) + { + if (s.Length > 0) + { + if (s[0] == '/') + { + if (s.Length >= 9 && s.StartsWith("/Date(", StringComparison.Ordinal) && s.EndsWith(")/", StringComparison.Ordinal)) + { + if (TryParseDateTimeOffsetMicrosoft(new StringReference(s.ToCharArray(), 0, s.Length), out dt)) + { + return true; + } + } + } + else if (s.Length >= 19 && s.Length <= 40 && char.IsDigit(s[0]) && s[10] == 'T') + { + if (DateTimeOffset.TryParseExact(s, IsoDateFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dt)) + { + if (TryParseDateTimeOffsetIso(new StringReference(s.ToCharArray(), 0, s.Length), out dt)) + { + return true; + } + } + } + + if (!string.IsNullOrEmpty(dateFormatString)) + { + if (TryParseDateTimeOffsetExact(s, dateFormatString, culture, out dt)) + { + return true; + } + } + } + + dt = default(DateTimeOffset); + return false; + } +#endif + + private static bool TryParseMicrosoftDate(StringReference text, out long ticks, out TimeSpan offset, out DateTimeKind kind) + { + kind = DateTimeKind.Utc; + + int index = text.IndexOf('+', 7, text.Length - 8); + + if (index == -1) + { + index = text.IndexOf('-', 7, text.Length - 8); + } + + if (index != -1) + { + kind = DateTimeKind.Local; + + if (!TryReadOffset(text, index + text.StartIndex, out offset)) + { + ticks = 0; + return false; + } + } + else + { + offset = TimeSpan.Zero; + index = text.Length - 2; + } + + return (ConvertUtils.Int64TryParse(text.Chars, 6 + text.StartIndex, index - 6, out ticks) == ParseResult.Success); + } + + private static bool TryParseDateTimeMicrosoft(StringReference text, DateTimeZoneHandling dateTimeZoneHandling, out DateTime dt) + { + long ticks; + TimeSpan offset; + DateTimeKind kind; + + if (!TryParseMicrosoftDate(text, out ticks, out offset, out kind)) + { + dt = default(DateTime); + return false; + } + + DateTime utcDateTime = ConvertJavaScriptTicksToDateTime(ticks); + + switch (kind) + { + case DateTimeKind.Unspecified: + dt = DateTime.SpecifyKind(utcDateTime.ToLocalTime(), DateTimeKind.Unspecified); + break; + case DateTimeKind.Local: + dt = utcDateTime.ToLocalTime(); + break; + default: + dt = utcDateTime; + break; + } + + dt = EnsureDateTime(dt, dateTimeZoneHandling); + return true; + } + + private static bool TryParseDateTimeExact(string text, DateTimeZoneHandling dateTimeZoneHandling, string dateFormatString, CultureInfo culture, out DateTime dt) + { + DateTime temp; + if (DateTime.TryParseExact(text, dateFormatString, culture, DateTimeStyles.RoundtripKind, out temp)) + { + temp = EnsureDateTime(temp, dateTimeZoneHandling); + dt = temp; + return true; + } + + dt = default(DateTime); + return false; + } + +#if !NET20 + private static bool TryParseDateTimeOffsetMicrosoft(StringReference text, out DateTimeOffset dt) + { + long ticks; + TimeSpan offset; + DateTimeKind kind; + + if (!TryParseMicrosoftDate(text, out ticks, out offset, out kind)) + { + dt = default(DateTime); + return false; + } + + DateTime utcDateTime = ConvertJavaScriptTicksToDateTime(ticks); + + dt = new DateTimeOffset(utcDateTime.Add(offset).Ticks, offset); + return true; + } + + private static bool TryParseDateTimeOffsetExact(string text, string dateFormatString, CultureInfo culture, out DateTimeOffset dt) + { + DateTimeOffset temp; + if (DateTimeOffset.TryParseExact(text, dateFormatString, culture, DateTimeStyles.RoundtripKind, out temp)) + { + dt = temp; + return true; + } + + dt = default(DateTimeOffset); + return false; + } +#endif + + private static bool TryReadOffset(StringReference offsetText, int startIndex, out TimeSpan offset) + { + bool negative = (offsetText[startIndex] == '-'); + + int hours; + if (ConvertUtils.Int32TryParse(offsetText.Chars, startIndex + 1, 2, out hours) != ParseResult.Success) + { + offset = default(TimeSpan); + return false; + } + + int minutes = 0; + if (offsetText.Length - startIndex > 5) + { + if (ConvertUtils.Int32TryParse(offsetText.Chars, startIndex + 3, 2, out minutes) != ParseResult.Success) + { + offset = default(TimeSpan); + return false; + } + } + + offset = TimeSpan.FromHours(hours) + TimeSpan.FromMinutes(minutes); + if (negative) + { + offset = offset.Negate(); + } + + return true; + } + #endregion + + #region Write + internal static void WriteDateTimeString(TextWriter writer, DateTime value, DateFormatHandling format, string formatString, CultureInfo culture) + { + if (string.IsNullOrEmpty(formatString)) + { + char[] chars = new char[64]; + int pos = WriteDateTimeString(chars, 0, value, null, value.Kind, format); + writer.Write(chars, 0, pos); + } + else + { + writer.Write(value.ToString(formatString, culture)); + } + } + + internal static int WriteDateTimeString(char[] chars, int start, DateTime value, TimeSpan? offset, DateTimeKind kind, DateFormatHandling format) + { + int pos = start; + + if (format == DateFormatHandling.MicrosoftDateFormat) + { + TimeSpan o = offset ?? value.GetUtcOffset(); + + long javaScriptTicks = ConvertDateTimeToJavaScriptTicks(value, o); + + @"\/Date(".CopyTo(0, chars, pos, 7); + pos += 7; + + string ticksText = javaScriptTicks.ToString(CultureInfo.InvariantCulture); + ticksText.CopyTo(0, chars, pos, ticksText.Length); + pos += ticksText.Length; + + switch (kind) + { + case DateTimeKind.Unspecified: + if (value != DateTime.MaxValue && value != DateTime.MinValue) + { + pos = WriteDateTimeOffset(chars, pos, o, format); + } + break; + case DateTimeKind.Local: + pos = WriteDateTimeOffset(chars, pos, o, format); + break; + } + + @")\/".CopyTo(0, chars, pos, 3); + pos += 3; + } + else + { + pos = WriteDefaultIsoDate(chars, pos, value); + + switch (kind) + { + case DateTimeKind.Local: + pos = WriteDateTimeOffset(chars, pos, offset ?? value.GetUtcOffset(), format); + break; + case DateTimeKind.Utc: + chars[pos++] = 'Z'; + break; + } + } + + return pos; + } + + internal static int WriteDefaultIsoDate(char[] chars, int start, DateTime dt) + { + int length = 19; + + int year; + int month; + int day; + GetDateValues(dt, out year, out month, out day); + + CopyIntToCharArray(chars, start, year, 4); + chars[start + 4] = '-'; + CopyIntToCharArray(chars, start + 5, month, 2); + chars[start + 7] = '-'; + CopyIntToCharArray(chars, start + 8, day, 2); + chars[start + 10] = 'T'; + CopyIntToCharArray(chars, start + 11, dt.Hour, 2); + chars[start + 13] = ':'; + CopyIntToCharArray(chars, start + 14, dt.Minute, 2); + chars[start + 16] = ':'; + CopyIntToCharArray(chars, start + 17, dt.Second, 2); + + int fraction = (int)(dt.Ticks % 10000000L); + + if (fraction != 0) + { + int digits = 7; + while ((fraction % 10) == 0) + { + digits--; + fraction /= 10; + } + + chars[start + 19] = '.'; + CopyIntToCharArray(chars, start + 20, fraction, digits); + + length += digits + 1; + } + + return start + length; + } + + private static void CopyIntToCharArray(char[] chars, int start, int value, int digits) + { + while (digits-- != 0) + { + chars[start + digits] = (char)((value % 10) + 48); + value /= 10; + } + } + + internal static int WriteDateTimeOffset(char[] chars, int start, TimeSpan offset, DateFormatHandling format) + { + chars[start++] = (offset.Ticks >= 0L) ? '+' : '-'; + + int absHours = Math.Abs(offset.Hours); + CopyIntToCharArray(chars, start, absHours, 2); + start += 2; + + if (format == DateFormatHandling.IsoDateFormat) + { + chars[start++] = ':'; + } + + int absMinutes = Math.Abs(offset.Minutes); + CopyIntToCharArray(chars, start, absMinutes, 2); + start += 2; + + return start; + } + +#if !NET20 + internal static void WriteDateTimeOffsetString(TextWriter writer, DateTimeOffset value, DateFormatHandling format, string formatString, CultureInfo culture) + { + if (string.IsNullOrEmpty(formatString)) + { + char[] chars = new char[64]; + int pos = WriteDateTimeString(chars, 0, (format == DateFormatHandling.IsoDateFormat) ? value.DateTime : value.UtcDateTime, value.Offset, DateTimeKind.Local, format); + + writer.Write(chars, 0, pos); + } + else + { + writer.Write(value.ToString(formatString, culture)); + } + } +#endif + #endregion + + private static void GetDateValues(DateTime td, out int year, out int month, out int day) + { + long ticks = td.Ticks; + // n = number of days since 1/1/0001 + int n = (int)(ticks / TicksPerDay); + // y400 = number of whole 400-year periods since 1/1/0001 + int y400 = n / DaysPer400Years; + // n = day number within 400-year period + n -= y400 * DaysPer400Years; + // y100 = number of whole 100-year periods within 400-year period + int y100 = n / DaysPer100Years; + // Last 100-year period has an extra day, so decrement result if 4 + if (y100 == 4) + { + y100 = 3; + } + // n = day number within 100-year period + n -= y100 * DaysPer100Years; + // y4 = number of whole 4-year periods within 100-year period + int y4 = n / DaysPer4Years; + // n = day number within 4-year period + n -= y4 * DaysPer4Years; + // y1 = number of whole years within 4-year period + int y1 = n / DaysPerYear; + // Last year has an extra day, so decrement result if 4 + if (y1 == 4) + { + y1 = 3; + } + + year = y400 * 400 + y100 * 100 + y4 * 4 + y1 + 1; + + // n = day number within year + n -= y1 * DaysPerYear; + + // Leap year calculation looks different from IsLeapYear since y1, y4, + // and y100 are relative to year 1, not year 0 + bool leapYear = y1 == 3 && (y4 != 24 || y100 == 3); + int[] days = leapYear ? DaysToMonth366 : DaysToMonth365; + // All months have less than 32 days, so n >> 5 is a good conservative + // estimate for the month + int m = n >> 5 + 1; + // m = 1-based month number + while (n >= days[m]) + { + m++; + } + + month = m; + + // Return 1-based day-of-month + day = n - days[m - 1] + 1; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/DictionaryWrapper.cs b/Common/00-1Json8.3/Json8.3/Utilities/DictionaryWrapper.cs new file mode 100644 index 0000000..4819c23 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/DictionaryWrapper.cs @@ -0,0 +1,700 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Collections; +using System.Threading; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Utilities +{ + internal interface IWrappedDictionary + : IDictionary + { + object UnderlyingDictionary { get; } + } + + internal class DictionaryWrapper : IDictionary, IWrappedDictionary + { + private readonly IDictionary _dictionary; + private readonly IDictionary _genericDictionary; +#if !(NET40 || NET35 || NET20 || PORTABLE40) + private readonly IReadOnlyDictionary _readOnlyDictionary; +#endif + private object _syncRoot; + + public DictionaryWrapper(IDictionary dictionary) + { + ValidationUtils.ArgumentNotNull(dictionary, nameof(dictionary)); + + _dictionary = dictionary; + } + + public DictionaryWrapper(IDictionary dictionary) + { + ValidationUtils.ArgumentNotNull(dictionary, nameof(dictionary)); + + _genericDictionary = dictionary; + } + +#if !(NET40 || NET35 || NET20 || PORTABLE40) + public DictionaryWrapper(IReadOnlyDictionary dictionary) + { + ValidationUtils.ArgumentNotNull(dictionary, nameof(dictionary)); + + _readOnlyDictionary = dictionary; + } +#endif + + public void Add(TKey key, TValue value) + { + if (_dictionary != null) + { + _dictionary.Add(key, value); + } + else if (_genericDictionary != null) + { + _genericDictionary.Add(key, value); + } + else + { + throw new NotSupportedException(); + } + } + + public bool ContainsKey(TKey key) + { + if (_dictionary != null) + { + return _dictionary.Contains(key); + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + return _readOnlyDictionary.ContainsKey(key); + } +#endif + else + { + return _genericDictionary.ContainsKey(key); + } + } + + public ICollection Keys + { + get + { + if (_dictionary != null) + { + return _dictionary.Keys.Cast().ToList(); + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + return _readOnlyDictionary.Keys.ToList(); + } +#endif + else + { + return _genericDictionary.Keys; + } + } + } + + public bool Remove(TKey key) + { + if (_dictionary != null) + { + if (_dictionary.Contains(key)) + { + _dictionary.Remove(key); + return true; + } + else + { + return false; + } + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + throw new NotSupportedException(); + } +#endif + else + { + return _genericDictionary.Remove(key); + } + } + + public bool TryGetValue(TKey key, out TValue value) + { + if (_dictionary != null) + { + if (!_dictionary.Contains(key)) + { + value = default(TValue); + return false; + } + else + { + value = (TValue)_dictionary[key]; + return true; + } + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + throw new NotSupportedException(); + } +#endif + else + { + return _genericDictionary.TryGetValue(key, out value); + } + } + + public ICollection Values + { + get + { + if (_dictionary != null) + { + return _dictionary.Values.Cast().ToList(); + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + return _readOnlyDictionary.Values.ToList(); + } +#endif + else + { + return _genericDictionary.Values; + } + } + } + + public TValue this[TKey key] + { + get + { + if (_dictionary != null) + { + return (TValue)_dictionary[key]; + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + return _readOnlyDictionary[key]; + } +#endif + else + { + return _genericDictionary[key]; + } + } + set + { + if (_dictionary != null) + { + _dictionary[key] = value; + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + throw new NotSupportedException(); + } +#endif + else + { + _genericDictionary[key] = value; + } + } + } + + public void Add(KeyValuePair item) + { + if (_dictionary != null) + { + ((IList)_dictionary).Add(item); + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + throw new NotSupportedException(); + } +#endif + else if (_genericDictionary != null) + { + _genericDictionary.Add(item); + } + } + + public void Clear() + { + if (_dictionary != null) + { + _dictionary.Clear(); + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + throw new NotSupportedException(); + } +#endif + else + { + _genericDictionary.Clear(); + } + } + + public bool Contains(KeyValuePair item) + { + if (_dictionary != null) + { + return ((IList)_dictionary).Contains(item); + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + return _readOnlyDictionary.Contains(item); + } +#endif + else + { + return _genericDictionary.Contains(item); + } + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + if (_dictionary != null) + { + foreach (DictionaryEntry item in _dictionary) + { + array[arrayIndex++] = new KeyValuePair((TKey)item.Key, (TValue)item.Value); + } + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + throw new NotSupportedException(); + } +#endif + else + { + _genericDictionary.CopyTo(array, arrayIndex); + } + } + + public int Count + { + get + { + if (_dictionary != null) + { + return _dictionary.Count; + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + return _readOnlyDictionary.Count; + } +#endif + else + { + return _genericDictionary.Count; + } + } + } + + public bool IsReadOnly + { + get + { + if (_dictionary != null) + { + return _dictionary.IsReadOnly; + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + return true; + } +#endif + else + { + return _genericDictionary.IsReadOnly; + } + } + } + + public bool Remove(KeyValuePair item) + { + if (_dictionary != null) + { + if (_dictionary.Contains(item.Key)) + { + object value = _dictionary[item.Key]; + + if (object.Equals(value, item.Value)) + { + _dictionary.Remove(item.Key); + return true; + } + else + { + return false; + } + } + else + { + return true; + } + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + throw new NotSupportedException(); + } +#endif + else + { + return _genericDictionary.Remove(item); + } + } + + public IEnumerator> GetEnumerator() + { + if (_dictionary != null) + { + return _dictionary.Cast().Select(de => new KeyValuePair((TKey)de.Key, (TValue)de.Value)).GetEnumerator(); + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + return _readOnlyDictionary.GetEnumerator(); + } +#endif + else + { + return _genericDictionary.GetEnumerator(); + } + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + void IDictionary.Add(object key, object value) + { + if (_dictionary != null) + { + _dictionary.Add(key, value); + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + throw new NotSupportedException(); + } +#endif + else + { + _genericDictionary.Add((TKey)key, (TValue)value); + } + } + + object IDictionary.this[object key] + { + get + { + if (_dictionary != null) + { + return _dictionary[key]; + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + return _readOnlyDictionary[(TKey)key]; + } +#endif + else + { + return _genericDictionary[(TKey)key]; + } + } + set + { + if (_dictionary != null) + { + _dictionary[key] = value; + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + throw new NotSupportedException(); + } +#endif + else + { + _genericDictionary[(TKey)key] = (TValue)value; + } + } + } + + private struct DictionaryEnumerator : IDictionaryEnumerator + { + private readonly IEnumerator> _e; + + public DictionaryEnumerator(IEnumerator> e) + { + ValidationUtils.ArgumentNotNull(e, nameof(e)); + _e = e; + } + + public DictionaryEntry Entry + { + get { return (DictionaryEntry)Current; } + } + + public object Key + { + get { return Entry.Key; } + } + + public object Value + { + get { return Entry.Value; } + } + + public object Current + { + get { return new DictionaryEntry(_e.Current.Key, _e.Current.Value); } + } + + public bool MoveNext() + { + return _e.MoveNext(); + } + + public void Reset() + { + _e.Reset(); + } + } + + IDictionaryEnumerator IDictionary.GetEnumerator() + { + if (_dictionary != null) + { + return _dictionary.GetEnumerator(); + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + return new DictionaryEnumerator(_readOnlyDictionary.GetEnumerator()); + } +#endif + else + { + return new DictionaryEnumerator(_genericDictionary.GetEnumerator()); + } + } + + bool IDictionary.Contains(object key) + { + if (_genericDictionary != null) + { + return _genericDictionary.ContainsKey((TKey)key); + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + return _readOnlyDictionary.ContainsKey((TKey)key); + } +#endif + else + { + return _dictionary.Contains(key); + } + } + + bool IDictionary.IsFixedSize + { + get + { + if (_genericDictionary != null) + { + return false; + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + return true; + } +#endif + else + { + return _dictionary.IsFixedSize; + } + } + } + + ICollection IDictionary.Keys + { + get + { + if (_genericDictionary != null) + { + return _genericDictionary.Keys.ToList(); + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + return _readOnlyDictionary.Keys.ToList(); + } +#endif + else + { + return _dictionary.Keys; + } + } + } + + public void Remove(object key) + { + if (_dictionary != null) + { + _dictionary.Remove(key); + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + throw new NotSupportedException(); + } +#endif + else + { + _genericDictionary.Remove((TKey)key); + } + } + + ICollection IDictionary.Values + { + get + { + if (_genericDictionary != null) + { + return _genericDictionary.Values.ToList(); + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + return _readOnlyDictionary.Values.ToList(); + } +#endif + else + { + return _dictionary.Values; + } + } + } + + void ICollection.CopyTo(Array array, int index) + { + if (_dictionary != null) + { + _dictionary.CopyTo(array, index); + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + throw new NotSupportedException(); + } +#endif + else + { + _genericDictionary.CopyTo((KeyValuePair[])array, index); + } + } + + bool ICollection.IsSynchronized + { + get + { + if (_dictionary != null) + { + return _dictionary.IsSynchronized; + } + else + { + return false; + } + } + } + + object ICollection.SyncRoot + { + get + { + if (_syncRoot == null) + { + Interlocked.CompareExchange(ref _syncRoot, new object(), null); + } + + return _syncRoot; + } + } + + public object UnderlyingDictionary + { + get + { + if (_dictionary != null) + { + return _dictionary; + } +#if !(NET40 || NET35 || NET20 || PORTABLE40) + else if (_readOnlyDictionary != null) + { + return _readOnlyDictionary; + } +#endif + else + { + return _genericDictionary; + } + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/DynamicProxy.cs b/Common/00-1Json8.3/Json8.3/Utilities/DynamicProxy.cs new file mode 100644 index 0000000..7fb0100 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/DynamicProxy.cs @@ -0,0 +1,113 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(NET35 || NET20 || PORTABLE40) +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; + +namespace Newtonsoft.Json.Utilities +{ + internal class DynamicProxy + { + public virtual IEnumerable GetDynamicMemberNames(T instance) + { + return new string[0]; + } + + public virtual bool TryBinaryOperation(T instance, BinaryOperationBinder binder, object arg, out object result) + { + result = null; + return false; + } + + public virtual bool TryConvert(T instance, ConvertBinder binder, out object result) + { + result = null; + return false; + } + + public virtual bool TryCreateInstance(T instance, CreateInstanceBinder binder, object[] args, out object result) + { + result = null; + return false; + } + + public virtual bool TryDeleteIndex(T instance, DeleteIndexBinder binder, object[] indexes) + { + return false; + } + + public virtual bool TryDeleteMember(T instance, DeleteMemberBinder binder) + { + return false; + } + + public virtual bool TryGetIndex(T instance, GetIndexBinder binder, object[] indexes, out object result) + { + result = null; + return false; + } + + public virtual bool TryGetMember(T instance, GetMemberBinder binder, out object result) + { + result = null; + return false; + } + + public virtual bool TryInvoke(T instance, InvokeBinder binder, object[] args, out object result) + { + result = null; + return false; + } + + public virtual bool TryInvokeMember(T instance, InvokeMemberBinder binder, object[] args, out object result) + { + result = null; + return false; + } + + public virtual bool TrySetIndex(T instance, SetIndexBinder binder, object[] indexes, object value) + { + return false; + } + + public virtual bool TrySetMember(T instance, SetMemberBinder binder, object value) + { + return false; + } + + public virtual bool TryUnaryOperation(T instance, UnaryOperationBinder binder, out object result) + { + result = null; + return false; + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/DynamicProxyMetaObject.cs b/Common/00-1Json8.3/Json8.3/Utilities/DynamicProxyMetaObject.cs new file mode 100644 index 0000000..28321d5 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/DynamicProxyMetaObject.cs @@ -0,0 +1,427 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(NET35 || NET20 || PORTABLE40) +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; + +namespace Newtonsoft.Json.Utilities +{ + internal sealed class DynamicProxyMetaObject : DynamicMetaObject + { + private readonly DynamicProxy _proxy; + private readonly bool _dontFallbackFirst; + + internal DynamicProxyMetaObject(Expression expression, T value, DynamicProxy proxy, bool dontFallbackFirst) + : base(expression, BindingRestrictions.Empty, value) + { + _proxy = proxy; + _dontFallbackFirst = dontFallbackFirst; + } + + private new T Value + { + get { return (T)base.Value; } + } + + private bool IsOverridden(string method) + { + return ReflectionUtils.IsMethodOverridden(_proxy.GetType(), typeof(DynamicProxy), method); + } + + public override DynamicMetaObject BindGetMember(GetMemberBinder binder) + { + return IsOverridden("TryGetMember") + ? CallMethodWithResult("TryGetMember", binder, NoArgs, e => binder.FallbackGetMember(this, e)) + : base.BindGetMember(binder); + } + + public override DynamicMetaObject BindSetMember(SetMemberBinder binder, DynamicMetaObject value) + { + return IsOverridden("TrySetMember") + ? CallMethodReturnLast("TrySetMember", binder, GetArgs(value), e => binder.FallbackSetMember(this, value, e)) + : base.BindSetMember(binder, value); + } + + public override DynamicMetaObject BindDeleteMember(DeleteMemberBinder binder) + { + return IsOverridden("TryDeleteMember") + ? CallMethodNoResult("TryDeleteMember", binder, NoArgs, e => binder.FallbackDeleteMember(this, e)) + : base.BindDeleteMember(binder); + } + + public override DynamicMetaObject BindConvert(ConvertBinder binder) + { + return IsOverridden("TryConvert") + ? CallMethodWithResult("TryConvert", binder, NoArgs, e => binder.FallbackConvert(this, e)) + : base.BindConvert(binder); + } + + public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args) + { + if (!IsOverridden("TryInvokeMember")) + { + return base.BindInvokeMember(binder, args); + } + + // + // Generate a tree like: + // + // { + // object result; + // TryInvokeMember(payload, out result) + // ? result + // : TryGetMember(payload, out result) + // ? FallbackInvoke(result) + // : fallbackResult + // } + // + // Then it calls FallbackInvokeMember with this tree as the + // "error", giving the language the option of using this + // tree or doing .NET binding. + // + Fallback fallback = e => binder.FallbackInvokeMember(this, args, e); + + DynamicMetaObject call = BuildCallMethodWithResult( + "TryInvokeMember", + binder, + GetArgArray(args), + BuildCallMethodWithResult( + "TryGetMember", + new GetBinderAdapter(binder), + NoArgs, + fallback(null), + e => binder.FallbackInvoke(e, args, null) + ), + null + ); + + return _dontFallbackFirst ? call : fallback(call); + } + + public override DynamicMetaObject BindCreateInstance(CreateInstanceBinder binder, DynamicMetaObject[] args) + { + return IsOverridden("TryCreateInstance") + ? CallMethodWithResult("TryCreateInstance", binder, GetArgArray(args), e => binder.FallbackCreateInstance(this, args, e)) + : base.BindCreateInstance(binder, args); + } + + public override DynamicMetaObject BindInvoke(InvokeBinder binder, DynamicMetaObject[] args) + { + return IsOverridden("TryInvoke") + ? CallMethodWithResult("TryInvoke", binder, GetArgArray(args), e => binder.FallbackInvoke(this, args, e)) + : base.BindInvoke(binder, args); + } + + public override DynamicMetaObject BindBinaryOperation(BinaryOperationBinder binder, DynamicMetaObject arg) + { + return IsOverridden("TryBinaryOperation") + ? CallMethodWithResult("TryBinaryOperation", binder, GetArgs(arg), e => binder.FallbackBinaryOperation(this, arg, e)) + : base.BindBinaryOperation(binder, arg); + } + + public override DynamicMetaObject BindUnaryOperation(UnaryOperationBinder binder) + { + return IsOverridden("TryUnaryOperation") + ? CallMethodWithResult("TryUnaryOperation", binder, NoArgs, e => binder.FallbackUnaryOperation(this, e)) + : base.BindUnaryOperation(binder); + } + + public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes) + { + return IsOverridden("TryGetIndex") + ? CallMethodWithResult("TryGetIndex", binder, GetArgArray(indexes), e => binder.FallbackGetIndex(this, indexes, e)) + : base.BindGetIndex(binder, indexes); + } + + public override DynamicMetaObject BindSetIndex(SetIndexBinder binder, DynamicMetaObject[] indexes, DynamicMetaObject value) + { + return IsOverridden("TrySetIndex") + ? CallMethodReturnLast("TrySetIndex", binder, GetArgArray(indexes, value), e => binder.FallbackSetIndex(this, indexes, value, e)) + : base.BindSetIndex(binder, indexes, value); + } + + public override DynamicMetaObject BindDeleteIndex(DeleteIndexBinder binder, DynamicMetaObject[] indexes) + { + return IsOverridden("TryDeleteIndex") + ? CallMethodNoResult("TryDeleteIndex", binder, GetArgArray(indexes), e => binder.FallbackDeleteIndex(this, indexes, e)) + : base.BindDeleteIndex(binder, indexes); + } + + private delegate DynamicMetaObject Fallback(DynamicMetaObject errorSuggestion); + + private static readonly Expression[] NoArgs = new Expression[0]; + + private static Expression[] GetArgs(params DynamicMetaObject[] args) + { + return args.Select(arg => Expression.Convert(arg.Expression, typeof(object))).ToArray(); + } + + private static Expression[] GetArgArray(DynamicMetaObject[] args) + { + return new[] { Expression.NewArrayInit(typeof(object), GetArgs(args)) }; + } + + private static Expression[] GetArgArray(DynamicMetaObject[] args, DynamicMetaObject value) + { + return new Expression[] + { + Expression.NewArrayInit(typeof(object), GetArgs(args)), + Expression.Convert(value.Expression, typeof(object)) + }; + } + + private static ConstantExpression Constant(DynamicMetaObjectBinder binder) + { + Type t = binder.GetType(); + while (!t.IsVisible()) + { + t = t.BaseType(); + } + return Expression.Constant(binder, t); + } + + /// + /// Helper method for generating a MetaObject which calls a + /// specific method on Dynamic that returns a result + /// + private DynamicMetaObject CallMethodWithResult(string methodName, DynamicMetaObjectBinder binder, Expression[] args, Fallback fallback, Fallback fallbackInvoke = null) + { + // + // First, call fallback to do default binding + // This produces either an error or a call to a .NET member + // + DynamicMetaObject fallbackResult = fallback(null); + + DynamicMetaObject callDynamic = BuildCallMethodWithResult(methodName, binder, args, fallbackResult, fallbackInvoke); + + // + // Now, call fallback again using our new MO as the error + // When we do this, one of two things can happen: + // 1. Binding will succeed, and it will ignore our call to + // the dynamic method, OR + // 2. Binding will fail, and it will use the MO we created + // above. + // + + return _dontFallbackFirst ? callDynamic : fallback(callDynamic); + } + + private DynamicMetaObject BuildCallMethodWithResult(string methodName, DynamicMetaObjectBinder binder, Expression[] args, DynamicMetaObject fallbackResult, Fallback fallbackInvoke) + { + // + // Build a new expression like: + // { + // object result; + // TryGetMember(payload, out result) ? fallbackInvoke(result) : fallbackResult + // } + // + ParameterExpression result = Expression.Parameter(typeof(object), null); + + IList callArgs = new List(); + callArgs.Add(Expression.Convert(Expression, typeof(T))); + callArgs.Add(Constant(binder)); + callArgs.AddRange(args); + callArgs.Add(result); + + DynamicMetaObject resultMetaObject = new DynamicMetaObject(result, BindingRestrictions.Empty); + + // Need to add a conversion if calling TryConvert + if (binder.ReturnType != typeof(object)) + { + UnaryExpression convert = Expression.Convert(resultMetaObject.Expression, binder.ReturnType); + // will always be a cast or unbox + + resultMetaObject = new DynamicMetaObject(convert, resultMetaObject.Restrictions); + } + + if (fallbackInvoke != null) + { + resultMetaObject = fallbackInvoke(resultMetaObject); + } + + DynamicMetaObject callDynamic = new DynamicMetaObject( + Expression.Block( + new[] { result }, + Expression.Condition( + Expression.Call( + Expression.Constant(_proxy), + typeof(DynamicProxy).GetMethod(methodName), + callArgs + ), + resultMetaObject.Expression, + fallbackResult.Expression, + binder.ReturnType + ) + ), + GetRestrictions().Merge(resultMetaObject.Restrictions).Merge(fallbackResult.Restrictions) + ); + + return callDynamic; + } + + /// + /// Helper method for generating a MetaObject which calls a + /// specific method on Dynamic, but uses one of the arguments for + /// the result. + /// + private DynamicMetaObject CallMethodReturnLast(string methodName, DynamicMetaObjectBinder binder, Expression[] args, Fallback fallback) + { + // + // First, call fallback to do default binding + // This produces either an error or a call to a .NET member + // + DynamicMetaObject fallbackResult = fallback(null); + + // + // Build a new expression like: + // { + // object result; + // TrySetMember(payload, result = value) ? result : fallbackResult + // } + // + ParameterExpression result = Expression.Parameter(typeof(object), null); + + IList callArgs = new List(); + callArgs.Add(Expression.Convert(Expression, typeof(T))); + callArgs.Add(Constant(binder)); + callArgs.AddRange(args); + callArgs[args.Length + 1] = Expression.Assign(result, callArgs[args.Length + 1]); + + DynamicMetaObject callDynamic = new DynamicMetaObject( + Expression.Block( + new[] { result }, + Expression.Condition( + Expression.Call( + Expression.Constant(_proxy), + typeof(DynamicProxy).GetMethod(methodName), + callArgs + ), + result, + fallbackResult.Expression, + typeof(object) + ) + ), + GetRestrictions().Merge(fallbackResult.Restrictions) + ); + + // + // Now, call fallback again using our new MO as the error + // When we do this, one of two things can happen: + // 1. Binding will succeed, and it will ignore our call to + // the dynamic method, OR + // 2. Binding will fail, and it will use the MO we created + // above. + // + return _dontFallbackFirst ? callDynamic : fallback(callDynamic); + } + + /// + /// Helper method for generating a MetaObject which calls a + /// specific method on Dynamic, but uses one of the arguments for + /// the result. + /// + private DynamicMetaObject CallMethodNoResult(string methodName, DynamicMetaObjectBinder binder, Expression[] args, Fallback fallback) + { + // + // First, call fallback to do default binding + // This produces either an error or a call to a .NET member + // + DynamicMetaObject fallbackResult = fallback(null); + + IList callArgs = new List(); + callArgs.Add(Expression.Convert(Expression, typeof(T))); + callArgs.Add(Constant(binder)); + callArgs.AddRange(args); + + // + // Build a new expression like: + // if (TryDeleteMember(payload)) { } else { fallbackResult } + // + DynamicMetaObject callDynamic = new DynamicMetaObject( + Expression.Condition( + Expression.Call( + Expression.Constant(_proxy), + typeof(DynamicProxy).GetMethod(methodName), + callArgs + ), + Expression.Empty(), + fallbackResult.Expression, + typeof(void) + ), + GetRestrictions().Merge(fallbackResult.Restrictions) + ); + + // + // Now, call fallback again using our new MO as the error + // When we do this, one of two things can happen: + // 1. Binding will succeed, and it will ignore our call to + // the dynamic method, OR + // 2. Binding will fail, and it will use the MO we created + // above. + // + return _dontFallbackFirst ? callDynamic : fallback(callDynamic); + } + + /// + /// Returns a Restrictions object which includes our current restrictions merged + /// with a restriction limiting our type + /// + private BindingRestrictions GetRestrictions() + { + return (Value == null && HasValue) + ? BindingRestrictions.GetInstanceRestriction(Expression, null) + : BindingRestrictions.GetTypeRestriction(Expression, LimitType); + } + + public override IEnumerable GetDynamicMemberNames() + { + return _proxy.GetDynamicMemberNames(Value); + } + + // It is okay to throw NotSupported from this binder. This object + // is only used by DynamicObject.GetMember--it is not expected to + // (and cannot) implement binding semantics. It is just so the DO + // can use the Name and IgnoreCase properties. + private sealed class GetBinderAdapter : GetMemberBinder + { + internal GetBinderAdapter(InvokeMemberBinder binder) : + base(binder.Name, binder.IgnoreCase) + { + } + + public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion) + { + throw new NotSupportedException(); + } + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/DynamicReflectionDelegateFactory.cs b/Common/00-1Json8.3/Json8.3/Utilities/DynamicReflectionDelegateFactory.cs new file mode 100644 index 0000000..13cfe7b --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/DynamicReflectionDelegateFactory.cs @@ -0,0 +1,360 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(DOTNET || PORTABLE || PORTABLE40) +using System; +using System.Collections.Generic; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#endif +using System.Reflection; +using System.Reflection.Emit; +using Newtonsoft.Json.Serialization; +using System.Globalization; + +namespace Newtonsoft.Json.Utilities +{ + internal class DynamicReflectionDelegateFactory : ReflectionDelegateFactory + { + public static DynamicReflectionDelegateFactory Instance = new DynamicReflectionDelegateFactory(); + + private static DynamicMethod CreateDynamicMethod(string name, Type returnType, Type[] parameterTypes, Type owner) + { + DynamicMethod dynamicMethod = !owner.IsInterface() + ? new DynamicMethod(name, returnType, parameterTypes, owner, true) + : new DynamicMethod(name, returnType, parameterTypes, owner.Module, true); + + return dynamicMethod; + } + + public override ObjectConstructor CreateParameterizedConstructor(MethodBase method) + { + DynamicMethod dynamicMethod = CreateDynamicMethod(method.ToString(), typeof(object), new[] { typeof(object[]) }, method.DeclaringType); + ILGenerator generator = dynamicMethod.GetILGenerator(); + + GenerateCreateMethodCallIL(method, generator, 0); + + return (ObjectConstructor)dynamicMethod.CreateDelegate(typeof(ObjectConstructor)); + } + + public override MethodCall CreateMethodCall(MethodBase method) + { + DynamicMethod dynamicMethod = CreateDynamicMethod(method.ToString(), typeof(object), new[] { typeof(object), typeof(object[]) }, method.DeclaringType); + ILGenerator generator = dynamicMethod.GetILGenerator(); + + GenerateCreateMethodCallIL(method, generator, 1); + + return (MethodCall)dynamicMethod.CreateDelegate(typeof(MethodCall)); + } + + private void GenerateCreateMethodCallIL(MethodBase method, ILGenerator generator, int argsIndex) + { + ParameterInfo[] args = method.GetParameters(); + + Label argsOk = generator.DefineLabel(); + + // throw an error if the number of argument values doesn't match method parameters + generator.Emit(OpCodes.Ldarg, argsIndex); + generator.Emit(OpCodes.Ldlen); + generator.Emit(OpCodes.Ldc_I4, args.Length); + generator.Emit(OpCodes.Beq, argsOk); + generator.Emit(OpCodes.Newobj, typeof(TargetParameterCountException).GetConstructor(ReflectionUtils.EmptyTypes)); + generator.Emit(OpCodes.Throw); + + generator.MarkLabel(argsOk); + + if (!method.IsConstructor && !method.IsStatic) + { + generator.PushInstance(method.DeclaringType); + } + + int localVariableCount = 0; + + for (int i = 0; i < args.Length; i++) + { + ParameterInfo parameter = args[i]; + Type parameterType = parameter.ParameterType; + + if (parameterType.IsByRef) + { + parameterType = parameterType.GetElementType(); + + LocalBuilder localVariable = generator.DeclareLocal(parameterType); + + // don't need to set variable for 'out' parameter + if (!parameter.IsOut) + { + generator.PushArrayInstance(argsIndex, i); + + if (parameterType.IsValueType()) + { + Label skipSettingDefault = generator.DefineLabel(); + Label finishedProcessingParameter = generator.DefineLabel(); + + // check if parameter is not null + generator.Emit(OpCodes.Brtrue_S, skipSettingDefault); + + // parameter has no value, initialize to default + generator.Emit(OpCodes.Ldloca_S, localVariable); + generator.Emit(OpCodes.Initobj, parameterType); + generator.Emit(OpCodes.Br_S, finishedProcessingParameter); + + // parameter has value, get value from array again and unbox and set to variable + generator.MarkLabel(skipSettingDefault); + generator.PushArrayInstance(argsIndex, i); + generator.UnboxIfNeeded(parameterType); + generator.Emit(OpCodes.Stloc, localVariableCount); + + // parameter finished, we out! + generator.MarkLabel(finishedProcessingParameter); + } + else + { + generator.UnboxIfNeeded(parameterType); + generator.Emit(OpCodes.Stloc, localVariableCount); + } + } + + generator.Emit(OpCodes.Ldloca_S, localVariable); + + localVariableCount++; + } + else if (parameterType.IsValueType()) + { + generator.PushArrayInstance(argsIndex, i); + + // have to check that value type parameters aren't null + // otherwise they will error when unboxed + Label skipSettingDefault = generator.DefineLabel(); + Label finishedProcessingParameter = generator.DefineLabel(); + + // check if parameter is not null + generator.Emit(OpCodes.Brtrue_S, skipSettingDefault); + + // parameter has no value, initialize to default + LocalBuilder localVariable = generator.DeclareLocal(parameterType); + generator.Emit(OpCodes.Ldloca_S, localVariable); + generator.Emit(OpCodes.Initobj, parameterType); + generator.Emit(OpCodes.Ldloc, localVariableCount); + generator.Emit(OpCodes.Br_S, finishedProcessingParameter); + + // parameter has value, get value from array again and unbox + generator.MarkLabel(skipSettingDefault); + generator.PushArrayInstance(argsIndex, i); + generator.UnboxIfNeeded(parameterType); + + // parameter finished, we out! + generator.MarkLabel(finishedProcessingParameter); + localVariableCount++; + } + else + { + generator.PushArrayInstance(argsIndex, i); + + generator.UnboxIfNeeded(parameterType); + } + } + + if (method.IsConstructor) + { + generator.Emit(OpCodes.Newobj, (ConstructorInfo)method); + } + else + { + generator.CallMethod((MethodInfo)method); + } + + Type returnType = method.IsConstructor + ? method.DeclaringType + : ((MethodInfo)method).ReturnType; + + if (returnType != typeof(void)) + { + generator.BoxIfNeeded(returnType); + } + else + { + generator.Emit(OpCodes.Ldnull); + } + + generator.Return(); + } + + public override Func CreateDefaultConstructor(Type type) + { + DynamicMethod dynamicMethod = CreateDynamicMethod("Create" + type.FullName, typeof(T), ReflectionUtils.EmptyTypes, type); + dynamicMethod.InitLocals = true; + ILGenerator generator = dynamicMethod.GetILGenerator(); + + GenerateCreateDefaultConstructorIL(type, generator); + + return (Func)dynamicMethod.CreateDelegate(typeof(Func)); + } + + private void GenerateCreateDefaultConstructorIL(Type type, ILGenerator generator) + { + if (type.IsValueType()) + { + generator.DeclareLocal(type); + generator.Emit(OpCodes.Ldloc_0); + generator.Emit(OpCodes.Box, type); + } + else + { + ConstructorInfo constructorInfo = + type.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, + ReflectionUtils.EmptyTypes, null); + + if (constructorInfo == null) + { + throw new ArgumentException("Could not get constructor for {0}.".FormatWith(CultureInfo.InvariantCulture, type)); + } + + generator.Emit(OpCodes.Newobj, constructorInfo); + } + + generator.Return(); + } + + public override Func CreateGet(PropertyInfo propertyInfo) + { + DynamicMethod dynamicMethod = CreateDynamicMethod("Get" + propertyInfo.Name, typeof(T), new[] { typeof(object) }, propertyInfo.DeclaringType); + ILGenerator generator = dynamicMethod.GetILGenerator(); + + GenerateCreateGetPropertyIL(propertyInfo, generator); + + return (Func)dynamicMethod.CreateDelegate(typeof(Func)); + } + + private void GenerateCreateGetPropertyIL(PropertyInfo propertyInfo, ILGenerator generator) + { + MethodInfo getMethod = propertyInfo.GetGetMethod(true); + if (getMethod == null) + { + throw new ArgumentException("Property '{0}' does not have a getter.".FormatWith(CultureInfo.InvariantCulture, propertyInfo.Name)); + } + + if (!getMethod.IsStatic) + { + generator.PushInstance(propertyInfo.DeclaringType); + } + + generator.CallMethod(getMethod); + generator.BoxIfNeeded(propertyInfo.PropertyType); + generator.Return(); + } + + public override Func CreateGet(FieldInfo fieldInfo) + { + if (fieldInfo.IsLiteral) + { + object constantValue = fieldInfo.GetValue(null); + Func getter = o => constantValue; + return getter; + } + + DynamicMethod dynamicMethod = CreateDynamicMethod("Get" + fieldInfo.Name, typeof(T), new[] { typeof(object) }, fieldInfo.DeclaringType); + ILGenerator generator = dynamicMethod.GetILGenerator(); + + GenerateCreateGetFieldIL(fieldInfo, generator); + + return (Func)dynamicMethod.CreateDelegate(typeof(Func)); + } + + private void GenerateCreateGetFieldIL(FieldInfo fieldInfo, ILGenerator generator) + { + if (!fieldInfo.IsStatic) + { + generator.PushInstance(fieldInfo.DeclaringType); + generator.Emit(OpCodes.Ldfld, fieldInfo); + } + else + { + generator.Emit(OpCodes.Ldsfld, fieldInfo); + } + + generator.BoxIfNeeded(fieldInfo.FieldType); + generator.Return(); + } + + public override Action CreateSet(FieldInfo fieldInfo) + { + DynamicMethod dynamicMethod = CreateDynamicMethod("Set" + fieldInfo.Name, null, new[] { typeof(T), typeof(object) }, fieldInfo.DeclaringType); + ILGenerator generator = dynamicMethod.GetILGenerator(); + + GenerateCreateSetFieldIL(fieldInfo, generator); + + return (Action)dynamicMethod.CreateDelegate(typeof(Action)); + } + + internal static void GenerateCreateSetFieldIL(FieldInfo fieldInfo, ILGenerator generator) + { + if (!fieldInfo.IsStatic) + { + generator.PushInstance(fieldInfo.DeclaringType); + } + + generator.Emit(OpCodes.Ldarg_1); + generator.UnboxIfNeeded(fieldInfo.FieldType); + + if (!fieldInfo.IsStatic) + { + generator.Emit(OpCodes.Stfld, fieldInfo); + } + else + { + generator.Emit(OpCodes.Stsfld, fieldInfo); + } + + generator.Return(); + } + + public override Action CreateSet(PropertyInfo propertyInfo) + { + DynamicMethod dynamicMethod = CreateDynamicMethod("Set" + propertyInfo.Name, null, new[] { typeof(T), typeof(object) }, propertyInfo.DeclaringType); + ILGenerator generator = dynamicMethod.GetILGenerator(); + + GenerateCreateSetPropertyIL(propertyInfo, generator); + + return (Action)dynamicMethod.CreateDelegate(typeof(Action)); + } + + internal static void GenerateCreateSetPropertyIL(PropertyInfo propertyInfo, ILGenerator generator) + { + MethodInfo setMethod = propertyInfo.GetSetMethod(true); + if (!setMethod.IsStatic) + { + generator.PushInstance(propertyInfo.DeclaringType); + } + + generator.Emit(OpCodes.Ldarg_1); + generator.UnboxIfNeeded(propertyInfo.PropertyType); + generator.CallMethod(setMethod); + generator.Return(); + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/DynamicUtils.cs b/Common/00-1Json8.3/Json8.3/Utilities/DynamicUtils.cs new file mode 100644 index 0000000..a83d311 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/DynamicUtils.cs @@ -0,0 +1,210 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(NET35 || NET20 || PORTABLE40) +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Linq.Expressions; +#if !(PORTABLE) +using System.Reflection; +#else +using Microsoft.CSharp.RuntimeBinder; +#endif +using System.Runtime.CompilerServices; +using System.Text; +using System.Globalization; +using Newtonsoft.Json.Serialization; + +namespace Newtonsoft.Json.Utilities +{ + internal static class DynamicUtils + { + internal static class BinderWrapper + { +#if !(PORTABLE) + public const string CSharpAssemblyName = "Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; + + private const string BinderTypeName = "Microsoft.CSharp.RuntimeBinder.Binder, " + CSharpAssemblyName; + private const string CSharpArgumentInfoTypeName = "Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo, " + CSharpAssemblyName; + private const string CSharpArgumentInfoFlagsTypeName = "Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, " + CSharpAssemblyName; + private const string CSharpBinderFlagsTypeName = "Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags, " + CSharpAssemblyName; + + private static object _getCSharpArgumentInfoArray; + private static object _setCSharpArgumentInfoArray; + private static MethodCall _getMemberCall; + private static MethodCall _setMemberCall; + private static bool _init; + + private static void Init() + { + if (!_init) + { + Type binderType = Type.GetType(BinderTypeName, false); + if (binderType == null) + { + throw new InvalidOperationException("Could not resolve type '{0}'. You may need to add a reference to Microsoft.CSharp.dll to work with dynamic types.".FormatWith(CultureInfo.InvariantCulture, BinderTypeName)); + } + + // None + _getCSharpArgumentInfoArray = CreateSharpArgumentInfoArray(0); + // None, Constant | UseCompileTimeType + _setCSharpArgumentInfoArray = CreateSharpArgumentInfoArray(0, 3); + CreateMemberCalls(); + + _init = true; + } + } + + private static object CreateSharpArgumentInfoArray(params int[] values) + { + Type csharpArgumentInfoType = Type.GetType(CSharpArgumentInfoTypeName); + Type csharpArgumentInfoFlags = Type.GetType(CSharpArgumentInfoFlagsTypeName); + + Array a = Array.CreateInstance(csharpArgumentInfoType, values.Length); + + for (int i = 0; i < values.Length; i++) + { + MethodInfo createArgumentInfoMethod = csharpArgumentInfoType.GetMethod("Create", new[] { csharpArgumentInfoFlags, typeof(string) }); + object arg = createArgumentInfoMethod.Invoke(null, new object[] { 0, null }); + a.SetValue(arg, i); + } + + return a; + } + + private static void CreateMemberCalls() + { + Type csharpArgumentInfoType = Type.GetType(CSharpArgumentInfoTypeName, true); + Type csharpBinderFlagsType = Type.GetType(CSharpBinderFlagsTypeName, true); + Type binderType = Type.GetType(BinderTypeName, true); + + Type csharpArgumentInfoTypeEnumerableType = typeof(IEnumerable<>).MakeGenericType(csharpArgumentInfoType); + + MethodInfo getMemberMethod = binderType.GetMethod("GetMember", new[] { csharpBinderFlagsType, typeof(string), typeof(Type), csharpArgumentInfoTypeEnumerableType }); + _getMemberCall = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall(getMemberMethod); + + MethodInfo setMemberMethod = binderType.GetMethod("SetMember", new[] { csharpBinderFlagsType, typeof(string), typeof(Type), csharpArgumentInfoTypeEnumerableType }); + _setMemberCall = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall(setMemberMethod); + } +#endif + + public static CallSiteBinder GetMember(string name, Type context) + { +#if !(PORTABLE) + Init(); + return (CallSiteBinder)_getMemberCall(null, 0, name, context, _getCSharpArgumentInfoArray); +#else + return Binder.GetMember( + CSharpBinderFlags.None, name, context, new[] {CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)}); +#endif + } + + public static CallSiteBinder SetMember(string name, Type context) + { +#if !(PORTABLE) + Init(); + return (CallSiteBinder)_setMemberCall(null, 0, name, context, _setCSharpArgumentInfoArray); +#else + return Binder.SetMember( + CSharpBinderFlags.None, name, context, new[] + { + CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType, null), + CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.Constant, null) + }); +#endif + } + } + + public static IEnumerable GetDynamicMemberNames(this IDynamicMetaObjectProvider dynamicProvider) + { + DynamicMetaObject metaObject = dynamicProvider.GetMetaObject(Expression.Constant(dynamicProvider)); + return metaObject.GetDynamicMemberNames(); + } + } + + internal class NoThrowGetBinderMember : GetMemberBinder + { + private readonly GetMemberBinder _innerBinder; + + public NoThrowGetBinderMember(GetMemberBinder innerBinder) + : base(innerBinder.Name, innerBinder.IgnoreCase) + { + _innerBinder = innerBinder; + } + + public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion) + { + DynamicMetaObject retMetaObject = _innerBinder.Bind(target, new DynamicMetaObject[] { }); + + NoThrowExpressionVisitor noThrowVisitor = new NoThrowExpressionVisitor(); + Expression resultExpression = noThrowVisitor.Visit(retMetaObject.Expression); + + DynamicMetaObject finalMetaObject = new DynamicMetaObject(resultExpression, retMetaObject.Restrictions); + return finalMetaObject; + } + } + + internal class NoThrowSetBinderMember : SetMemberBinder + { + private readonly SetMemberBinder _innerBinder; + + public NoThrowSetBinderMember(SetMemberBinder innerBinder) + : base(innerBinder.Name, innerBinder.IgnoreCase) + { + _innerBinder = innerBinder; + } + + public override DynamicMetaObject FallbackSetMember(DynamicMetaObject target, DynamicMetaObject value, DynamicMetaObject errorSuggestion) + { + DynamicMetaObject retMetaObject = _innerBinder.Bind(target, new DynamicMetaObject[] { value }); + + NoThrowExpressionVisitor noThrowVisitor = new NoThrowExpressionVisitor(); + Expression resultExpression = noThrowVisitor.Visit(retMetaObject.Expression); + + DynamicMetaObject finalMetaObject = new DynamicMetaObject(resultExpression, retMetaObject.Restrictions); + return finalMetaObject; + } + } + + internal class NoThrowExpressionVisitor : ExpressionVisitor + { + internal static readonly object ErrorResult = new object(); + + protected override Expression VisitConditional(ConditionalExpression node) + { + // if the result of a test is to throw an error, rewrite to result an error result value + if (node.IfFalse.NodeType == ExpressionType.Throw) + { + return Expression.Condition(node.Test, node.IfTrue, Expression.Constant(ErrorResult)); + } + + return base.VisitConditional(node); + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/EnumUtils.cs b/Common/00-1Json8.3/Json8.3/Utilities/EnumUtils.cs new file mode 100644 index 0000000..69d33dc --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/EnumUtils.cs @@ -0,0 +1,257 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Runtime.Serialization; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; +#endif +using System.Reflection; + +namespace Newtonsoft.Json.Utilities +{ + internal static class EnumUtils + { + private static readonly ThreadSafeStore> EnumMemberNamesPerType = new ThreadSafeStore>(InitializeEnumType); + + private static BidirectionalDictionary InitializeEnumType(Type type) + { + BidirectionalDictionary map = new BidirectionalDictionary( + StringComparer.OrdinalIgnoreCase, + StringComparer.OrdinalIgnoreCase); + + foreach (FieldInfo f in type.GetFields()) + { + string n1 = f.Name; + string n2; + +#if !NET20 + n2 = f.GetCustomAttributes(typeof(EnumMemberAttribute), true) + .Cast() + .Select(a => a.Value) + .SingleOrDefault() ?? f.Name; +#else + n2 = f.Name; +#endif + + string s; + if (map.TryGetBySecond(n2, out s)) + { + throw new InvalidOperationException("Enum name '{0}' already exists on enum '{1}'.".FormatWith(CultureInfo.InvariantCulture, n2, type.Name)); + } + + map.Set(n1, n2); + } + + return map; + } + + public static IList GetFlagsValues(T value) where T : struct + { + Type enumType = typeof(T); + + if (!enumType.IsDefined(typeof(FlagsAttribute), false)) + { + throw new ArgumentException("Enum type {0} is not a set of flags.".FormatWith(CultureInfo.InvariantCulture, enumType)); + } + + Type underlyingType = Enum.GetUnderlyingType(value.GetType()); + + ulong num = Convert.ToUInt64(value, CultureInfo.InvariantCulture); + IList> enumNameValues = GetNamesAndValues(); + IList selectedFlagsValues = new List(); + + foreach (EnumValue enumNameValue in enumNameValues) + { + if ((num & enumNameValue.Value) == enumNameValue.Value && enumNameValue.Value != 0) + { + selectedFlagsValues.Add((T)Convert.ChangeType(enumNameValue.Value, underlyingType, CultureInfo.CurrentCulture)); + } + } + + if (selectedFlagsValues.Count == 0 && enumNameValues.SingleOrDefault(v => v.Value == 0) != null) + { + selectedFlagsValues.Add(default(T)); + } + + return selectedFlagsValues; + } + + /// + /// Gets a dictionary of the names and values of an Enum type. + /// + /// + public static IList> GetNamesAndValues() where T : struct + { + return GetNamesAndValues(typeof(T)); + } + + /// + /// Gets a dictionary of the names and values of an Enum type. + /// + /// The enum type to get names and values for. + /// + public static IList> GetNamesAndValues(Type enumType) where TUnderlyingType : struct + { + if (enumType == null) + { + throw new ArgumentNullException(nameof(enumType)); + } + + if (!enumType.IsEnum()) + { + throw new ArgumentException("Type {0} is not an Enum.".FormatWith(CultureInfo.InvariantCulture, enumType), nameof(enumType)); + } + + IList enumValues = GetValues(enumType); + IList enumNames = GetNames(enumType); + + IList> nameValues = new List>(); + + for (int i = 0; i < enumValues.Count; i++) + { + try + { + nameValues.Add(new EnumValue(enumNames[i], (TUnderlyingType)Convert.ChangeType(enumValues[i], typeof(TUnderlyingType), CultureInfo.CurrentCulture))); + } + catch (OverflowException e) + { + throw new InvalidOperationException( + string.Format(CultureInfo.InvariantCulture, "Value from enum with the underlying type of {0} cannot be added to dictionary with a value type of {1}. Value was too large: {2}", + Enum.GetUnderlyingType(enumType), typeof(TUnderlyingType), Convert.ToUInt64(enumValues[i], CultureInfo.InvariantCulture)), e); + } + } + + return nameValues; + } + + public static IList GetValues(Type enumType) + { + if (!enumType.IsEnum()) + { + throw new ArgumentException("Type '" + enumType.Name + "' is not an enum."); + } + + List values = new List(); + + var fields = enumType.GetFields().Where(f => f.IsLiteral); + + foreach (FieldInfo field in fields) + { + object value = field.GetValue(enumType); + values.Add(value); + } + + return values; + } + + public static IList GetNames(Type enumType) + { + if (!enumType.IsEnum()) + { + throw new ArgumentException("Type '" + enumType.Name + "' is not an enum."); + } + + List values = new List(); + + var fields = enumType.GetFields().Where(f => f.IsLiteral); + + foreach (FieldInfo field in fields) + { + values.Add(field.Name); + } + + return values; + } + + public static object ParseEnumName(string enumText, bool isNullable, Type t) + { + if (enumText == string.Empty && isNullable) + { + return null; + } + + string finalEnumText; + + BidirectionalDictionary map = EnumMemberNamesPerType.Get(t); + if (enumText.IndexOf(',') != -1) + { + string[] names = enumText.Split(','); + for (int i = 0; i < names.Length; i++) + { + string name = names[i].Trim(); + + names[i] = ResolvedEnumName(map, name); + } + + finalEnumText = string.Join(", ", names); + } + else + { + finalEnumText = ResolvedEnumName(map, enumText); + } + + return Enum.Parse(t, finalEnumText, true); + } + + public static string ToEnumName(Type enumType, string enumText, bool camelCaseText) + { + BidirectionalDictionary map = EnumMemberNamesPerType.Get(enumType); + + string[] names = enumText.Split(','); + for (int i = 0; i < names.Length; i++) + { + string name = names[i].Trim(); + + string resolvedEnumName; + map.TryGetByFirst(name, out resolvedEnumName); + resolvedEnumName = resolvedEnumName ?? name; + + if (camelCaseText) + { + resolvedEnumName = StringUtils.ToCamelCase(resolvedEnumName); + } + + names[i] = resolvedEnumName; + } + + string finalName = string.Join(", ", names); + + return finalName; + } + + private static string ResolvedEnumName(BidirectionalDictionary map, string enumText) + { + string resolvedEnumName; + map.TryGetBySecond(enumText, out resolvedEnumName); + resolvedEnumName = resolvedEnumName ?? enumText; + return resolvedEnumName; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/EnumValue.cs b/Common/00-1Json8.3/Json8.3/Utilities/EnumValue.cs new file mode 100644 index 0000000..c672ead --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/EnumValue.cs @@ -0,0 +1,49 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +namespace Newtonsoft.Json.Utilities +{ + internal class EnumValue where T : struct + { + private readonly string _name; + private readonly T _value; + + public string Name + { + get { return _name; } + } + + public T Value + { + get { return _value; } + } + + public EnumValue(string name, T value) + { + _name = name; + _value = value; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/ExpressionReflectionDelegateFactory.cs b/Common/00-1Json8.3/Json8.3/Utilities/ExpressionReflectionDelegateFactory.cs new file mode 100644 index 0000000..0204262 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/ExpressionReflectionDelegateFactory.cs @@ -0,0 +1,368 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(NET20 || NET35) +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System; +using System.Linq.Expressions; +using System.Reflection; +using Newtonsoft.Json.Serialization; + +namespace Newtonsoft.Json.Utilities +{ + internal class ExpressionReflectionDelegateFactory : ReflectionDelegateFactory + { + private static readonly ExpressionReflectionDelegateFactory _instance = new ExpressionReflectionDelegateFactory(); + + internal static ReflectionDelegateFactory Instance + { + get { return _instance; } + } + + public override ObjectConstructor CreateParameterizedConstructor(MethodBase method) + { + ValidationUtils.ArgumentNotNull(method, nameof(method)); + + Type type = typeof(object); + + ParameterExpression argsParameterExpression = Expression.Parameter(typeof(object[]), "args"); + + Expression callExpression = BuildMethodCall(method, type, null, argsParameterExpression); + + LambdaExpression lambdaExpression = Expression.Lambda(typeof(ObjectConstructor), callExpression, argsParameterExpression); + + ObjectConstructor compiled = (ObjectConstructor)lambdaExpression.Compile(); + return compiled; + } + + public override MethodCall CreateMethodCall(MethodBase method) + { + ValidationUtils.ArgumentNotNull(method, nameof(method)); + + Type type = typeof(object); + + ParameterExpression targetParameterExpression = Expression.Parameter(type, "target"); + ParameterExpression argsParameterExpression = Expression.Parameter(typeof(object[]), "args"); + + Expression callExpression = BuildMethodCall(method, type, targetParameterExpression, argsParameterExpression); + + LambdaExpression lambdaExpression = Expression.Lambda(typeof(MethodCall), callExpression, targetParameterExpression, argsParameterExpression); + + MethodCall compiled = (MethodCall)lambdaExpression.Compile(); + return compiled; + } + + private class ByRefParameter + { + public Expression Value; + public ParameterExpression Variable; + public bool IsOut; + } + + private Expression BuildMethodCall(MethodBase method, Type type, ParameterExpression targetParameterExpression, ParameterExpression argsParameterExpression) + { + ParameterInfo[] parametersInfo = method.GetParameters(); + + Expression[] argsExpression = new Expression[parametersInfo.Length]; + IList refParameterMap = new List(); + + for (int i = 0; i < parametersInfo.Length; i++) + { + ParameterInfo parameter = parametersInfo[i]; + Type parameterType = parameter.ParameterType; + bool isByRef = false; + if (parameterType.IsByRef) + { + parameterType = parameterType.GetElementType(); + isByRef = true; + } + + Expression indexExpression = Expression.Constant(i); + + Expression paramAccessorExpression = Expression.ArrayIndex(argsParameterExpression, indexExpression); + + Expression argExpression; + + if (parameterType.IsValueType()) + { + BinaryExpression ensureValueTypeNotNull = Expression.Coalesce(paramAccessorExpression, Expression.New(parameterType)); + + argExpression = EnsureCastExpression(ensureValueTypeNotNull, parameterType); + } + else + { + argExpression = EnsureCastExpression(paramAccessorExpression, parameterType); + } + + if (isByRef) + { + ParameterExpression variable = Expression.Variable(parameterType); + refParameterMap.Add(new ByRefParameter + { + Value = argExpression, + Variable = variable, + IsOut = parameter.IsOut + }); + + argExpression = variable; + } + + argsExpression[i] = argExpression; + } + + Expression callExpression; + if (method.IsConstructor) + { + callExpression = Expression.New((ConstructorInfo)method, argsExpression); + } + else if (method.IsStatic) + { + callExpression = Expression.Call((MethodInfo)method, argsExpression); + } + else + { + Expression readParameter = EnsureCastExpression(targetParameterExpression, method.DeclaringType); + + callExpression = Expression.Call(readParameter, (MethodInfo)method, argsExpression); + } + + if (method is MethodInfo) + { + MethodInfo m = (MethodInfo)method; + if (m.ReturnType != typeof(void)) + { + callExpression = EnsureCastExpression(callExpression, type); + } + else + { + callExpression = Expression.Block(callExpression, Expression.Constant(null)); + } + } + else + { + callExpression = EnsureCastExpression(callExpression, type); + } + + if (refParameterMap.Count > 0) + { + IList variableExpressions = new List(); + IList bodyExpressions = new List(); + foreach (ByRefParameter p in refParameterMap) + { + if (!p.IsOut) + { + bodyExpressions.Add(Expression.Assign(p.Variable, p.Value)); + } + + variableExpressions.Add(p.Variable); + } + + bodyExpressions.Add(callExpression); + + callExpression = Expression.Block(variableExpressions, bodyExpressions); + } + + return callExpression; + } + + public override Func CreateDefaultConstructor(Type type) + { + ValidationUtils.ArgumentNotNull(type, "type"); + + // avoid error from expressions compiler because of abstract class + if (type.IsAbstract()) + { + return () => (T)Activator.CreateInstance(type); + } + + try + { + Type resultType = typeof(T); + + Expression expression = Expression.New(type); + + expression = EnsureCastExpression(expression, resultType); + + LambdaExpression lambdaExpression = Expression.Lambda(typeof(Func), expression); + + Func compiled = (Func)lambdaExpression.Compile(); + return compiled; + } + catch + { + // an error can be thrown if constructor is not valid on Win8 + // will have INVOCATION_FLAGS_NON_W8P_FX_API invocation flag + return () => (T)Activator.CreateInstance(type); + } + } + + public override Func CreateGet(PropertyInfo propertyInfo) + { + ValidationUtils.ArgumentNotNull(propertyInfo, nameof(propertyInfo)); + + Type instanceType = typeof(T); + Type resultType = typeof(object); + + ParameterExpression parameterExpression = Expression.Parameter(instanceType, "instance"); + Expression resultExpression; + + MethodInfo getMethod = propertyInfo.GetGetMethod(true); + + if (getMethod.IsStatic) + { + resultExpression = Expression.MakeMemberAccess(null, propertyInfo); + } + else + { + Expression readParameter = EnsureCastExpression(parameterExpression, propertyInfo.DeclaringType); + + resultExpression = Expression.MakeMemberAccess(readParameter, propertyInfo); + } + + resultExpression = EnsureCastExpression(resultExpression, resultType); + + LambdaExpression lambdaExpression = Expression.Lambda(typeof(Func), resultExpression, parameterExpression); + + Func compiled = (Func)lambdaExpression.Compile(); + return compiled; + } + + public override Func CreateGet(FieldInfo fieldInfo) + { + ValidationUtils.ArgumentNotNull(fieldInfo, nameof(fieldInfo)); + + ParameterExpression sourceParameter = Expression.Parameter(typeof(T), "source"); + + Expression fieldExpression; + if (fieldInfo.IsStatic) + { + fieldExpression = Expression.Field(null, fieldInfo); + } + else + { + Expression sourceExpression = EnsureCastExpression(sourceParameter, fieldInfo.DeclaringType); + + fieldExpression = Expression.Field(sourceExpression, fieldInfo); + } + + fieldExpression = EnsureCastExpression(fieldExpression, typeof(object)); + + Func compiled = Expression.Lambda>(fieldExpression, sourceParameter).Compile(); + return compiled; + } + + public override Action CreateSet(FieldInfo fieldInfo) + { + ValidationUtils.ArgumentNotNull(fieldInfo, nameof(fieldInfo)); + + // use reflection for structs + // expression doesn't correctly set value + if (fieldInfo.DeclaringType.IsValueType() || fieldInfo.IsInitOnly) + { + return LateBoundReflectionDelegateFactory.Instance.CreateSet(fieldInfo); + } + + ParameterExpression sourceParameterExpression = Expression.Parameter(typeof(T), "source"); + ParameterExpression valueParameterExpression = Expression.Parameter(typeof(object), "value"); + + Expression fieldExpression; + if (fieldInfo.IsStatic) + { + fieldExpression = Expression.Field(null, fieldInfo); + } + else + { + Expression sourceExpression = EnsureCastExpression(sourceParameterExpression, fieldInfo.DeclaringType); + + fieldExpression = Expression.Field(sourceExpression, fieldInfo); + } + + Expression valueExpression = EnsureCastExpression(valueParameterExpression, fieldExpression.Type); + + BinaryExpression assignExpression = Expression.Assign(fieldExpression, valueExpression); + + LambdaExpression lambdaExpression = Expression.Lambda(typeof(Action), assignExpression, sourceParameterExpression, valueParameterExpression); + + Action compiled = (Action)lambdaExpression.Compile(); + return compiled; + } + + public override Action CreateSet(PropertyInfo propertyInfo) + { + ValidationUtils.ArgumentNotNull(propertyInfo, nameof(propertyInfo)); + + // use reflection for structs + // expression doesn't correctly set value + if (propertyInfo.DeclaringType.IsValueType()) + { + return LateBoundReflectionDelegateFactory.Instance.CreateSet(propertyInfo); + } + + Type instanceType = typeof(T); + Type valueType = typeof(object); + + ParameterExpression instanceParameter = Expression.Parameter(instanceType, "instance"); + + ParameterExpression valueParameter = Expression.Parameter(valueType, "value"); + Expression readValueParameter = EnsureCastExpression(valueParameter, propertyInfo.PropertyType); + + MethodInfo setMethod = propertyInfo.GetSetMethod(true); + + Expression setExpression; + if (setMethod.IsStatic) + { + setExpression = Expression.Call(setMethod, readValueParameter); + } + else + { + Expression readInstanceParameter = EnsureCastExpression(instanceParameter, propertyInfo.DeclaringType); + + setExpression = Expression.Call(readInstanceParameter, setMethod, readValueParameter); + } + + LambdaExpression lambdaExpression = Expression.Lambda(typeof(Action), setExpression, instanceParameter, valueParameter); + + Action compiled = (Action)lambdaExpression.Compile(); + return compiled; + } + + private Expression EnsureCastExpression(Expression expression, Type targetType) + { + Type expressionType = expression.Type; + + // check if a cast or conversion is required + if (expressionType == targetType || (!expressionType.IsValueType() && targetType.IsAssignableFrom(expressionType))) + { + return expression; + } + + return Expression.Convert(expression, targetType); + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/FSharpUtils.cs b/Common/00-1Json8.3/Json8.3/Utilities/FSharpUtils.cs new file mode 100644 index 0000000..f288f1f --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/FSharpUtils.cs @@ -0,0 +1,195 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(NET35 || NET20) +using System.Threading; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using Newtonsoft.Json.Serialization; + +namespace Newtonsoft.Json.Utilities +{ + internal class FSharpFunction + { + private readonly object _instance; + private readonly MethodCall _invoker; + + public FSharpFunction(object instance, MethodCall invoker) + { + _instance = instance; + _invoker = invoker; + } + + public object Invoke(params object[] args) + { + object o = _invoker(_instance, args); + + return o; + } + } + + internal static class FSharpUtils + { + private static readonly object Lock = new object(); + + private static bool _initialized; + private static MethodInfo _ofSeq; + private static Type _mapType; + + public static Assembly FSharpCoreAssembly { get; private set; } + public static MethodCall IsUnion { get; private set; } + public static MethodCall GetUnionCases { get; private set; } + public static MethodCall PreComputeUnionTagReader { get; private set; } + public static MethodCall PreComputeUnionReader { get; private set; } + public static MethodCall PreComputeUnionConstructor { get; private set; } + public static Func GetUnionCaseInfoDeclaringType { get; private set; } + public static Func GetUnionCaseInfoName { get; private set; } + public static Func GetUnionCaseInfoTag { get; private set; } + public static MethodCall GetUnionCaseInfoFields { get; private set; } + + public const string FSharpSetTypeName = "FSharpSet`1"; + public const string FSharpListTypeName = "FSharpList`1"; + public const string FSharpMapTypeName = "FSharpMap`2"; + + public static void EnsureInitialized(Assembly fsharpCoreAssembly) + { + if (!_initialized) + { + lock (Lock) + { + if (!_initialized) + { + FSharpCoreAssembly = fsharpCoreAssembly; + + Type fsharpType = fsharpCoreAssembly.GetType("Microsoft.FSharp.Reflection.FSharpType"); + + MethodInfo isUnionMethodInfo = GetMethodWithNonPublicFallback(fsharpType, "IsUnion", BindingFlags.Public | BindingFlags.Static); + IsUnion = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall(isUnionMethodInfo); + + MethodInfo getUnionCasesMethodInfo = GetMethodWithNonPublicFallback(fsharpType, "GetUnionCases", BindingFlags.Public | BindingFlags.Static); + GetUnionCases = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall(getUnionCasesMethodInfo); + + Type fsharpValue = fsharpCoreAssembly.GetType("Microsoft.FSharp.Reflection.FSharpValue"); + + PreComputeUnionTagReader = CreateFSharpFuncCall(fsharpValue, "PreComputeUnionTagReader"); + PreComputeUnionReader = CreateFSharpFuncCall(fsharpValue, "PreComputeUnionReader"); + PreComputeUnionConstructor = CreateFSharpFuncCall(fsharpValue, "PreComputeUnionConstructor"); + + Type unionCaseInfo = fsharpCoreAssembly.GetType("Microsoft.FSharp.Reflection.UnionCaseInfo"); + + GetUnionCaseInfoName = JsonTypeReflector.ReflectionDelegateFactory.CreateGet(unionCaseInfo.GetProperty("Name")); + GetUnionCaseInfoTag = JsonTypeReflector.ReflectionDelegateFactory.CreateGet(unionCaseInfo.GetProperty("Tag")); + GetUnionCaseInfoDeclaringType = JsonTypeReflector.ReflectionDelegateFactory.CreateGet(unionCaseInfo.GetProperty("DeclaringType")); + GetUnionCaseInfoFields = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall(unionCaseInfo.GetMethod("GetFields")); + + Type listModule = fsharpCoreAssembly.GetType("Microsoft.FSharp.Collections.ListModule"); + _ofSeq = listModule.GetMethod("OfSeq"); + + _mapType = fsharpCoreAssembly.GetType("Microsoft.FSharp.Collections.FSharpMap`2"); + +#if !(DOTNET || PORTABLE) + Thread.MemoryBarrier(); +#endif + _initialized = true; + } + } + } + } + + private static MethodInfo GetMethodWithNonPublicFallback(Type type, string methodName, BindingFlags bindingFlags) + { + MethodInfo methodInfo = type.GetMethod(methodName, bindingFlags); + + // if no matching method then attempt to find with nonpublic flag + // this is required because in WinApps some methods are private but always using NonPublic breaks medium trust + // https://github.com/JamesNK/Newtonsoft.Json/pull/649 + // https://github.com/JamesNK/Newtonsoft.Json/issues/821 + if (methodInfo == null && (bindingFlags & BindingFlags.NonPublic) != BindingFlags.NonPublic) + { + methodInfo = type.GetMethod(methodName, bindingFlags | BindingFlags.NonPublic); + } + + return methodInfo; + } + + private static MethodCall CreateFSharpFuncCall(Type type, string methodName) + { + MethodInfo innerMethodInfo = GetMethodWithNonPublicFallback(type, methodName, BindingFlags.Public | BindingFlags.Static); + MethodInfo invokeFunc = innerMethodInfo.ReturnType.GetMethod("Invoke", BindingFlags.Public | BindingFlags.Instance); + + MethodCall call = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall(innerMethodInfo); + MethodCall invoke = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall(invokeFunc); + + MethodCall createFunction = (target, args) => + { + object result = call(target, args); + + FSharpFunction f = new FSharpFunction(result, invoke); + return f; + }; + + return createFunction; + } + + public static ObjectConstructor CreateSeq(Type t) + { + MethodInfo seqType = _ofSeq.MakeGenericMethod(t); + + return JsonTypeReflector.ReflectionDelegateFactory.CreateParameterizedConstructor(seqType); + } + + public static ObjectConstructor CreateMap(Type keyType, Type valueType) + { + MethodInfo creatorDefinition = typeof(FSharpUtils).GetMethod("BuildMapCreator"); + + MethodInfo creatorGeneric = creatorDefinition.MakeGenericMethod(keyType, valueType); + + return (ObjectConstructor)creatorGeneric.Invoke(null, null); + } + + public static ObjectConstructor BuildMapCreator() + { + Type genericMapType = _mapType.MakeGenericType(typeof(TKey), typeof(TValue)); + ConstructorInfo ctor = genericMapType.GetConstructor(new[] { typeof(IEnumerable>) }); + ObjectConstructor ctorDelegate = JsonTypeReflector.ReflectionDelegateFactory.CreateParameterizedConstructor(ctor); + + ObjectConstructor creator = args => + { + // convert dictionary KeyValuePairs to Tuples + IEnumerable> values = (IEnumerable>)args[0]; + IEnumerable> tupleValues = values.Select(kv => new Tuple(kv.Key, kv.Value)); + + return ctorDelegate(tupleValues); + }; + + return creator; + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/ILGeneratorExtensions.cs b/Common/00-1Json8.3/Json8.3/Utilities/ILGeneratorExtensions.cs new file mode 100644 index 0000000..9173659 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/ILGeneratorExtensions.cs @@ -0,0 +1,98 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(DOTNET || PORTABLE40 || PORTABLE) +using System; +using System.Reflection.Emit; +using System.Reflection; + +namespace Newtonsoft.Json.Utilities +{ + internal static class ILGeneratorExtensions + { + public static void PushInstance(this ILGenerator generator, Type type) + { + generator.Emit(OpCodes.Ldarg_0); + if (type.IsValueType()) + { + generator.Emit(OpCodes.Unbox, type); + } + else + { + generator.Emit(OpCodes.Castclass, type); + } + } + + public static void PushArrayInstance(this ILGenerator generator, int argsIndex, int arrayIndex) + { + generator.Emit(OpCodes.Ldarg, argsIndex); + generator.Emit(OpCodes.Ldc_I4, arrayIndex); + generator.Emit(OpCodes.Ldelem_Ref); + } + + public static void BoxIfNeeded(this ILGenerator generator, Type type) + { + if (type.IsValueType()) + { + generator.Emit(OpCodes.Box, type); + } + else + { + generator.Emit(OpCodes.Castclass, type); + } + } + + public static void UnboxIfNeeded(this ILGenerator generator, Type type) + { + if (type.IsValueType()) + { + generator.Emit(OpCodes.Unbox_Any, type); + } + else + { + generator.Emit(OpCodes.Castclass, type); + } + } + + public static void CallMethod(this ILGenerator generator, MethodInfo methodInfo) + { + if (methodInfo.IsFinal || !methodInfo.IsVirtual) + { + generator.Emit(OpCodes.Call, methodInfo); + } + else + { + generator.Emit(OpCodes.Callvirt, methodInfo); + } + } + + public static void Return(this ILGenerator generator) + { + generator.Emit(OpCodes.Ret); + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/ImmutableCollectionsUtils.cs b/Common/00-1Json8.3/Json8.3/Utilities/ImmutableCollectionsUtils.cs new file mode 100644 index 0000000..46faa85 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/ImmutableCollectionsUtils.cs @@ -0,0 +1,176 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +#if !(NET20 || NET35 || NET40) +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json.Serialization; + +namespace Newtonsoft.Json.Utilities +{ + internal static class ImmutableCollectionsUtils + { + internal class ImmutableCollectionTypeInfo + { + public ImmutableCollectionTypeInfo(string contractTypeName, string createdTypeName, string builderTypeName) + { + ContractTypeName = contractTypeName; + CreatedTypeName = createdTypeName; + BuilderTypeName = builderTypeName; + } + + public string ContractTypeName { get; set; } + public string CreatedTypeName { get; set; } + public string BuilderTypeName { get; set; } + } + + private const string ImmutableListGenericInterfaceTypeName = "System.Collections.Immutable.IImmutableList`1"; + private const string ImmutableQueueGenericInterfaceTypeName = "System.Collections.Immutable.IImmutableQueue`1"; + private const string ImmutableStackGenericInterfaceTypeName = "System.Collections.Immutable.IImmutableStack`1"; + private const string ImmutableSetGenericInterfaceTypeName = "System.Collections.Immutable.IImmutableSet`1"; + + private const string ImmutableArrayTypeName = "System.Collections.Immutable.ImmutableArray"; + private const string ImmutableArrayGenericTypeName = "System.Collections.Immutable.ImmutableArray`1"; + + private const string ImmutableListTypeName = "System.Collections.Immutable.ImmutableList"; + private const string ImmutableListGenericTypeName = "System.Collections.Immutable.ImmutableList`1"; + + private const string ImmutableQueueTypeName = "System.Collections.Immutable.ImmutableQueue"; + private const string ImmutableQueueGenericTypeName = "System.Collections.Immutable.ImmutableQueue`1"; + + private const string ImmutableStackTypeName = "System.Collections.Immutable.ImmutableStack"; + private const string ImmutableStackGenericTypeName = "System.Collections.Immutable.ImmutableStack`1"; + + private const string ImmutableSortedSetTypeName = "System.Collections.Immutable.ImmutableSortedSet"; + private const string ImmutableSortedSetGenericTypeName = "System.Collections.Immutable.ImmutableSortedSet`1"; + + private const string ImmutableHashSetTypeName = "System.Collections.Immutable.ImmutableHashSet"; + private const string ImmutableHashSetGenericTypeName = "System.Collections.Immutable.ImmutableHashSet`1"; + + private static readonly IList ArrayContractImmutableCollectionDefinitions = new List + { + new ImmutableCollectionTypeInfo(ImmutableListGenericInterfaceTypeName, ImmutableListGenericTypeName, ImmutableListTypeName), + new ImmutableCollectionTypeInfo(ImmutableListGenericTypeName, ImmutableListGenericTypeName, ImmutableListTypeName), + new ImmutableCollectionTypeInfo(ImmutableQueueGenericInterfaceTypeName, ImmutableQueueGenericTypeName, ImmutableQueueTypeName), + new ImmutableCollectionTypeInfo(ImmutableQueueGenericTypeName, ImmutableQueueGenericTypeName, ImmutableQueueTypeName), + new ImmutableCollectionTypeInfo(ImmutableStackGenericInterfaceTypeName, ImmutableStackGenericTypeName, ImmutableStackTypeName), + new ImmutableCollectionTypeInfo(ImmutableStackGenericTypeName, ImmutableStackGenericTypeName, ImmutableStackTypeName), + new ImmutableCollectionTypeInfo(ImmutableSetGenericInterfaceTypeName, ImmutableSortedSetGenericTypeName, ImmutableSortedSetTypeName), + new ImmutableCollectionTypeInfo(ImmutableSortedSetGenericTypeName, ImmutableSortedSetGenericTypeName, ImmutableSortedSetTypeName), + new ImmutableCollectionTypeInfo(ImmutableHashSetGenericTypeName, ImmutableHashSetGenericTypeName, ImmutableHashSetTypeName), + new ImmutableCollectionTypeInfo(ImmutableArrayGenericTypeName, ImmutableArrayGenericTypeName, ImmutableArrayTypeName) + }; + + private const string ImmutableDictionaryGenericInterfaceTypeName = "System.Collections.Immutable.IImmutableDictionary`2"; + + private const string ImmutableDictionaryTypeName = "System.Collections.Immutable.ImmutableDictionary"; + private const string ImmutableDictionaryGenericTypeName = "System.Collections.Immutable.ImmutableDictionary`2"; + + private const string ImmutableSortedDictionaryTypeName = "System.Collections.Immutable.ImmutableSortedDictionary"; + private const string ImmutableSortedDictionaryGenericTypeName = "System.Collections.Immutable.ImmutableSortedDictionary`2"; + + private static readonly IList DictionaryContractImmutableCollectionDefinitions = new List + { + new ImmutableCollectionTypeInfo(ImmutableDictionaryGenericInterfaceTypeName, ImmutableSortedDictionaryGenericTypeName, ImmutableSortedDictionaryTypeName), + new ImmutableCollectionTypeInfo(ImmutableSortedDictionaryGenericTypeName, ImmutableSortedDictionaryGenericTypeName, ImmutableSortedDictionaryTypeName), + new ImmutableCollectionTypeInfo(ImmutableDictionaryGenericTypeName, ImmutableDictionaryGenericTypeName, ImmutableDictionaryTypeName) + }; + + internal static bool TryBuildImmutableForArrayContract(Type underlyingType, Type collectionItemType, out Type createdType, out ObjectConstructor parameterizedCreator) + { + if (underlyingType.IsGenericType()) + { + Type underlyingTypeDefinition = underlyingType.GetGenericTypeDefinition(); + string name = underlyingTypeDefinition.FullName; + + ImmutableCollectionTypeInfo definition = ArrayContractImmutableCollectionDefinitions.FirstOrDefault(d => d.ContractTypeName == name); + if (definition != null) + { + Type createdTypeDefinition = underlyingTypeDefinition.Assembly().GetType(definition.CreatedTypeName); + Type builderTypeDefinition = underlyingTypeDefinition.Assembly().GetType(definition.BuilderTypeName); + + if (createdTypeDefinition != null && builderTypeDefinition != null) + { + MethodInfo mb = builderTypeDefinition.GetMethods().FirstOrDefault(m => m.Name == "CreateRange" && m.GetParameters().Length == 1); + if (mb != null) + { + createdType = createdTypeDefinition.MakeGenericType(collectionItemType); + MethodInfo method = mb.MakeGenericMethod(collectionItemType); + parameterizedCreator = JsonTypeReflector.ReflectionDelegateFactory.CreateParameterizedConstructor(method); + return true; + } + } + } + } + + createdType = null; + parameterizedCreator = null; + return false; + } + + internal static bool TryBuildImmutableForDictionaryContract(Type underlyingType, Type keyItemType, Type valueItemType, out Type createdType, out ObjectConstructor parameterizedCreator) + { + if (underlyingType.IsGenericType()) + { + Type underlyingTypeDefinition = underlyingType.GetGenericTypeDefinition(); + string name = underlyingTypeDefinition.FullName; + + ImmutableCollectionTypeInfo definition = DictionaryContractImmutableCollectionDefinitions.FirstOrDefault(d => d.ContractTypeName == name); + if (definition != null) + { + Type createdTypeDefinition = underlyingTypeDefinition.Assembly().GetType(definition.CreatedTypeName); + Type builderTypeDefinition = underlyingTypeDefinition.Assembly().GetType(definition.BuilderTypeName); + + if (createdTypeDefinition != null && builderTypeDefinition != null) + { + MethodInfo mb = builderTypeDefinition.GetMethods().FirstOrDefault(m => + { + ParameterInfo[] parameters = m.GetParameters(); + + return m.Name == "CreateRange" && parameters.Length == 1 && parameters[0].ParameterType.IsGenericType() && parameters[0].ParameterType.GetGenericTypeDefinition() == typeof(IEnumerable<>); + }); + if (mb != null) + { + createdType = createdTypeDefinition.MakeGenericType(keyItemType, valueItemType); + MethodInfo method = mb.MakeGenericMethod(keyItemType, valueItemType); + parameterizedCreator = JsonTypeReflector.ReflectionDelegateFactory.CreateParameterizedConstructor(method); + return true; + } + } + } + } + + createdType = null; + parameterizedCreator = null; + return false; + } + } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/JavaScriptUtils.cs b/Common/00-1Json8.3/Json8.3/Utilities/JavaScriptUtils.cs new file mode 100644 index 0000000..e8ef53e --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/JavaScriptUtils.cs @@ -0,0 +1,318 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections; +using System.Globalization; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Collections.Generic; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Utilities +{ + internal static class BufferUtils + { + public static char[] RentBuffer(IArrayPool bufferPool, int minSize) + { + if (bufferPool == null) + { + return new char[minSize]; + } + + char[] buffer = bufferPool.Rent(minSize); + return buffer; + } + + public static void ReturnBuffer(IArrayPool bufferPool, char[] buffer) + { + if (bufferPool == null) + { + return; + } + + bufferPool.Return(buffer); + } + + public static char[] EnsureBufferSize(IArrayPool bufferPool, int size, char[] buffer) + { + if (bufferPool == null) + { + return new char[size]; + } + + if (buffer != null) + { + bufferPool.Return(buffer); + } + + return bufferPool.Rent(size); + } + } + + internal static class JavaScriptUtils + { + internal static readonly bool[] SingleQuoteCharEscapeFlags = new bool[128]; + internal static readonly bool[] DoubleQuoteCharEscapeFlags = new bool[128]; + internal static readonly bool[] HtmlCharEscapeFlags = new bool[128]; + + private const int UnicodeTextLength = 6; + + static JavaScriptUtils() + { + IList escapeChars = new List + { + '\n', '\r', '\t', '\\', '\f', '\b', + }; + for (int i = 0; i < ' '; i++) + { + escapeChars.Add((char)i); + } + + foreach (var escapeChar in escapeChars.Union(new[] { '\'' })) + { + SingleQuoteCharEscapeFlags[escapeChar] = true; + } + foreach (var escapeChar in escapeChars.Union(new[] { '"' })) + { + DoubleQuoteCharEscapeFlags[escapeChar] = true; + } + foreach (var escapeChar in escapeChars.Union(new[] { '"', '\'', '<', '>', '&' })) + { + HtmlCharEscapeFlags[escapeChar] = true; + } + } + + private const string EscapedUnicodeText = "!"; + + public static bool[] GetCharEscapeFlags(StringEscapeHandling stringEscapeHandling, char quoteChar) + { + if (stringEscapeHandling == StringEscapeHandling.EscapeHtml) + { + return HtmlCharEscapeFlags; + } + + if (quoteChar == '"') + { + return DoubleQuoteCharEscapeFlags; + } + + return SingleQuoteCharEscapeFlags; + } + + public static bool ShouldEscapeJavaScriptString(string s, bool[] charEscapeFlags) + { + if (s == null) + { + return false; + } + + foreach (char c in s) + { + if (c >= charEscapeFlags.Length || charEscapeFlags[c]) + { + return true; + } + } + + return false; + } + + public static void WriteEscapedJavaScriptString(TextWriter writer, string s, char delimiter, bool appendDelimiters, + bool[] charEscapeFlags, StringEscapeHandling stringEscapeHandling, IArrayPool bufferPool, ref char[] writeBuffer) + { + // leading delimiter + if (appendDelimiters) + { + writer.Write(delimiter); + } + + if (s != null) + { + int lastWritePosition = 0; + + for (int i = 0; i < s.Length; i++) + { + var c = s[i]; + + if (c < charEscapeFlags.Length && !charEscapeFlags[c]) + { + continue; + } + + string escapedValue; + + switch (c) + { + case '\t': + escapedValue = @"\t"; + break; + case '\n': + escapedValue = @"\n"; + break; + case '\r': + escapedValue = @"\r"; + break; + case '\f': + escapedValue = @"\f"; + break; + case '\b': + escapedValue = @"\b"; + break; + case '\\': + escapedValue = @"\\"; + break; + case '\u0085': // Next Line + escapedValue = @"\u0085"; + break; + case '\u2028': // Line Separator + escapedValue = @"\u2028"; + break; + case '\u2029': // Paragraph Separator + escapedValue = @"\u2029"; + break; + default: + if (c < charEscapeFlags.Length || stringEscapeHandling == StringEscapeHandling.EscapeNonAscii) + { + if (c == '\'' && stringEscapeHandling != StringEscapeHandling.EscapeHtml) + { + escapedValue = @"\'"; + } + else if (c == '"' && stringEscapeHandling != StringEscapeHandling.EscapeHtml) + { + escapedValue = @"\"""; + } + else + { + if (writeBuffer == null || writeBuffer.Length < UnicodeTextLength) + { + writeBuffer = BufferUtils.EnsureBufferSize(bufferPool, UnicodeTextLength, writeBuffer); + } + + StringUtils.ToCharAsUnicode(c, writeBuffer); + + // slightly hacky but it saves multiple conditions in if test + escapedValue = EscapedUnicodeText; + } + } + else + { + escapedValue = null; + } + break; + } + + if (escapedValue == null) + { + continue; + } + + bool isEscapedUnicodeText = string.Equals(escapedValue, EscapedUnicodeText); + + if (i > lastWritePosition) + { + int length = i - lastWritePosition + ((isEscapedUnicodeText) ? UnicodeTextLength : 0); + int start = (isEscapedUnicodeText) ? UnicodeTextLength : 0; + + if (writeBuffer == null || writeBuffer.Length < length) + { + char[] newBuffer = BufferUtils.RentBuffer(bufferPool, length); + + // the unicode text is already in the buffer + // copy it over when creating new buffer + if (isEscapedUnicodeText) + { + Array.Copy(writeBuffer, newBuffer, UnicodeTextLength); + } + + BufferUtils.ReturnBuffer(bufferPool, writeBuffer); + + writeBuffer = newBuffer; + } + + s.CopyTo(lastWritePosition, writeBuffer, start, length - start); + + // write unchanged chars before writing escaped text + writer.Write(writeBuffer, start, length - start); + } + + lastWritePosition = i + 1; + if (!isEscapedUnicodeText) + { + writer.Write(escapedValue); + } + else + { + writer.Write(writeBuffer, 0, UnicodeTextLength); + } + } + + if (lastWritePosition == 0) + { + // no escaped text, write entire string + writer.Write(s); + } + else + { + int length = s.Length - lastWritePosition; + + if (writeBuffer == null || writeBuffer.Length < length) + { + writeBuffer = BufferUtils.EnsureBufferSize(bufferPool, length, writeBuffer); + } + + s.CopyTo(lastWritePosition, writeBuffer, 0, length); + + // write remaining text + writer.Write(writeBuffer, 0, length); + } + } + + // trailing delimiter + if (appendDelimiters) + { + writer.Write(delimiter); + } + } + + public static string ToEscapedJavaScriptString(string value, char delimiter, bool appendDelimiters, StringEscapeHandling stringEscapeHandling) + { + bool[] charEscapeFlags = GetCharEscapeFlags(stringEscapeHandling, delimiter); + + using (StringWriter w = StringUtils.CreateStringWriter(StringUtils.GetLength(value) ?? 16)) + { + char[] buffer = null; + WriteEscapedJavaScriptString(w, value, delimiter, appendDelimiters, charEscapeFlags, stringEscapeHandling, null, ref buffer); + return w.ToString(); + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/JsonTokenUtils.cs b/Common/00-1Json8.3/Json8.3/Utilities/JsonTokenUtils.cs new file mode 100644 index 0000000..fa45a5e --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/JsonTokenUtils.cs @@ -0,0 +1,77 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Text; + +namespace Newtonsoft.Json.Utilities +{ + internal static class JsonTokenUtils + { + internal static bool IsEndToken(JsonToken token) + { + switch (token) + { + case JsonToken.EndObject: + case JsonToken.EndArray: + case JsonToken.EndConstructor: + return true; + default: + return false; + } + } + + internal static bool IsStartToken(JsonToken token) + { + switch (token) + { + case JsonToken.StartObject: + case JsonToken.StartArray: + case JsonToken.StartConstructor: + return true; + default: + return false; + } + } + + internal static bool IsPrimitiveToken(JsonToken token) + { + switch (token) + { + case JsonToken.Integer: + case JsonToken.Float: + case JsonToken.String: + case JsonToken.Boolean: + case JsonToken.Undefined: + case JsonToken.Null: + case JsonToken.Date: + case JsonToken.Bytes: + return true; + default: + return false; + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/LateBoundReflectionDelegateFactory.cs b/Common/00-1Json8.3/Json8.3/Utilities/LateBoundReflectionDelegateFactory.cs new file mode 100644 index 0000000..52e1f5a --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/LateBoundReflectionDelegateFactory.cs @@ -0,0 +1,119 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using Newtonsoft.Json.Serialization; +using System.Reflection; + +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#endif + +namespace Newtonsoft.Json.Utilities +{ + internal class LateBoundReflectionDelegateFactory : ReflectionDelegateFactory + { + private static readonly LateBoundReflectionDelegateFactory _instance = new LateBoundReflectionDelegateFactory(); + + internal static ReflectionDelegateFactory Instance + { + get { return _instance; } + } + + public override ObjectConstructor CreateParameterizedConstructor(MethodBase method) + { + ValidationUtils.ArgumentNotNull(method, nameof(method)); + + ConstructorInfo c = method as ConstructorInfo; + if (c != null) + { + // don't convert to method group to avoid medium trust issues + // https://github.com/JamesNK/Newtonsoft.Json/issues/476 + return a => + { + object[] args = a; + return c.Invoke(args); + }; + } + + return a => method.Invoke(null, a); + } + + public override MethodCall CreateMethodCall(MethodBase method) + { + ValidationUtils.ArgumentNotNull(method, nameof(method)); + + ConstructorInfo c = method as ConstructorInfo; + if (c != null) + { + return (o, a) => c.Invoke(a); + } + + return (o, a) => method.Invoke(o, a); + } + + public override Func CreateDefaultConstructor(Type type) + { + ValidationUtils.ArgumentNotNull(type, nameof(type)); + + if (type.IsValueType()) + { + return () => (T)Activator.CreateInstance(type); + } + + ConstructorInfo constructorInfo = ReflectionUtils.GetDefaultConstructor(type, true); + + return () => (T)constructorInfo.Invoke(null); + } + + public override Func CreateGet(PropertyInfo propertyInfo) + { + ValidationUtils.ArgumentNotNull(propertyInfo, nameof(propertyInfo)); + + return o => propertyInfo.GetValue(o, null); + } + + public override Func CreateGet(FieldInfo fieldInfo) + { + ValidationUtils.ArgumentNotNull(fieldInfo, nameof(fieldInfo)); + + return o => fieldInfo.GetValue(o); + } + + public override Action CreateSet(FieldInfo fieldInfo) + { + ValidationUtils.ArgumentNotNull(fieldInfo, nameof(fieldInfo)); + + return (o, v) => fieldInfo.SetValue(o, v); + } + + public override Action CreateSet(PropertyInfo propertyInfo) + { + ValidationUtils.ArgumentNotNull(propertyInfo, nameof(propertyInfo)); + + return (o, v) => propertyInfo.SetValue(o, v, null); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/LinqBridge.cs b/Common/00-1Json8.3/Json8.3/Utilities/LinqBridge.cs new file mode 100644 index 0000000..f1a0807 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/LinqBridge.cs @@ -0,0 +1,3014 @@ + +#if NET20 + +#region License, Terms and Author(s) +// +// LINQBridge +// Copyright (c) 2007-9 Atif Aziz, Joseph Albahari. All rights reserved. +// +// Author(s): +// +// Atif Aziz, http://www.raboof.com +// +// This library is free software; you can redistribute it and/or modify it +// under the terms of the New BSD License, a copy of which should have +// been delivered along with this distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using Newtonsoft.Json.Serialization; + +namespace Newtonsoft.Json.Utilities.LinqBridge +{ + /// + /// Provides a set of static (Shared in Visual Basic) methods for + /// querying objects that implement . + /// + internal static partial class Enumerable + { + /// + /// Returns the input typed as . + /// + + public static IEnumerable AsEnumerable(IEnumerable source) + { + return source; + } + + /// + /// Returns an empty that has the + /// specified type argument. + /// + + public static IEnumerable Empty() + { + return Sequence.Empty; + } + + /// + /// Converts the elements of an to the + /// specified type. + /// + + public static IEnumerable Cast( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + return CastYield(source); + } + + private static IEnumerable CastYield( + IEnumerable source) + { + foreach (var item in source) + yield return (TResult) item; + } + + /// + /// Filters the elements of an based on a specified type. + /// + + public static IEnumerable OfType( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + return OfTypeYield(source); + } + + private static IEnumerable OfTypeYield( + IEnumerable source) + { + foreach (var item in source) + if (item is TResult) + yield return (TResult) item; + } + + /// + /// Generates a sequence of integral numbers within a specified range. + /// + /// The value of the first integer in the sequence. + /// The number of sequential integers to generate. + + public static IEnumerable Range(int start, int count) + { + if (count < 0) + throw new ArgumentOutOfRangeException("count", count, null); + + var end = (long) start + count; + if (end - 1 >= int.MaxValue) + throw new ArgumentOutOfRangeException("count", count, null); + + return RangeYield(start, end); + } + + private static IEnumerable RangeYield(int start, long end) + { + for (var i = start; i < end; i++) + yield return i; + } + + /// + /// Generates a sequence that contains one repeated value. + /// + + public static IEnumerable Repeat(TResult element, int count) + { + if (count < 0) throw new ArgumentOutOfRangeException("count", count, null); + + return RepeatYield(element, count); + } + + private static IEnumerable RepeatYield(TResult element, int count) + { + for (var i = 0; i < count; i++) + yield return element; + } + + /// + /// Filters a sequence of values based on a predicate. + /// + + public static IEnumerable Where( + this IEnumerable source, + Func predicate) + { + CheckNotNull(predicate, "predicate"); + + return source.Where((item, i) => predicate(item)); + } + + /// + /// Filters a sequence of values based on a predicate. + /// Each element's index is used in the logic of the predicate function. + /// + + public static IEnumerable Where( + this IEnumerable source, + Func predicate) + { + CheckNotNull(source, "source"); + CheckNotNull(predicate, "predicate"); + + return WhereYield(source, predicate); + } + + private static IEnumerable WhereYield( + IEnumerable source, + Func predicate) + { + var i = 0; + foreach (var item in source) + if (predicate(item, i++)) + yield return item; + } + + /// + /// Projects each element of a sequence into a new form. + /// + + public static IEnumerable Select( + this IEnumerable source, + Func selector) + { + CheckNotNull(selector, "selector"); + + return source.Select((item, i) => selector(item)); + } + + /// + /// Projects each element of a sequence into a new form by + /// incorporating the element's index. + /// + + public static IEnumerable Select( + this IEnumerable source, + Func selector) + { + CheckNotNull(source, "source"); + CheckNotNull(selector, "selector"); + + return SelectYield(source, selector); + } + + private static IEnumerable SelectYield( + IEnumerable source, + Func selector) + { + var i = 0; + foreach (var item in source) + yield return selector(item, i++); + } + + /// + /// Projects each element of a sequence to an + /// and flattens the resulting sequences into one sequence. + /// + + public static IEnumerable SelectMany( + this IEnumerable source, + Func> selector) + { + CheckNotNull(selector, "selector"); + + return source.SelectMany((item, i) => selector(item)); + } + + /// + /// Projects each element of a sequence to an , + /// and flattens the resulting sequences into one sequence. The + /// index of each source element is used in the projected form of + /// that element. + /// + + public static IEnumerable SelectMany( + this IEnumerable source, + Func> selector) + { + CheckNotNull(selector, "selector"); + + return source.SelectMany(selector, (item, subitem) => subitem); + } + + /// + /// Projects each element of a sequence to an , + /// flattens the resulting sequences into one sequence, and invokes + /// a result selector function on each element therein. + /// + + public static IEnumerable SelectMany( + this IEnumerable source, + Func> collectionSelector, + Func resultSelector) + { + CheckNotNull(collectionSelector, "collectionSelector"); + + return source.SelectMany((item, i) => collectionSelector(item), resultSelector); + } + + /// + /// Projects each element of a sequence to an , + /// flattens the resulting sequences into one sequence, and invokes + /// a result selector function on each element therein. The index of + /// each source element is used in the intermediate projected form + /// of that element. + /// + + public static IEnumerable SelectMany( + this IEnumerable source, + Func> collectionSelector, + Func resultSelector) + { + CheckNotNull(source, "source"); + CheckNotNull(collectionSelector, "collectionSelector"); + CheckNotNull(resultSelector, "resultSelector"); + + return SelectManyYield(source, collectionSelector, resultSelector); + } + + private static IEnumerable SelectManyYield( + this IEnumerable source, + Func> collectionSelector, + Func resultSelector) + { + var i = 0; + foreach (var item in source) + foreach (var subitem in collectionSelector(item, i++)) + yield return resultSelector(item, subitem); + } + + /// + /// Returns elements from a sequence as long as a specified condition is true. + /// + + public static IEnumerable TakeWhile( + this IEnumerable source, + Func predicate) + { + CheckNotNull(predicate, "predicate"); + + return source.TakeWhile((item, i) => predicate(item)); + } + + /// + /// Returns elements from a sequence as long as a specified condition is true. + /// The element's index is used in the logic of the predicate function. + /// + + public static IEnumerable TakeWhile( + this IEnumerable source, + Func predicate) + { + CheckNotNull(source, "source"); + CheckNotNull(predicate, "predicate"); + + return TakeWhileYield(source, predicate); + } + + private static IEnumerable TakeWhileYield( + this IEnumerable source, + Func predicate) + { + var i = 0; + foreach (var item in source) + if (predicate(item, i++)) + yield return item; + else + break; + } + + private static class Futures + { + public static readonly Func Default = () => default(T); + public static readonly Func Undefined = () => { throw new InvalidOperationException(); }; + } + + /// + /// Base implementation of First operator. + /// + + private static TSource FirstImpl( + this IEnumerable source, + Func empty) + { + CheckNotNull(source, "source"); + Debug.Assert(empty != null); + + var list = source as IList; // optimized case for lists + if (list != null) + return list.Count > 0 ? list[0] : empty(); + + using (var e = source.GetEnumerator()) // fallback for enumeration + return e.MoveNext() ? e.Current : empty(); + } + + /// + /// Returns the first element of a sequence. + /// + + public static TSource First( + this IEnumerable source) + { + return source.FirstImpl(Futures.Undefined); + } + + /// + /// Returns the first element in a sequence that satisfies a specified condition. + /// + + public static TSource First( + this IEnumerable source, + Func predicate) + { + return First(source.Where(predicate)); + } + + /// + /// Returns the first element of a sequence, or a default value if + /// the sequence contains no elements. + /// + + public static TSource FirstOrDefault( + this IEnumerable source) + { + return source.FirstImpl(Futures.Default); + } + + /// + /// Returns the first element of the sequence that satisfies a + /// condition or a default value if no such element is found. + /// + + public static TSource FirstOrDefault( + this IEnumerable source, + Func predicate) + { + return FirstOrDefault(source.Where(predicate)); + } + + /// + /// Base implementation of Last operator. + /// + + private static TSource LastImpl( + this IEnumerable source, + Func empty) + { + CheckNotNull(source, "source"); + + var list = source as IList; // optimized case for lists + if (list != null) + return list.Count > 0 ? list[list.Count - 1] : empty(); + + using (var e = source.GetEnumerator()) + { + if (!e.MoveNext()) + return empty(); + + var last = e.Current; + while (e.MoveNext()) + last = e.Current; + + return last; + } + } + + /// + /// Returns the last element of a sequence. + /// + public static TSource Last( + this IEnumerable source) + { + return source.LastImpl(Futures.Undefined); + } + + /// + /// Returns the last element of a sequence that satisfies a + /// specified condition. + /// + + public static TSource Last( + this IEnumerable source, + Func predicate) + { + return Last(source.Where(predicate)); + } + + /// + /// Returns the last element of a sequence, or a default value if + /// the sequence contains no elements. + /// + + public static TSource LastOrDefault( + this IEnumerable source) + { + return source.LastImpl(Futures.Default); + } + + /// + /// Returns the last element of a sequence that satisfies a + /// condition or a default value if no such element is found. + /// + + public static TSource LastOrDefault( + this IEnumerable source, + Func predicate) + { + return LastOrDefault(source.Where(predicate)); + } + + /// + /// Base implementation of Single operator. + /// + + private static TSource SingleImpl( + this IEnumerable source, + Func empty) + { + CheckNotNull(source, "source"); + + using (var e = source.GetEnumerator()) + { + if (e.MoveNext()) + { + var single = e.Current; + if (!e.MoveNext()) + return single; + + throw new InvalidOperationException(); + } + + return empty(); + } + } + + /// + /// Returns the only element of a sequence, and throws an exception + /// if there is not exactly one element in the sequence. + /// + + public static TSource Single( + this IEnumerable source) + { + return source.SingleImpl(Futures.Undefined); + } + + /// + /// Returns the only element of a sequence that satisfies a + /// specified condition, and throws an exception if more than one + /// such element exists. + /// + + public static TSource Single( + this IEnumerable source, + Func predicate) + { + return Single(source.Where(predicate)); + } + + /// + /// Returns the only element of a sequence, or a default value if + /// the sequence is empty; this method throws an exception if there + /// is more than one element in the sequence. + /// + + public static TSource SingleOrDefault( + this IEnumerable source) + { + return source.SingleImpl(Futures.Default); + } + + /// + /// Returns the only element of a sequence that satisfies a + /// specified condition or a default value if no such element + /// exists; this method throws an exception if more than one element + /// satisfies the condition. + /// + + public static TSource SingleOrDefault( + this IEnumerable source, + Func predicate) + { + return SingleOrDefault(source.Where(predicate)); + } + + /// + /// Returns the element at a specified index in a sequence. + /// + + public static TSource ElementAt( + this IEnumerable source, + int index) + { + CheckNotNull(source, "source"); + + if (index < 0) + throw new ArgumentOutOfRangeException("index", index, null); + + var list = source as IList; + if (list != null) + return list[index]; + + try + { + return source.SkipWhile((item, i) => i < index).First(); + } + catch (InvalidOperationException) // if thrown by First + { + throw new ArgumentOutOfRangeException("index", index, null); + } + } + + /// + /// Returns the element at a specified index in a sequence or a + /// default value if the index is out of range. + /// + + public static TSource ElementAtOrDefault( + this IEnumerable source, + int index) + { + CheckNotNull(source, "source"); + + if (index < 0) + return default(TSource); + + var list = source as IList; + if (list != null) + return index < list.Count ? list[index] : default(TSource); + + return source.SkipWhile((item, i) => i < index).FirstOrDefault(); + } + + /// + /// Inverts the order of the elements in a sequence. + /// + + public static IEnumerable Reverse( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + return ReverseYield(source); + } + + private static IEnumerable ReverseYield(IEnumerable source) + { + var stack = new Stack(); + foreach (var item in source) + stack.Push(item); + + foreach (var item in stack) + yield return item; + } + + /// + /// Returns a specified number of contiguous elements from the start + /// of a sequence. + /// + + public static IEnumerable Take( + this IEnumerable source, + int count) + { + return source.Where((item, i) => i < count); + } + + /// + /// Bypasses a specified number of elements in a sequence and then + /// returns the remaining elements. + /// + + public static IEnumerable Skip( + this IEnumerable source, + int count) + { + return source.Where((item, i) => i >= count); + } + + /// + /// Bypasses elements in a sequence as long as a specified condition + /// is true and then returns the remaining elements. + /// + + public static IEnumerable SkipWhile( + this IEnumerable source, + Func predicate) + { + CheckNotNull(predicate, "predicate"); + + return source.SkipWhile((item, i) => predicate(item)); + } + + /// + /// Bypasses elements in a sequence as long as a specified condition + /// is true and then returns the remaining elements. The element's + /// index is used in the logic of the predicate function. + /// + + public static IEnumerable SkipWhile( + this IEnumerable source, + Func predicate) + { + CheckNotNull(source, "source"); + CheckNotNull(predicate, "predicate"); + + return SkipWhileYield(source, predicate); + } + + private static IEnumerable SkipWhileYield( + IEnumerable source, + Func predicate) + { + using (var e = source.GetEnumerator()) + { + for (var i = 0;; i++) + { + if (!e.MoveNext()) + yield break; + + if (!predicate(e.Current, i)) + break; + } + + do + { + yield return e.Current; + } while (e.MoveNext()); + } + } + + /// + /// Returns the number of elements in a sequence. + /// + + public static int Count( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + var collection = source as ICollection; + return collection != null + ? collection.Count + : source.Aggregate(0, (count, item) => checked(count + 1)); + } + + /// + /// Returns a number that represents how many elements in the + /// specified sequence satisfy a condition. + /// + + public static int Count( + this IEnumerable source, + Func predicate) + { + return Count(source.Where(predicate)); + } + + /// + /// Returns an that represents the total number + /// of elements in a sequence. + /// + + public static long LongCount( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + var array = source as Array; + return array != null + ? array.LongLength + : source.Aggregate(0L, (count, item) => count + 1); + } + + /// + /// Returns an that represents how many elements + /// in a sequence satisfy a condition. + /// + + public static long LongCount( + this IEnumerable source, + Func predicate) + { + return LongCount(source.Where(predicate)); + } + + /// + /// Concatenates two sequences. + /// + + public static IEnumerable Concat( + this IEnumerable first, + IEnumerable second) + { + CheckNotNull(first, "first"); + CheckNotNull(second, "second"); + + return ConcatYield(first, second); + } + + private static IEnumerable ConcatYield( + IEnumerable first, + IEnumerable second) + { + foreach (var item in first) + yield return item; + + foreach (var item in second) + yield return item; + } + + /// + /// Creates a from an . + /// + + public static List ToList( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + return new List(source); + } + + /// + /// Creates an array from an . + /// + + public static TSource[] ToArray( + this IEnumerable source) + { + return source.ToList().ToArray(); + } + + /// + /// Returns distinct elements from a sequence by using the default + /// equality comparer to compare values. + /// + + public static IEnumerable Distinct( + this IEnumerable source) + { + return Distinct(source, /* comparer */ null); + } + + /// + /// Returns distinct elements from a sequence by using a specified + /// to compare values. + /// + + public static IEnumerable Distinct( + this IEnumerable source, + IEqualityComparer comparer) + { + CheckNotNull(source, "source"); + + return DistinctYield(source, comparer); + } + + private static IEnumerable DistinctYield( + IEnumerable source, + IEqualityComparer comparer) + { + var set = new Dictionary(comparer); + var gotNull = false; + + foreach (var item in source) + { + if (item == null) + { + if (gotNull) + continue; + gotNull = true; + } + else + { + if (set.ContainsKey(item)) + continue; + set.Add(item, null); + } + + yield return item; + } + } + + /// + /// Creates a from an + /// according to a specified key + /// selector function. + /// + + public static ILookup ToLookup( + this IEnumerable source, + Func keySelector) + { + return ToLookup(source, keySelector, e => e, /* comparer */ null); + } + + /// + /// Creates a from an + /// according to a specified key + /// selector function and a key comparer. + /// + + public static ILookup ToLookup( + this IEnumerable source, + Func keySelector, + IEqualityComparer comparer) + { + return ToLookup(source, keySelector, e => e, comparer); + } + + /// + /// Creates a from an + /// according to specified key + /// and element selector functions. + /// + + public static ILookup ToLookup( + this IEnumerable source, + Func keySelector, + Func elementSelector) + { + return ToLookup(source, keySelector, elementSelector, /* comparer */ null); + } + + /// + /// Creates a from an + /// according to a specified key + /// selector function, a comparer and an element selector function. + /// + + public static ILookup ToLookup( + this IEnumerable source, + Func keySelector, + Func elementSelector, + IEqualityComparer comparer) + { + CheckNotNull(source, "source"); + CheckNotNull(keySelector, "keySelector"); + CheckNotNull(elementSelector, "elementSelector"); + + var lookup = new Lookup(comparer); + + foreach (var item in source) + { + var key = keySelector(item); + + var grouping = (Grouping) lookup.Find(key); + if (grouping == null) + { + grouping = new Grouping(key); + lookup.Add(grouping); + } + + grouping.Add(elementSelector(item)); + } + + return lookup; + } + + /// + /// Groups the elements of a sequence according to a specified key + /// selector function. + /// + + public static IEnumerable> GroupBy( + this IEnumerable source, + Func keySelector) + { + return GroupBy(source, keySelector, /* comparer */ null); + } + + /// + /// Groups the elements of a sequence according to a specified key + /// selector function and compares the keys by using a specified + /// comparer. + /// + + public static IEnumerable> GroupBy( + this IEnumerable source, + Func keySelector, + IEqualityComparer comparer) + { + return GroupBy(source, keySelector, e => e, comparer); + } + + /// + /// Groups the elements of a sequence according to a specified key + /// selector function and projects the elements for each group by + /// using a specified function. + /// + + public static IEnumerable> GroupBy( + this IEnumerable source, + Func keySelector, + Func elementSelector) + { + return GroupBy(source, keySelector, elementSelector, /* comparer */ null); + } + + /// + /// Groups the elements of a sequence according to a specified key + /// selector function and creates a result value from each group and + /// its key. + /// + + public static IEnumerable> GroupBy( + this IEnumerable source, + Func keySelector, + Func elementSelector, + IEqualityComparer comparer) + { + CheckNotNull(source, "source"); + CheckNotNull(keySelector, "keySelector"); + CheckNotNull(elementSelector, "elementSelector"); + + return ToLookup(source, keySelector, elementSelector, comparer); + } + + /// + /// Groups the elements of a sequence according to a key selector + /// function. The keys are compared by using a comparer and each + /// group's elements are projected by using a specified function. + /// + + public static IEnumerable GroupBy( + this IEnumerable source, + Func keySelector, + Func, TResult> resultSelector) + { + return GroupBy(source, keySelector, resultSelector, /* comparer */ null); + } + + /// + /// Groups the elements of a sequence according to a specified key + /// selector function and creates a result value from each group and + /// its key. The elements of each group are projected by using a + /// specified function. + /// + + public static IEnumerable GroupBy( + this IEnumerable source, + Func keySelector, + Func, TResult> resultSelector, + IEqualityComparer comparer) + { + CheckNotNull(source, "source"); + CheckNotNull(keySelector, "keySelector"); + CheckNotNull(resultSelector, "resultSelector"); + + return ToLookup(source, keySelector, comparer).Select(g => resultSelector(g.Key, g)); + } + + /// + /// Groups the elements of a sequence according to a specified key + /// selector function and creates a result value from each group and + /// its key. The keys are compared by using a specified comparer. + /// + + public static IEnumerable GroupBy( + this IEnumerable source, + Func keySelector, + Func elementSelector, + Func, TResult> resultSelector) + { + return GroupBy(source, keySelector, elementSelector, resultSelector, /* comparer */ null); + } + + /// + /// Groups the elements of a sequence according to a specified key + /// selector function and creates a result value from each group and + /// its key. Key values are compared by using a specified comparer, + /// and the elements of each group are projected by using a + /// specified function. + /// + + public static IEnumerable GroupBy( + this IEnumerable source, + Func keySelector, + Func elementSelector, + Func, TResult> resultSelector, + IEqualityComparer comparer) + { + CheckNotNull(source, "source"); + CheckNotNull(keySelector, "keySelector"); + CheckNotNull(elementSelector, "elementSelector"); + CheckNotNull(resultSelector, "resultSelector"); + + return ToLookup(source, keySelector, elementSelector, comparer) + .Select(g => resultSelector(g.Key, g)); + } + + /// + /// Applies an accumulator function over a sequence. + /// + + public static TSource Aggregate( + this IEnumerable source, + Func func) + { + CheckNotNull(source, "source"); + CheckNotNull(func, "func"); + + using (var e = source.GetEnumerator()) + { + if (!e.MoveNext()) + throw new InvalidOperationException(); + + return e.Renumerable().Skip(1).Aggregate(e.Current, func); + } + } + + /// + /// Applies an accumulator function over a sequence. The specified + /// seed value is used as the initial accumulator value. + /// + + public static TAccumulate Aggregate( + this IEnumerable source, + TAccumulate seed, + Func func) + { + return Aggregate(source, seed, func, r => r); + } + + /// + /// Applies an accumulator function over a sequence. The specified + /// seed value is used as the initial accumulator value, and the + /// specified function is used to select the result value. + /// + + public static TResult Aggregate( + this IEnumerable source, + TAccumulate seed, + Func func, + Func resultSelector) + { + CheckNotNull(source, "source"); + CheckNotNull(func, "func"); + CheckNotNull(resultSelector, "resultSelector"); + + var result = seed; + + foreach (var item in source) + result = func(result, item); + + return resultSelector(result); + } + + /// + /// Produces the set union of two sequences by using the default + /// equality comparer. + /// + + public static IEnumerable Union( + this IEnumerable first, + IEnumerable second) + { + return Union(first, second, /* comparer */ null); + } + + /// + /// Produces the set union of two sequences by using a specified + /// . + /// + + public static IEnumerable Union( + this IEnumerable first, + IEnumerable second, + IEqualityComparer comparer) + { + return first.Concat(second).Distinct(comparer); + } + + /// + /// Returns the elements of the specified sequence or the type + /// parameter's default value in a singleton collection if the + /// sequence is empty. + /// + + public static IEnumerable DefaultIfEmpty( + this IEnumerable source) + { + return source.DefaultIfEmpty(default(TSource)); + } + + /// + /// Returns the elements of the specified sequence or the specified + /// value in a singleton collection if the sequence is empty. + /// + + public static IEnumerable DefaultIfEmpty( + this IEnumerable source, + TSource defaultValue) + { + CheckNotNull(source, "source"); + + return DefaultIfEmptyYield(source, defaultValue); + } + + private static IEnumerable DefaultIfEmptyYield( + IEnumerable source, + TSource defaultValue) + { + using (var e = source.GetEnumerator()) + { + if (!e.MoveNext()) + yield return defaultValue; + else + do + { + yield return e.Current; + } while (e.MoveNext()); + } + } + + /// + /// Determines whether all elements of a sequence satisfy a condition. + /// + + public static bool All( + this IEnumerable source, + Func predicate) + { + CheckNotNull(source, "source"); + CheckNotNull(predicate, "predicate"); + + foreach (var item in source) + if (!predicate(item)) + return false; + + return true; + } + + /// + /// Determines whether a sequence contains any elements. + /// + + public static bool Any( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + using (var e = source.GetEnumerator()) + return e.MoveNext(); + } + + /// + /// Determines whether any element of a sequence satisfies a + /// condition. + /// + + public static bool Any( + this IEnumerable source, + Func predicate) + { + return source.Where(predicate).Any(); + } + + /// + /// Determines whether a sequence contains a specified element by + /// using the default equality comparer. + /// + + public static bool Contains( + this IEnumerable source, + TSource value) + { + return source.Contains(value, /* comparer */ null); + } + + /// + /// Determines whether a sequence contains a specified element by + /// using a specified . + /// + + public static bool Contains( + this IEnumerable source, + TSource value, + IEqualityComparer comparer) + { + CheckNotNull(source, "source"); + + if (comparer == null) + { + var collection = source as ICollection; + if (collection != null) + return collection.Contains(value); + } + + comparer = comparer ?? EqualityComparer.Default; + return source.Any(item => comparer.Equals(item, value)); + } + + /// + /// Determines whether two sequences are equal by comparing the + /// elements by using the default equality comparer for their type. + /// + + public static bool SequenceEqual( + this IEnumerable first, + IEnumerable second) + { + return first.SequenceEqual(second, /* comparer */ null); + } + + /// + /// Determines whether two sequences are equal by comparing their + /// elements by using a specified . + /// + + public static bool SequenceEqual( + this IEnumerable first, + IEnumerable second, + IEqualityComparer comparer) + { + CheckNotNull(first, "frist"); + CheckNotNull(second, "second"); + + comparer = comparer ?? EqualityComparer.Default; + + using (IEnumerator lhs = first.GetEnumerator(), + rhs = second.GetEnumerator()) + { + do + { + if (!lhs.MoveNext()) + return !rhs.MoveNext(); + + if (!rhs.MoveNext()) + return false; + } while (comparer.Equals(lhs.Current, rhs.Current)); + } + + return false; + } + + /// + /// Base implementation for Min/Max operator. + /// + + private static TSource MinMaxImpl( + this IEnumerable source, + Func lesser) + { + CheckNotNull(source, "source"); + Debug.Assert(lesser != null); + + return source.Aggregate((a, item) => lesser(a, item) ? a : item); + } + + /// + /// Base implementation for Min/Max operator for nullable types. + /// + + private static TSource? MinMaxImpl( + this IEnumerable source, + TSource? seed, Func lesser) where TSource : struct + { + CheckNotNull(source, "source"); + Debug.Assert(lesser != null); + + return source.Aggregate(seed, (a, item) => lesser(a, item) ? a : item); + // == MinMaxImpl(Repeat(null, 1).Concat(source), lesser); + } + + /// + /// Returns the minimum value in a generic sequence. + /// + + public static TSource Min( + this IEnumerable source) + { + var comparer = Comparer.Default; + return source.MinMaxImpl((x, y) => comparer.Compare(x, y) < 0); + } + + /// + /// Invokes a transform function on each element of a generic + /// sequence and returns the minimum resulting value. + /// + + public static TResult Min( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Min(); + } + + /// + /// Returns the maximum value in a generic sequence. + /// + + public static TSource Max( + this IEnumerable source) + { + var comparer = Comparer.Default; + return source.MinMaxImpl((x, y) => comparer.Compare(x, y) > 0); + } + + /// + /// Invokes a transform function on each element of a generic + /// sequence and returns the maximum resulting value. + /// + + public static TResult Max( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Max(); + } + + /// + /// Makes an enumerator seen as enumerable once more. + /// + /// + /// The supplied enumerator must have been started. The first element + /// returned is the element the enumerator was on when passed in. + /// DO NOT use this method if the caller must be a generator. It is + /// mostly safe among aggregate operations. + /// + + private static IEnumerable Renumerable(this IEnumerator e) + { + Debug.Assert(e != null); + + do + { + yield return e.Current; + } while (e.MoveNext()); + } + + /// + /// Sorts the elements of a sequence in ascending order according to a key. + /// + + public static IOrderedEnumerable OrderBy( + this IEnumerable source, + Func keySelector) + { + return source.OrderBy(keySelector, /* comparer */ null); + } + + /// + /// Sorts the elements of a sequence in ascending order by using a + /// specified comparer. + /// + + public static IOrderedEnumerable OrderBy( + this IEnumerable source, + Func keySelector, + IComparer comparer) + { + CheckNotNull(source, "source"); + CheckNotNull(keySelector, "keySelector"); + + return new OrderedEnumerable(source, keySelector, comparer, /* descending */ false); + } + + /// + /// Sorts the elements of a sequence in descending order according to a key. + /// + + public static IOrderedEnumerable OrderByDescending( + this IEnumerable source, + Func keySelector) + { + return source.OrderByDescending(keySelector, /* comparer */ null); + } + + /// + /// Sorts the elements of a sequence in descending order by using a + /// specified comparer. + /// + + public static IOrderedEnumerable OrderByDescending( + this IEnumerable source, + Func keySelector, + IComparer comparer) + { + CheckNotNull(source, "source"); + CheckNotNull(source, "keySelector"); + + return new OrderedEnumerable(source, keySelector, comparer, /* descending */ true); + } + + /// + /// Performs a subsequent ordering of the elements in a sequence in + /// ascending order according to a key. + /// + + public static IOrderedEnumerable ThenBy( + this IOrderedEnumerable source, + Func keySelector) + { + return source.ThenBy(keySelector, /* comparer */ null); + } + + /// + /// Performs a subsequent ordering of the elements in a sequence in + /// ascending order by using a specified comparer. + /// + + public static IOrderedEnumerable ThenBy( + this IOrderedEnumerable source, + Func keySelector, + IComparer comparer) + { + CheckNotNull(source, "source"); + + return source.CreateOrderedEnumerable(keySelector, comparer, /* descending */ false); + } + + /// + /// Performs a subsequent ordering of the elements in a sequence in + /// descending order, according to a key. + /// + + public static IOrderedEnumerable ThenByDescending( + this IOrderedEnumerable source, + Func keySelector) + { + return source.ThenByDescending(keySelector, /* comparer */ null); + } + + /// + /// Performs a subsequent ordering of the elements in a sequence in + /// descending order by using a specified comparer. + /// + + public static IOrderedEnumerable ThenByDescending( + this IOrderedEnumerable source, + Func keySelector, + IComparer comparer) + { + CheckNotNull(source, "source"); + + return source.CreateOrderedEnumerable(keySelector, comparer, /* descending */ true); + } + + /// + /// Base implementation for Intersect and Except operators. + /// + + private static IEnumerable IntersectExceptImpl( + this IEnumerable first, + IEnumerable second, + IEqualityComparer comparer, + bool flag) + { + CheckNotNull(first, "first"); + CheckNotNull(second, "second"); + + var keys = new List(); + var flags = new Dictionary(comparer); + + foreach (var item in first.Where(k => !flags.ContainsKey(k))) + { + flags.Add(item, !flag); + keys.Add(item); + } + + foreach (var item in second.Where(flags.ContainsKey)) + flags[item] = flag; + + // + // As per docs, "the marked elements are yielded in the order in + // which they were collected. + // + + return keys.Where(item => flags[item]); + } + + /// + /// Produces the set intersection of two sequences by using the + /// default equality comparer to compare values. + /// + + public static IEnumerable Intersect( + this IEnumerable first, + IEnumerable second) + { + return first.Intersect(second, /* comparer */ null); + } + + /// + /// Produces the set intersection of two sequences by using the + /// specified to compare values. + /// + + public static IEnumerable Intersect( + this IEnumerable first, + IEnumerable second, + IEqualityComparer comparer) + { + return IntersectExceptImpl(first, second, comparer, /* flag */ true); + } + + /// + /// Produces the set difference of two sequences by using the + /// default equality comparer to compare values. + /// + + public static IEnumerable Except( + this IEnumerable first, + IEnumerable second) + { + return first.Except(second, /* comparer */ null); + } + + /// + /// Produces the set difference of two sequences by using the + /// specified to compare values. + /// + + public static IEnumerable Except( + this IEnumerable first, + IEnumerable second, + IEqualityComparer comparer) + { + return IntersectExceptImpl(first, second, comparer, /* flag */ false); + } + + /// + /// Creates a from an + /// according to a specified key + /// selector function. + /// + + public static Dictionary ToDictionary( + this IEnumerable source, + Func keySelector) + { + return source.ToDictionary(keySelector, /* comparer */ null); + } + + /// + /// Creates a from an + /// according to a specified key + /// selector function and key comparer. + /// + + public static Dictionary ToDictionary( + this IEnumerable source, + Func keySelector, + IEqualityComparer comparer) + { + return source.ToDictionary(keySelector, e => e); + } + + /// + /// Creates a from an + /// according to specified key + /// selector and element selector functions. + /// + + public static Dictionary ToDictionary( + this IEnumerable source, + Func keySelector, + Func elementSelector) + { + return source.ToDictionary(keySelector, elementSelector, /* comparer */ null); + } + + /// + /// Creates a from an + /// according to a specified key + /// selector function, a comparer, and an element selector function. + /// + + public static Dictionary ToDictionary( + this IEnumerable source, + Func keySelector, + Func elementSelector, + IEqualityComparer comparer) + { + CheckNotNull(source, "source"); + CheckNotNull(keySelector, "keySelector"); + CheckNotNull(elementSelector, "elementSelector"); + + var dict = new Dictionary(comparer); + + foreach (var item in source) + { + // + // ToDictionary is meant to throw ArgumentNullException if + // keySelector produces a key that is null and + // Argument exception if keySelector produces duplicate keys + // for two elements. Incidentally, the doucmentation for + // IDictionary.Add says that the Add method + // throws the same exceptions under the same circumstances + // so we don't need to do any additional checking or work + // here and let the Add implementation do all the heavy + // lifting. + // + + dict.Add(keySelector(item), elementSelector(item)); + } + + return dict; + } + + /// + /// Correlates the elements of two sequences based on matching keys. + /// The default equality comparer is used to compare keys. + /// + + public static IEnumerable Join( + this IEnumerable outer, + IEnumerable inner, + Func outerKeySelector, + Func innerKeySelector, + Func resultSelector) + { + return outer.Join(inner, outerKeySelector, innerKeySelector, resultSelector, /* comparer */ null); + } + + /// + /// Correlates the elements of two sequences based on matching keys. + /// The default equality comparer is used to compare keys. A + /// specified is used to compare keys. + /// + + public static IEnumerable Join( + this IEnumerable outer, + IEnumerable inner, + Func outerKeySelector, + Func innerKeySelector, + Func resultSelector, + IEqualityComparer comparer) + { + CheckNotNull(outer, "outer"); + CheckNotNull(inner, "inner"); + CheckNotNull(outerKeySelector, "outerKeySelector"); + CheckNotNull(innerKeySelector, "innerKeySelector"); + CheckNotNull(resultSelector, "resultSelector"); + + var lookup = inner.ToLookup(innerKeySelector, comparer); + + return + from o in outer + from i in lookup[outerKeySelector(o)] + select resultSelector(o, i); + } + + /// + /// Correlates the elements of two sequences based on equality of + /// keys and groups the results. The default equality comparer is + /// used to compare keys. + /// + + public static IEnumerable GroupJoin( + this IEnumerable outer, + IEnumerable inner, + Func outerKeySelector, + Func innerKeySelector, + Func, TResult> resultSelector) + { + return outer.GroupJoin(inner, outerKeySelector, innerKeySelector, resultSelector, /* comparer */ null); + } + + /// + /// Correlates the elements of two sequences based on equality of + /// keys and groups the results. The default equality comparer is + /// used to compare keys. A specified + /// is used to compare keys. + /// + + public static IEnumerable GroupJoin( + this IEnumerable outer, + IEnumerable inner, + Func outerKeySelector, + Func innerKeySelector, + Func, TResult> resultSelector, + IEqualityComparer comparer) + { + CheckNotNull(outer, "outer"); + CheckNotNull(inner, "inner"); + CheckNotNull(outerKeySelector, "outerKeySelector"); + CheckNotNull(innerKeySelector, "innerKeySelector"); + CheckNotNull(resultSelector, "resultSelector"); + + var lookup = inner.ToLookup(innerKeySelector, comparer); + return outer.Select(o => resultSelector(o, lookup[outerKeySelector(o)])); + } + + [DebuggerStepThrough] + private static void CheckNotNull(T value, string name) where T : class + { + if (value == null) + throw new ArgumentNullException(name); + } + + private static class Sequence + { + public static readonly IEnumerable Empty = new T[0]; + } + + private sealed class Grouping : List, IGrouping + { + internal Grouping(K key) + { + Key = key; + } + + public K Key { get; private set; } + } + } + + internal partial class Enumerable + { + /// + /// Computes the sum of a sequence of nullable values. + /// + + public static int Sum( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + int sum = 0; + foreach (var num in source) + sum = checked(sum + num); + + return sum; + } + + /// + /// Computes the sum of a sequence of nullable + /// values that are obtained by invoking a transform function on + /// each element of the input sequence. + /// + + public static int Sum( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Sum(); + } + + /// + /// Computes the average of a sequence of nullable values. + /// + + public static double Average( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + long sum = 0; + long count = 0; + + foreach (var num in source) + checked + { + sum += (int) num; + count++; + } + + if (count == 0) + throw new InvalidOperationException(); + + return (double) sum/count; + } + + /// + /// Computes the average of a sequence of nullable values + /// that are obtained by invoking a transform function on each + /// element of the input sequence. + /// + + public static double Average( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Average(); + } + + + /// + /// Computes the sum of a sequence of values. + /// + + public static int? Sum( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + int sum = 0; + foreach (var num in source) + sum = checked(sum + (num ?? 0)); + + return sum; + } + + /// + /// Computes the sum of a sequence of + /// values that are obtained by invoking a transform function on + /// each element of the input sequence. + /// + + public static int? Sum( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Sum(); + } + + /// + /// Computes the average of a sequence of values. + /// + + public static double? Average( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + long sum = 0; + long count = 0; + + foreach (var num in source.Where(n => n != null)) + checked + { + sum += (int) num; + count++; + } + + if (count == 0) + return null; + + return (double?) sum/count; + } + + /// + /// Computes the average of a sequence of values + /// that are obtained by invoking a transform function on each + /// element of the input sequence. + /// + + public static double? Average( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Average(); + } + + /// + /// Returns the minimum value in a sequence of nullable + /// values. + /// + + public static int? Min( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + return MinMaxImpl(source.Where(x => x != null), null, (min, x) => min < x); + } + + /// + /// Invokes a transform function on each element of a sequence and + /// returns the minimum nullable value. + /// + + public static int? Min( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Min(); + } + + /// + /// Returns the maximum value in a sequence of nullable + /// values. + /// + + public static int? Max( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + return MinMaxImpl(source.Where(x => x != null), + null, (max, x) => x == null || (max != null && x.Value < max.Value)); + } + + /// + /// Invokes a transform function on each element of a sequence and + /// returns the maximum nullable value. + /// + + public static int? Max( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Max(); + } + + /// + /// Computes the sum of a sequence of nullable values. + /// + + public static long Sum( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + long sum = 0; + foreach (var num in source) + sum = checked(sum + num); + + return sum; + } + + /// + /// Computes the sum of a sequence of nullable + /// values that are obtained by invoking a transform function on + /// each element of the input sequence. + /// + + public static long Sum( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Sum(); + } + + /// + /// Computes the average of a sequence of nullable values. + /// + + public static double Average( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + long sum = 0; + long count = 0; + + foreach (var num in source) + checked + { + sum += (long) num; + count++; + } + + if (count == 0) + throw new InvalidOperationException(); + + return (double) sum/count; + } + + /// + /// Computes the average of a sequence of nullable values + /// that are obtained by invoking a transform function on each + /// element of the input sequence. + /// + + public static double Average( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Average(); + } + + + /// + /// Computes the sum of a sequence of values. + /// + + public static long? Sum( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + long sum = 0; + foreach (var num in source) + sum = checked(sum + (num ?? 0)); + + return sum; + } + + /// + /// Computes the sum of a sequence of + /// values that are obtained by invoking a transform function on + /// each element of the input sequence. + /// + + public static long? Sum( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Sum(); + } + + /// + /// Computes the average of a sequence of values. + /// + + public static double? Average( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + long sum = 0; + long count = 0; + + foreach (var num in source.Where(n => n != null)) + checked + { + sum += (long) num; + count++; + } + + if (count == 0) + return null; + + return (double?) sum/count; + } + + /// + /// Computes the average of a sequence of values + /// that are obtained by invoking a transform function on each + /// element of the input sequence. + /// + + public static double? Average( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Average(); + } + + /// + /// Returns the minimum value in a sequence of nullable + /// values. + /// + + public static long? Min( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + return MinMaxImpl(source.Where(x => x != null), null, (min, x) => min < x); + } + + /// + /// Invokes a transform function on each element of a sequence and + /// returns the minimum nullable value. + /// + + public static long? Min( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Min(); + } + + /// + /// Returns the maximum value in a sequence of nullable + /// values. + /// + + public static long? Max( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + return MinMaxImpl(source.Where(x => x != null), + null, (max, x) => x == null || (max != null && x.Value < max.Value)); + } + + /// + /// Invokes a transform function on each element of a sequence and + /// returns the maximum nullable value. + /// + + public static long? Max( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Max(); + } + + /// + /// Computes the sum of a sequence of nullable values. + /// + + public static float Sum( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + float sum = 0; + foreach (var num in source) + sum = checked(sum + num); + + return sum; + } + + /// + /// Computes the sum of a sequence of nullable + /// values that are obtained by invoking a transform function on + /// each element of the input sequence. + /// + + public static float Sum( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Sum(); + } + + /// + /// Computes the average of a sequence of nullable values. + /// + + public static float Average( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + float sum = 0; + long count = 0; + + foreach (var num in source) + checked + { + sum += (float) num; + count++; + } + + if (count == 0) + throw new InvalidOperationException(); + + return (float) sum/count; + } + + /// + /// Computes the average of a sequence of nullable values + /// that are obtained by invoking a transform function on each + /// element of the input sequence. + /// + + public static float Average( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Average(); + } + + + /// + /// Computes the sum of a sequence of values. + /// + + public static float? Sum( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + float sum = 0; + foreach (var num in source) + sum = checked(sum + (num ?? 0)); + + return sum; + } + + /// + /// Computes the sum of a sequence of + /// values that are obtained by invoking a transform function on + /// each element of the input sequence. + /// + + public static float? Sum( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Sum(); + } + + /// + /// Computes the average of a sequence of values. + /// + + public static float? Average( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + float sum = 0; + long count = 0; + + foreach (var num in source.Where(n => n != null)) + checked + { + sum += (float) num; + count++; + } + + if (count == 0) + return null; + + return (float?) sum/count; + } + + /// + /// Computes the average of a sequence of values + /// that are obtained by invoking a transform function on each + /// element of the input sequence. + /// + + public static float? Average( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Average(); + } + + /// + /// Returns the minimum value in a sequence of nullable + /// values. + /// + + public static float? Min( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + return MinMaxImpl(source.Where(x => x != null), null, (min, x) => min < x); + } + + /// + /// Invokes a transform function on each element of a sequence and + /// returns the minimum nullable value. + /// + + public static float? Min( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Min(); + } + + /// + /// Returns the maximum value in a sequence of nullable + /// values. + /// + + public static float? Max( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + return MinMaxImpl(source.Where(x => x != null), + null, (max, x) => x == null || (max != null && x.Value < max.Value)); + } + + /// + /// Invokes a transform function on each element of a sequence and + /// returns the maximum nullable value. + /// + + public static float? Max( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Max(); + } + + /// + /// Computes the sum of a sequence of nullable values. + /// + + public static double Sum( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + double sum = 0; + foreach (var num in source) + sum = checked(sum + num); + + return sum; + } + + /// + /// Computes the sum of a sequence of nullable + /// values that are obtained by invoking a transform function on + /// each element of the input sequence. + /// + + public static double Sum( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Sum(); + } + + /// + /// Computes the average of a sequence of nullable values. + /// + + public static double Average( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + double sum = 0; + long count = 0; + + foreach (var num in source) + checked + { + sum += (double) num; + count++; + } + + if (count == 0) + throw new InvalidOperationException(); + + return (double) sum/count; + } + + /// + /// Computes the average of a sequence of nullable values + /// that are obtained by invoking a transform function on each + /// element of the input sequence. + /// + + public static double Average( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Average(); + } + + + /// + /// Computes the sum of a sequence of values. + /// + + public static double? Sum( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + double sum = 0; + foreach (var num in source) + sum = checked(sum + (num ?? 0)); + + return sum; + } + + /// + /// Computes the sum of a sequence of + /// values that are obtained by invoking a transform function on + /// each element of the input sequence. + /// + + public static double? Sum( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Sum(); + } + + /// + /// Computes the average of a sequence of values. + /// + + public static double? Average( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + double sum = 0; + long count = 0; + + foreach (var num in source.Where(n => n != null)) + checked + { + sum += (double) num; + count++; + } + + if (count == 0) + return null; + + return (double?) sum/count; + } + + /// + /// Computes the average of a sequence of values + /// that are obtained by invoking a transform function on each + /// element of the input sequence. + /// + + public static double? Average( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Average(); + } + + /// + /// Returns the minimum value in a sequence of nullable + /// values. + /// + + public static double? Min( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + return MinMaxImpl(source.Where(x => x != null), null, (min, x) => min < x); + } + + /// + /// Invokes a transform function on each element of a sequence and + /// returns the minimum nullable value. + /// + + public static double? Min( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Min(); + } + + /// + /// Returns the maximum value in a sequence of nullable + /// values. + /// + + public static double? Max( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + return MinMaxImpl(source.Where(x => x != null), + null, (max, x) => x == null || (max != null && x.Value < max.Value)); + } + + /// + /// Invokes a transform function on each element of a sequence and + /// returns the maximum nullable value. + /// + + public static double? Max( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Max(); + } + + /// + /// Computes the sum of a sequence of nullable values. + /// + + public static decimal Sum( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + decimal sum = 0; + foreach (var num in source) + sum = checked(sum + num); + + return sum; + } + + /// + /// Computes the sum of a sequence of nullable + /// values that are obtained by invoking a transform function on + /// each element of the input sequence. + /// + + public static decimal Sum( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Sum(); + } + + /// + /// Computes the average of a sequence of nullable values. + /// + + public static decimal Average( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + decimal sum = 0; + long count = 0; + + foreach (var num in source) + checked + { + sum += (decimal) num; + count++; + } + + if (count == 0) + throw new InvalidOperationException(); + + return (decimal) sum/count; + } + + /// + /// Computes the average of a sequence of nullable values + /// that are obtained by invoking a transform function on each + /// element of the input sequence. + /// + + public static decimal Average( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Average(); + } + + + /// + /// Computes the sum of a sequence of values. + /// + + public static decimal? Sum( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + decimal sum = 0; + foreach (var num in source) + sum = checked(sum + (num ?? 0)); + + return sum; + } + + /// + /// Computes the sum of a sequence of + /// values that are obtained by invoking a transform function on + /// each element of the input sequence. + /// + + public static decimal? Sum( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Sum(); + } + + /// + /// Computes the average of a sequence of values. + /// + + public static decimal? Average( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + decimal sum = 0; + long count = 0; + + foreach (var num in source.Where(n => n != null)) + checked + { + sum += (decimal) num; + count++; + } + + if (count == 0) + return null; + + return (decimal?) sum/count; + } + + /// + /// Computes the average of a sequence of values + /// that are obtained by invoking a transform function on each + /// element of the input sequence. + /// + + public static decimal? Average( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Average(); + } + + /// + /// Returns the minimum value in a sequence of nullable + /// values. + /// + + public static decimal? Min( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + return MinMaxImpl(source.Where(x => x != null), null, (min, x) => min < x); + } + + /// + /// Invokes a transform function on each element of a sequence and + /// returns the minimum nullable value. + /// + + public static decimal? Min( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Min(); + } + + /// + /// Returns the maximum value in a sequence of nullable + /// values. + /// + + public static decimal? Max( + this IEnumerable source) + { + CheckNotNull(source, "source"); + + return MinMaxImpl(source.Where(x => x != null), + null, (max, x) => x == null || (max != null && x.Value < max.Value)); + } + + /// + /// Invokes a transform function on each element of a sequence and + /// returns the maximum nullable value. + /// + + public static decimal? Max( + this IEnumerable source, + Func selector) + { + return source.Select(selector).Max(); + } + } + + /// + /// Represents a collection of objects that have a common key. + /// + internal partial interface IGrouping : IEnumerable + { + /// + /// Gets the key of the . + /// + + TKey Key { get; } + } + + /// + /// Defines an indexer, size property, and Boolean search method for + /// data structures that map keys to + /// sequences of values. + /// + internal partial interface ILookup : IEnumerable> + { + bool Contains(TKey key); + int Count { get; } + IEnumerable this[TKey key] { get; } + } + + /// + /// Represents a sorted sequence. + /// + internal partial interface IOrderedEnumerable : IEnumerable + { + /// + /// Performs a subsequent ordering on the elements of an + /// according to a key. + /// + + IOrderedEnumerable CreateOrderedEnumerable( + Func keySelector, IComparer comparer, bool descending); + } + + /// + /// Represents a collection of keys each mapped to one or more values. + /// + internal sealed class Lookup : ILookup + { + private readonly Dictionary> _map; + + internal Lookup(IEqualityComparer comparer) + { + _map = new Dictionary>(comparer); + } + + internal void Add(IGrouping item) + { + _map.Add(item.Key, item); + } + + internal IEnumerable Find(TKey key) + { + IGrouping grouping; + return _map.TryGetValue(key, out grouping) ? grouping : null; + } + + /// + /// Gets the number of key/value collection pairs in the . + /// + + public int Count + { + get { return _map.Count; } + } + + /// + /// Gets the collection of values indexed by the specified key. + /// + + public IEnumerable this[TKey key] + { + get + { + IGrouping result; + return _map.TryGetValue(key, out result) ? result : Enumerable.Empty(); + } + } + + /// + /// Determines whether a specified key is in the . + /// + + public bool Contains(TKey key) + { + return _map.ContainsKey(key); + } + + /// + /// Applies a transform function to each key and its associated + /// values and returns the results. + /// + + public IEnumerable ApplyResultSelector( + Func, TResult> resultSelector) + { + if (resultSelector == null) + throw new ArgumentNullException("resultSelector"); + + foreach (var pair in _map) + yield return resultSelector(pair.Key, pair.Value); + } + + /// + /// Returns a generic enumerator that iterates through the . + /// + + public IEnumerator> GetEnumerator() + { + return _map.Values.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } + + internal sealed class OrderedEnumerable : IOrderedEnumerable + { + private readonly IEnumerable _source; + private readonly List> _comparisons; + + public OrderedEnumerable(IEnumerable source, + Func keySelector, IComparer comparer, bool descending) : + this(source, null, keySelector, comparer, descending) + { + } + + private OrderedEnumerable(IEnumerable source, List> comparisons, + Func keySelector, IComparer comparer, bool descending) + { + if (source == null) throw new ArgumentNullException("source"); + if (keySelector == null) throw new ArgumentNullException("keySelector"); + + _source = source; + + comparer = comparer ?? Comparer.Default; + + if (comparisons == null) + comparisons = new List>( /* capacity */ 4); + + comparisons.Add((x, y) + => (descending ? -1 : 1)*comparer.Compare(keySelector(x), keySelector(y))); + + _comparisons = comparisons; + } + + public IOrderedEnumerable CreateOrderedEnumerable( + Func keySelector, IComparer comparer, bool descending) + { + return new OrderedEnumerable(_source, _comparisons, keySelector, comparer, descending); + } + + public IEnumerator GetEnumerator() + { + // + // We sort using List.Sort, but docs say that it performs an + // unstable sort. LINQ, on the other hand, says OrderBy performs + // a stable sort. So convert the source sequence into a sequence + // of tuples where the second element tags the position of the + // element from the source sequence (First). The position is + // then used as a tie breaker when all keys compare equal, + // thus making the sort stable. + // + + var list = _source.Select(new Func>(TagPosition)).ToList(); + + list.Sort((x, y) => + { + // + // Compare keys from left to right. + // + + var comparisons = _comparisons; + for (var i = 0; i < comparisons.Count; i++) + { + var result = comparisons[i](x.First, y.First); + if (result != 0) + return result; + } + + // + // All keys compared equal so now break the tie by their + // position in the original sequence, making the sort stable. + // + + return x.Second.CompareTo(y.Second); + }); + + return list.Select(new Func, T>(GetFirst)).GetEnumerator(); + + } + + /// + /// See issue #11 + /// for why this method is needed and cannot be expressed as a + /// lambda at the call site. + /// + + private static Tuple TagPosition(T e, int i) + { + return new Tuple(e, i); + } + + /// + /// See issue #11 + /// for why this method is needed and cannot be expressed as a + /// lambda at the call site. + /// + + private static T GetFirst(Tuple pv) + { + return pv.First; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } + + [Serializable] + internal struct Tuple : IEquatable> + { + public TFirst First { get; private set; } + public TSecond Second { get; private set; } + + public Tuple(TFirst first, TSecond second) + : this() + { + First = first; + Second = second; + } + + public override bool Equals(object obj) + { + return obj != null + && obj is Tuple + && base.Equals((Tuple) obj); + } + + public bool Equals(Tuple other) + { + return EqualityComparer.Default.Equals(other.First, First) + && EqualityComparer.Default.Equals(other.Second, Second); + } + + public override int GetHashCode() + { + var num = 0x7a2f0b42; + num = (-1521134295*num) + EqualityComparer.Default.GetHashCode(First); + return (-1521134295*num) + EqualityComparer.Default.GetHashCode(Second); + } + + public override string ToString() + { + return string.Format(CultureInfo.InvariantCulture, @"{{ First = {0}, Second = {1} }}", First, Second); + } + } +} + +namespace Newtonsoft.Json.Serialization +{ +#pragma warning disable 1591 + public delegate TResult Func(); + + public delegate TResult Func(T a); + + public delegate TResult Func(T1 arg1, T2 arg2); + + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3); + + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4); + + public delegate void Action(); + + public delegate void Action(T1 arg1, T2 arg2); + + public delegate void Action(T1 arg1, T2 arg2, T3 arg3); + + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4); +#pragma warning restore 1591 +} + +namespace System.Runtime.CompilerServices +{ + /// + /// This attribute allows us to define extension methods without + /// requiring .NET Framework 3.5. For more information, see the section, + /// Extension Methods in .NET Framework 2.0 Apps, + /// of Basic Instincts: Extension Methods + /// column in MSDN Magazine, + /// issue Nov 2007. + /// + + [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)] + internal sealed class ExtensionAttribute : Attribute { } +} + +#endif \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/MathUtils.cs b/Common/00-1Json8.3/Json8.3/Utilities/MathUtils.cs new file mode 100644 index 0000000..2818483 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/MathUtils.cs @@ -0,0 +1,187 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Text; + +namespace Newtonsoft.Json.Utilities +{ + internal static class MathUtils + { + public static int IntLength(ulong i) + { + if (i < 10000000000) + { + if (i < 10) + { + return 1; + } + if (i < 100) + { + return 2; + } + if (i < 1000) + { + return 3; + } + if (i < 10000) + { + return 4; + } + if (i < 100000) + { + return 5; + } + if (i < 1000000) + { + return 6; + } + if (i < 10000000) + { + return 7; + } + if (i < 100000000) + { + return 8; + } + if (i < 1000000000) + { + return 9; + } + + return 10; + } + else + { + if (i < 100000000000) + { + return 11; + } + if (i < 1000000000000) + { + return 12; + } + if (i < 10000000000000) + { + return 13; + } + if (i < 100000000000000) + { + return 14; + } + if (i < 1000000000000000) + { + return 15; + } + if (i < 10000000000000000) + { + return 16; + } + if (i < 100000000000000000) + { + return 17; + } + if (i < 1000000000000000000) + { + return 18; + } + if (i < 10000000000000000000) + { + return 19; + } + + return 20; + } + } + + public static char IntToHex(int n) + { + if (n <= 9) + { + return (char)(n + 48); + } + + return (char)((n - 10) + 97); + } + + public static int? Min(int? val1, int? val2) + { + if (val1 == null) + { + return val2; + } + if (val2 == null) + { + return val1; + } + + return Math.Min(val1.GetValueOrDefault(), val2.GetValueOrDefault()); + } + + public static int? Max(int? val1, int? val2) + { + if (val1 == null) + { + return val2; + } + if (val2 == null) + { + return val1; + } + + return Math.Max(val1.GetValueOrDefault(), val2.GetValueOrDefault()); + } + + public static double? Max(double? val1, double? val2) + { + if (val1 == null) + { + return val2; + } + if (val2 == null) + { + return val1; + } + + return Math.Max(val1.GetValueOrDefault(), val2.GetValueOrDefault()); + } + + public static bool ApproxEquals(double d1, double d2) + { + const double epsilon = 2.2204460492503131E-16; + + if (d1 == d2) + { + return true; + } + + double tolerance = ((Math.Abs(d1) + Math.Abs(d2)) + 10.0) * epsilon; + double difference = d1 - d2; + + return (-tolerance < difference && tolerance > difference); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/MethodCall.cs b/Common/00-1Json8.3/Json8.3/Utilities/MethodCall.cs new file mode 100644 index 0000000..8b16e28 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/MethodCall.cs @@ -0,0 +1,29 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +namespace Newtonsoft.Json.Utilities +{ + internal delegate TResult MethodCall(T target, params object[] args); +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/MiscellaneousUtils.cs b/Common/00-1Json8.3/Json8.3/Utilities/MiscellaneousUtils.cs new file mode 100644 index 0000000..85b8d38 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/MiscellaneousUtils.cs @@ -0,0 +1,162 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Reflection; +using System.Text; +using System.Globalization; + +namespace Newtonsoft.Json.Utilities +{ + internal delegate T Creator(); + + internal static class MiscellaneousUtils + { + public static bool ValueEquals(object objA, object objB) + { + if (objA == null && objB == null) + { + return true; + } + if (objA != null && objB == null) + { + return false; + } + if (objA == null && objB != null) + { + return false; + } + + // comparing an Int32 and Int64 both of the same value returns false + // make types the same then compare + if (objA.GetType() != objB.GetType()) + { + if (ConvertUtils.IsInteger(objA) && ConvertUtils.IsInteger(objB)) + { + return Convert.ToDecimal(objA, CultureInfo.CurrentCulture).Equals(Convert.ToDecimal(objB, CultureInfo.CurrentCulture)); + } + else if ((objA is double || objA is float || objA is decimal) && (objB is double || objB is float || objB is decimal)) + { + return MathUtils.ApproxEquals(Convert.ToDouble(objA, CultureInfo.CurrentCulture), Convert.ToDouble(objB, CultureInfo.CurrentCulture)); + } + else + { + return false; + } + } + + return objA.Equals(objB); + } + + public static ArgumentOutOfRangeException CreateArgumentOutOfRangeException(string paramName, object actualValue, string message) + { + string newMessage = message + Environment.NewLine + @"Actual value was {0}.".FormatWith(CultureInfo.InvariantCulture, actualValue); + + return new ArgumentOutOfRangeException(paramName, newMessage); + } + + public static string ToString(object value) + { + if (value == null) + { + return "{null}"; + } + + return (value is string) ? @"""" + value.ToString() + @"""" : value.ToString(); + } + + public static int ByteArrayCompare(byte[] a1, byte[] a2) + { + int lengthCompare = a1.Length.CompareTo(a2.Length); + if (lengthCompare != 0) + { + return lengthCompare; + } + + for (int i = 0; i < a1.Length; i++) + { + int valueCompare = a1[i].CompareTo(a2[i]); + if (valueCompare != 0) + { + return valueCompare; + } + } + + return 0; + } + + public static string GetPrefix(string qualifiedName) + { + string prefix; + string localName; + GetQualifiedNameParts(qualifiedName, out prefix, out localName); + + return prefix; + } + + public static string GetLocalName(string qualifiedName) + { + string prefix; + string localName; + GetQualifiedNameParts(qualifiedName, out prefix, out localName); + + return localName; + } + + public static void GetQualifiedNameParts(string qualifiedName, out string prefix, out string localName) + { + int colonPosition = qualifiedName.IndexOf(':'); + + if ((colonPosition == -1 || colonPosition == 0) || (qualifiedName.Length - 1) == colonPosition) + { + prefix = null; + localName = qualifiedName; + } + else + { + prefix = qualifiedName.Substring(0, colonPosition); + localName = qualifiedName.Substring(colonPosition + 1); + } + } + + internal static string FormatValueForPrint(object value) + { + if (value == null) + { + return "{null}"; + } + + if (value is string) + { + return @"""" + value + @""""; + } + + return value.ToString(); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/PropertyNameTable.cs b/Common/00-1Json8.3/Json8.3/Utilities/PropertyNameTable.cs new file mode 100644 index 0000000..4f1d2fc --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/PropertyNameTable.cs @@ -0,0 +1,173 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json.Utilities +{ + internal class PropertyNameTable + { + // used to defeat hashtable DoS attack where someone passes in lots of strings that hash to the same hash code + private static readonly int HashCodeRandomizer; + + private int _count; + private Entry[] _entries; + private int _mask = 31; + + static PropertyNameTable() + { + HashCodeRandomizer = Environment.TickCount; + } + + public PropertyNameTable() + { + _entries = new Entry[_mask + 1]; + } + + public string Get(char[] key, int start, int length) + { + if (length == 0) + { + return string.Empty; + } + + int hashCode = length + HashCodeRandomizer; + hashCode += (hashCode << 7) ^ key[start]; + int end = start + length; + for (int i = start + 1; i < end; i++) + { + hashCode += (hashCode << 7) ^ key[i]; + } + hashCode -= hashCode >> 17; + hashCode -= hashCode >> 11; + hashCode -= hashCode >> 5; + for (Entry entry = _entries[hashCode & _mask]; entry != null; entry = entry.Next) + { + if (entry.HashCode == hashCode && TextEquals(entry.Value, key, start, length)) + { + return entry.Value; + } + } + + return null; + } + + public string Add(string key) + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + int length = key.Length; + if (length == 0) + { + return string.Empty; + } + + int hashCode = length + HashCodeRandomizer; + for (int i = 0; i < key.Length; i++) + { + hashCode += (hashCode << 7) ^ key[i]; + } + hashCode -= hashCode >> 17; + hashCode -= hashCode >> 11; + hashCode -= hashCode >> 5; + for (Entry entry = _entries[hashCode & _mask]; entry != null; entry = entry.Next) + { + if (entry.HashCode == hashCode && entry.Value.Equals(key)) + { + return entry.Value; + } + } + + return AddEntry(key, hashCode); + } + + private string AddEntry(string str, int hashCode) + { + int index = hashCode & _mask; + Entry entry = new Entry(str, hashCode, _entries[index]); + _entries[index] = entry; + if (_count++ == _mask) + { + Grow(); + } + return entry.Value; + } + + private void Grow() + { + Entry[] entries = _entries; + int newMask = (_mask * 2) + 1; + Entry[] newEntries = new Entry[newMask + 1]; + + for (int i = 0; i < entries.Length; i++) + { + Entry next; + for (Entry entry = entries[i]; entry != null; entry = next) + { + int index = entry.HashCode & newMask; + next = entry.Next; + entry.Next = newEntries[index]; + newEntries[index] = entry; + } + } + _entries = newEntries; + _mask = newMask; + } + + private static bool TextEquals(string str1, char[] str2, int str2Start, int str2Length) + { + if (str1.Length != str2Length) + { + return false; + } + + for (int i = 0; i < str1.Length; i++) + { + if (str1[i] != str2[str2Start + i]) + { + return false; + } + } + return true; + } + + private class Entry + { + internal readonly string Value; + internal readonly int HashCode; + internal Entry Next; + + internal Entry(string value, int hashCode, Entry next) + { + Value = value; + HashCode = hashCode; + Next = next; + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/ReflectionDelegateFactory.cs b/Common/00-1Json8.3/Json8.3/Utilities/ReflectionDelegateFactory.cs new file mode 100644 index 0000000..4b1838c --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/ReflectionDelegateFactory.cs @@ -0,0 +1,81 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Globalization; +using System.Reflection; +using Newtonsoft.Json.Serialization; + +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#endif + +namespace Newtonsoft.Json.Utilities +{ + internal abstract class ReflectionDelegateFactory + { + public Func CreateGet(MemberInfo memberInfo) + { + PropertyInfo propertyInfo = memberInfo as PropertyInfo; + if (propertyInfo != null) + { + return CreateGet(propertyInfo); + } + + FieldInfo fieldInfo = memberInfo as FieldInfo; + if (fieldInfo != null) + { + return CreateGet(fieldInfo); + } + + throw new Exception("Could not create getter for {0}.".FormatWith(CultureInfo.InvariantCulture, memberInfo)); + } + + public Action CreateSet(MemberInfo memberInfo) + { + PropertyInfo propertyInfo = memberInfo as PropertyInfo; + if (propertyInfo != null) + { + return CreateSet(propertyInfo); + } + + FieldInfo fieldInfo = memberInfo as FieldInfo; + if (fieldInfo != null) + { + return CreateSet(fieldInfo); + } + + throw new Exception("Could not create setter for {0}.".FormatWith(CultureInfo.InvariantCulture, memberInfo)); + } + + public abstract MethodCall CreateMethodCall(MethodBase method); + public abstract ObjectConstructor CreateParameterizedConstructor(MethodBase method); + public abstract Func CreateDefaultConstructor(Type type); + public abstract Func CreateGet(PropertyInfo propertyInfo); + public abstract Func CreateGet(FieldInfo fieldInfo); + public abstract Action CreateSet(FieldInfo fieldInfo); + public abstract Action CreateSet(PropertyInfo propertyInfo); + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/ReflectionObject.cs b/Common/00-1Json8.3/Json8.3/Utilities/ReflectionObject.cs new file mode 100644 index 0000000..7df9a01 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/ReflectionObject.cs @@ -0,0 +1,165 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using Newtonsoft.Json.Serialization; +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Globalization; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; + +#endif + +namespace Newtonsoft.Json.Utilities +{ + internal class ReflectionMember + { + public Type MemberType { get; set; } + public Func Getter { get; set; } + public Action Setter { get; set; } + } + + internal class ReflectionObject + { + public ObjectConstructor Creator { get; private set; } + public IDictionary Members { get; private set; } + + public ReflectionObject() + { + Members = new Dictionary(); + } + + public object GetValue(object target, string member) + { + Func getter = Members[member].Getter; + return getter(target); + } + + public void SetValue(object target, string member, object value) + { + Action setter = Members[member].Setter; + setter(target, value); + } + + public Type GetType(string member) + { + return Members[member].MemberType; + } + + public static ReflectionObject Create(Type t, params string[] memberNames) + { + return Create(t, null, memberNames); + } + + public static ReflectionObject Create(Type t, MethodBase creator, params string[] memberNames) + { + ReflectionObject d = new ReflectionObject(); + + ReflectionDelegateFactory delegateFactory = JsonTypeReflector.ReflectionDelegateFactory; + + if (creator != null) + { + d.Creator = delegateFactory.CreateParameterizedConstructor(creator); + } + else + { + if (ReflectionUtils.HasDefaultConstructor(t, false)) + { + Func ctor = delegateFactory.CreateDefaultConstructor(t); + + d.Creator = args => ctor(); + } + } + + foreach (string memberName in memberNames) + { + MemberInfo[] members = t.GetMember(memberName, BindingFlags.Instance | BindingFlags.Public); + if (members.Length != 1) + { + throw new ArgumentException("Expected a single member with the name '{0}'.".FormatWith(CultureInfo.InvariantCulture, memberName)); + } + + MemberInfo member = members.Single(); + + ReflectionMember reflectionMember = new ReflectionMember(); + + switch (member.MemberType()) + { + case MemberTypes.Field: + case MemberTypes.Property: + if (ReflectionUtils.CanReadMemberValue(member, false)) + { + reflectionMember.Getter = delegateFactory.CreateGet(member); + } + + if (ReflectionUtils.CanSetMemberValue(member, false, false)) + { + reflectionMember.Setter = delegateFactory.CreateSet(member); + } + break; + case MemberTypes.Method: + MethodInfo method = (MethodInfo)member; + if (method.IsPublic) + { + ParameterInfo[] parameters = method.GetParameters(); + if (parameters.Length == 0 && method.ReturnType != typeof(void)) + { + MethodCall call = delegateFactory.CreateMethodCall(method); + reflectionMember.Getter = target => call(target); + } + else if (parameters.Length == 1 && method.ReturnType == typeof(void)) + { + MethodCall call = delegateFactory.CreateMethodCall(method); + reflectionMember.Setter = (target, arg) => call(target, arg); + } + } + break; + default: + throw new ArgumentException("Unexpected member type '{0}' for member '{1}'.".FormatWith(CultureInfo.InvariantCulture, member.MemberType(), member.Name)); + } + + if (ReflectionUtils.CanReadMemberValue(member, false)) + { + reflectionMember.Getter = delegateFactory.CreateGet(member); + } + + if (ReflectionUtils.CanSetMemberValue(member, false, false)) + { + reflectionMember.Setter = delegateFactory.CreateSet(member); + } + + reflectionMember.MemberType = ReflectionUtils.GetMemberUnderlyingType(member); + + d.Members[memberName] = reflectionMember; + } + + return d; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/ReflectionUtils.cs b/Common/00-1Json8.3/Json8.3/Utilities/ReflectionUtils.cs new file mode 100644 index 0000000..ba79efc --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/ReflectionUtils.cs @@ -0,0 +1,1122 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +#if !(PORTABLE || PORTABLE40 || NET35 || NET20) +using System.Numerics; +#endif +using System.Reflection; +using System.Collections; +using System.Globalization; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters; +using System.Text; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; +#endif +using Newtonsoft.Json.Serialization; + +namespace Newtonsoft.Json.Utilities +{ +#if (DOTNET || PORTABLE || PORTABLE40) + internal enum MemberTypes + { + Property = 0, + Field = 1, + Event = 2, + Method = 3, + Other = 4 + } +#endif + +#if PORTABLE + [Flags] + internal enum BindingFlags + { + Default = 0, + IgnoreCase = 1, + DeclaredOnly = 2, + Instance = 4, + Static = 8, + Public = 16, + NonPublic = 32, + FlattenHierarchy = 64, + InvokeMethod = 256, + CreateInstance = 512, + GetField = 1024, + SetField = 2048, + GetProperty = 4096, + SetProperty = 8192, + PutDispProperty = 16384, + ExactBinding = 65536, + PutRefDispProperty = 32768, + SuppressChangeType = 131072, + OptionalParamBinding = 262144, + IgnoreReturn = 16777216 + } +#endif + + internal static class ReflectionUtils + { + public static readonly Type[] EmptyTypes; + + static ReflectionUtils() + { +#if !(PORTABLE40 || PORTABLE) + EmptyTypes = Type.EmptyTypes; +#else + EmptyTypes = new Type[0]; +#endif + } + + public static bool IsVirtual(this PropertyInfo propertyInfo) + { + ValidationUtils.ArgumentNotNull(propertyInfo, nameof(propertyInfo)); + + MethodInfo m = propertyInfo.GetGetMethod(); + if (m != null && m.IsVirtual) + { + return true; + } + + m = propertyInfo.GetSetMethod(); + if (m != null && m.IsVirtual) + { + return true; + } + + return false; + } + + public static MethodInfo GetBaseDefinition(this PropertyInfo propertyInfo) + { + ValidationUtils.ArgumentNotNull(propertyInfo, nameof(propertyInfo)); + + MethodInfo m = propertyInfo.GetGetMethod(); + if (m != null) + { + return m.GetBaseDefinition(); + } + + m = propertyInfo.GetSetMethod(); + if (m != null) + { + return m.GetBaseDefinition(); + } + + return null; + } + + public static bool IsPublic(PropertyInfo property) + { + if (property.GetGetMethod() != null && property.GetGetMethod().IsPublic) + { + return true; + } + if (property.GetSetMethod() != null && property.GetSetMethod().IsPublic) + { + return true; + } + + return false; + } + + public static Type GetObjectType(object v) + { + return (v != null) ? v.GetType() : null; + } + + public static string GetTypeName(Type t, FormatterAssemblyStyle assemblyFormat, SerializationBinder binder) + { + string fullyQualifiedTypeName; +#if !(NET20 || NET35) + if (binder != null) + { + string assemblyName, typeName; + binder.BindToName(t, out assemblyName, out typeName); + fullyQualifiedTypeName = typeName + (assemblyName == null ? "" : ", " + assemblyName); + } + else + { + fullyQualifiedTypeName = t.AssemblyQualifiedName; + } +#else + fullyQualifiedTypeName = t.AssemblyQualifiedName; +#endif + + switch (assemblyFormat) + { + case FormatterAssemblyStyle.Simple: + return RemoveAssemblyDetails(fullyQualifiedTypeName); + case FormatterAssemblyStyle.Full: + return fullyQualifiedTypeName; + default: + throw new ArgumentOutOfRangeException(); + } + } + + private static string RemoveAssemblyDetails(string fullyQualifiedTypeName) + { + StringBuilder builder = new StringBuilder(); + + // loop through the type name and filter out qualified assembly details from nested type names + bool writingAssemblyName = false; + bool skippingAssemblyDetails = false; + for (int i = 0; i < fullyQualifiedTypeName.Length; i++) + { + char current = fullyQualifiedTypeName[i]; + switch (current) + { + case '[': + writingAssemblyName = false; + skippingAssemblyDetails = false; + builder.Append(current); + break; + case ']': + writingAssemblyName = false; + skippingAssemblyDetails = false; + builder.Append(current); + break; + case ',': + if (!writingAssemblyName) + { + writingAssemblyName = true; + builder.Append(current); + } + else + { + skippingAssemblyDetails = true; + } + break; + default: + if (!skippingAssemblyDetails) + { + builder.Append(current); + } + break; + } + } + + return builder.ToString(); + } + + public static bool HasDefaultConstructor(Type t, bool nonPublic) + { + ValidationUtils.ArgumentNotNull(t, nameof(t)); + + if (t.IsValueType()) + { + return true; + } + + return (GetDefaultConstructor(t, nonPublic) != null); + } + + public static ConstructorInfo GetDefaultConstructor(Type t) + { + return GetDefaultConstructor(t, false); + } + + public static ConstructorInfo GetDefaultConstructor(Type t, bool nonPublic) + { + BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public; + if (nonPublic) + { + bindingFlags = bindingFlags | BindingFlags.NonPublic; + } + + return t.GetConstructors(bindingFlags).SingleOrDefault(c => !c.GetParameters().Any()); + } + + public static bool IsNullable(Type t) + { + ValidationUtils.ArgumentNotNull(t, nameof(t)); + + if (t.IsValueType()) + { + return IsNullableType(t); + } + + return true; + } + + public static bool IsNullableType(Type t) + { + ValidationUtils.ArgumentNotNull(t, nameof(t)); + + return (t.IsGenericType() && t.GetGenericTypeDefinition() == typeof(Nullable<>)); + } + + public static Type EnsureNotNullableType(Type t) + { + return (IsNullableType(t)) + ? Nullable.GetUnderlyingType(t) + : t; + } + + public static bool IsGenericDefinition(Type type, Type genericInterfaceDefinition) + { + if (!type.IsGenericType()) + { + return false; + } + + Type t = type.GetGenericTypeDefinition(); + return (t == genericInterfaceDefinition); + } + + public static bool ImplementsGenericDefinition(Type type, Type genericInterfaceDefinition) + { + Type implementingType; + return ImplementsGenericDefinition(type, genericInterfaceDefinition, out implementingType); + } + + public static bool ImplementsGenericDefinition(Type type, Type genericInterfaceDefinition, out Type implementingType) + { + ValidationUtils.ArgumentNotNull(type, nameof(type)); + ValidationUtils.ArgumentNotNull(genericInterfaceDefinition, nameof(genericInterfaceDefinition)); + + if (!genericInterfaceDefinition.IsInterface() || !genericInterfaceDefinition.IsGenericTypeDefinition()) + { + throw new ArgumentNullException("'{0}' is not a generic interface definition.".FormatWith(CultureInfo.InvariantCulture, genericInterfaceDefinition)); + } + + if (type.IsInterface()) + { + if (type.IsGenericType()) + { + Type interfaceDefinition = type.GetGenericTypeDefinition(); + + if (genericInterfaceDefinition == interfaceDefinition) + { + implementingType = type; + return true; + } + } + } + + foreach (Type i in type.GetInterfaces()) + { + if (i.IsGenericType()) + { + Type interfaceDefinition = i.GetGenericTypeDefinition(); + + if (genericInterfaceDefinition == interfaceDefinition) + { + implementingType = i; + return true; + } + } + } + + implementingType = null; + return false; + } + + public static bool InheritsGenericDefinition(Type type, Type genericClassDefinition) + { + Type implementingType; + return InheritsGenericDefinition(type, genericClassDefinition, out implementingType); + } + + public static bool InheritsGenericDefinition(Type type, Type genericClassDefinition, out Type implementingType) + { + ValidationUtils.ArgumentNotNull(type, nameof(type)); + ValidationUtils.ArgumentNotNull(genericClassDefinition, nameof(genericClassDefinition)); + + if (!genericClassDefinition.IsClass() || !genericClassDefinition.IsGenericTypeDefinition()) + { + throw new ArgumentNullException("'{0}' is not a generic class definition.".FormatWith(CultureInfo.InvariantCulture, genericClassDefinition)); + } + + return InheritsGenericDefinitionInternal(type, genericClassDefinition, out implementingType); + } + + private static bool InheritsGenericDefinitionInternal(Type currentType, Type genericClassDefinition, out Type implementingType) + { + if (currentType.IsGenericType()) + { + Type currentGenericClassDefinition = currentType.GetGenericTypeDefinition(); + + if (genericClassDefinition == currentGenericClassDefinition) + { + implementingType = currentType; + return true; + } + } + + if (currentType.BaseType() == null) + { + implementingType = null; + return false; + } + + return InheritsGenericDefinitionInternal(currentType.BaseType(), genericClassDefinition, out implementingType); + } + + /// + /// Gets the type of the typed collection's items. + /// + /// The type. + /// The type of the typed collection's items. + public static Type GetCollectionItemType(Type type) + { + ValidationUtils.ArgumentNotNull(type, nameof(type)); + Type genericListType; + + if (type.IsArray) + { + return type.GetElementType(); + } + if (ImplementsGenericDefinition(type, typeof(IEnumerable<>), out genericListType)) + { + if (genericListType.IsGenericTypeDefinition()) + { + throw new Exception("Type {0} is not a collection.".FormatWith(CultureInfo.InvariantCulture, type)); + } + + return genericListType.GetGenericArguments()[0]; + } + if (typeof(IEnumerable).IsAssignableFrom(type)) + { + return null; + } + + throw new Exception("Type {0} is not a collection.".FormatWith(CultureInfo.InvariantCulture, type)); + } + + public static void GetDictionaryKeyValueTypes(Type dictionaryType, out Type keyType, out Type valueType) + { + ValidationUtils.ArgumentNotNull(dictionaryType, nameof(dictionaryType)); + + Type genericDictionaryType; + if (ImplementsGenericDefinition(dictionaryType, typeof(IDictionary<,>), out genericDictionaryType)) + { + if (genericDictionaryType.IsGenericTypeDefinition()) + { + throw new Exception("Type {0} is not a dictionary.".FormatWith(CultureInfo.InvariantCulture, dictionaryType)); + } + + Type[] dictionaryGenericArguments = genericDictionaryType.GetGenericArguments(); + + keyType = dictionaryGenericArguments[0]; + valueType = dictionaryGenericArguments[1]; + return; + } + if (typeof(IDictionary).IsAssignableFrom(dictionaryType)) + { + keyType = null; + valueType = null; + return; + } + + throw new Exception("Type {0} is not a dictionary.".FormatWith(CultureInfo.InvariantCulture, dictionaryType)); + } + + /// + /// Gets the member's underlying type. + /// + /// The member. + /// The underlying type of the member. + public static Type GetMemberUnderlyingType(MemberInfo member) + { + ValidationUtils.ArgumentNotNull(member, nameof(member)); + + switch (member.MemberType()) + { + case MemberTypes.Field: + return ((FieldInfo)member).FieldType; + case MemberTypes.Property: + return ((PropertyInfo)member).PropertyType; + case MemberTypes.Event: + return ((EventInfo)member).EventHandlerType; + case MemberTypes.Method: + return ((MethodInfo)member).ReturnType; + default: + throw new ArgumentException("MemberInfo must be of type FieldInfo, PropertyInfo, EventInfo or MethodInfo", nameof(member)); + } + } + + /// + /// Determines whether the member is an indexed property. + /// + /// The member. + /// + /// true if the member is an indexed property; otherwise, false. + /// + public static bool IsIndexedProperty(MemberInfo member) + { + ValidationUtils.ArgumentNotNull(member, nameof(member)); + + PropertyInfo propertyInfo = member as PropertyInfo; + + if (propertyInfo != null) + { + return IsIndexedProperty(propertyInfo); + } + else + { + return false; + } + } + + /// + /// Determines whether the property is an indexed property. + /// + /// The property. + /// + /// true if the property is an indexed property; otherwise, false. + /// + public static bool IsIndexedProperty(PropertyInfo property) + { + ValidationUtils.ArgumentNotNull(property, nameof(property)); + + return (property.GetIndexParameters().Length > 0); + } + + /// + /// Gets the member's value on the object. + /// + /// The member. + /// The target object. + /// The member's value on the object. + public static object GetMemberValue(MemberInfo member, object target) + { + ValidationUtils.ArgumentNotNull(member, nameof(member)); + ValidationUtils.ArgumentNotNull(target, nameof(target)); + + switch (member.MemberType()) + { + case MemberTypes.Field: + return ((FieldInfo)member).GetValue(target); + case MemberTypes.Property: + try + { + return ((PropertyInfo)member).GetValue(target, null); + } + catch (TargetParameterCountException e) + { + throw new ArgumentException("MemberInfo '{0}' has index parameters".FormatWith(CultureInfo.InvariantCulture, member.Name), e); + } + default: + throw new ArgumentException("MemberInfo '{0}' is not of type FieldInfo or PropertyInfo".FormatWith(CultureInfo.InvariantCulture, CultureInfo.InvariantCulture, member.Name), nameof(member)); + } + } + + /// + /// Sets the member's value on the target object. + /// + /// The member. + /// The target. + /// The value. + public static void SetMemberValue(MemberInfo member, object target, object value) + { + ValidationUtils.ArgumentNotNull(member, nameof(member)); + ValidationUtils.ArgumentNotNull(target, nameof(target)); + + switch (member.MemberType()) + { + case MemberTypes.Field: + ((FieldInfo)member).SetValue(target, value); + break; + case MemberTypes.Property: + ((PropertyInfo)member).SetValue(target, value, null); + break; + default: + throw new ArgumentException("MemberInfo '{0}' must be of type FieldInfo or PropertyInfo".FormatWith(CultureInfo.InvariantCulture, member.Name), nameof(member)); + } + } + + /// + /// Determines whether the specified MemberInfo can be read. + /// + /// The MemberInfo to determine whether can be read. + /// /// if set to true then allow the member to be gotten non-publicly. + /// + /// true if the specified MemberInfo can be read; otherwise, false. + /// + public static bool CanReadMemberValue(MemberInfo member, bool nonPublic) + { + switch (member.MemberType()) + { + case MemberTypes.Field: + FieldInfo fieldInfo = (FieldInfo)member; + + if (nonPublic) + { + return true; + } + else if (fieldInfo.IsPublic) + { + return true; + } + return false; + case MemberTypes.Property: + PropertyInfo propertyInfo = (PropertyInfo)member; + + if (!propertyInfo.CanRead) + { + return false; + } + if (nonPublic) + { + return true; + } + return (propertyInfo.GetGetMethod(nonPublic) != null); + default: + return false; + } + } + + /// + /// Determines whether the specified MemberInfo can be set. + /// + /// The MemberInfo to determine whether can be set. + /// if set to true then allow the member to be set non-publicly. + /// if set to true then allow the member to be set if read-only. + /// + /// true if the specified MemberInfo can be set; otherwise, false. + /// + public static bool CanSetMemberValue(MemberInfo member, bool nonPublic, bool canSetReadOnly) + { + switch (member.MemberType()) + { + case MemberTypes.Field: + FieldInfo fieldInfo = (FieldInfo)member; + + if (fieldInfo.IsLiteral) + { + return false; + } + if (fieldInfo.IsInitOnly && !canSetReadOnly) + { + return false; + } + if (nonPublic) + { + return true; + } + if (fieldInfo.IsPublic) + { + return true; + } + return false; + case MemberTypes.Property: + PropertyInfo propertyInfo = (PropertyInfo)member; + + if (!propertyInfo.CanWrite) + { + return false; + } + if (nonPublic) + { + return true; + } + return (propertyInfo.GetSetMethod(nonPublic) != null); + default: + return false; + } + } + + public static List GetFieldsAndProperties(Type type, BindingFlags bindingAttr) + { + List targetMembers = new List(); + + targetMembers.AddRange(GetFields(type, bindingAttr)); + targetMembers.AddRange(GetProperties(type, bindingAttr)); + + // for some reason .NET returns multiple members when overriding a generic member on a base class + // http://social.msdn.microsoft.com/Forums/en-US/b5abbfee-e292-4a64-8907-4e3f0fb90cd9/reflection-overriden-abstract-generic-properties?forum=netfxbcl + // filter members to only return the override on the topmost class + // update: I think this is fixed in .NET 3.5 SP1 - leave this in for now... + List distinctMembers = new List(targetMembers.Count); + + foreach (var groupedMember in targetMembers.GroupBy(m => m.Name)) + { + int count = groupedMember.Count(); + IList members = groupedMember.ToList(); + + if (count == 1) + { + distinctMembers.Add(members.First()); + } + else + { + IList resolvedMembers = new List(); + foreach (MemberInfo memberInfo in members) + { + // this is a bit hacky + // if the hiding property is hiding a base property and it is virtual + // then this ensures the derived property gets used + if (resolvedMembers.Count == 0) + { + resolvedMembers.Add(memberInfo); + } + else if (!IsOverridenGenericMember(memberInfo, bindingAttr) || memberInfo.Name == "Item") + { + resolvedMembers.Add(memberInfo); + } + } + + distinctMembers.AddRange(resolvedMembers); + } + } + + return distinctMembers; + } + + private static bool IsOverridenGenericMember(MemberInfo memberInfo, BindingFlags bindingAttr) + { + if (memberInfo.MemberType() != MemberTypes.Property) + { + return false; + } + + PropertyInfo propertyInfo = (PropertyInfo)memberInfo; + if (!IsVirtual(propertyInfo)) + { + return false; + } + + Type declaringType = propertyInfo.DeclaringType; + if (!declaringType.IsGenericType()) + { + return false; + } + Type genericTypeDefinition = declaringType.GetGenericTypeDefinition(); + if (genericTypeDefinition == null) + { + return false; + } + MemberInfo[] members = genericTypeDefinition.GetMember(propertyInfo.Name, bindingAttr); + if (members.Length == 0) + { + return false; + } + Type memberUnderlyingType = GetMemberUnderlyingType(members[0]); + if (!memberUnderlyingType.IsGenericParameter) + { + return false; + } + + return true; + } + + public static T GetAttribute(object attributeProvider) where T : Attribute + { + return GetAttribute(attributeProvider, true); + } + + public static T GetAttribute(object attributeProvider, bool inherit) where T : Attribute + { + T[] attributes = GetAttributes(attributeProvider, inherit); + + return (attributes != null) ? attributes.FirstOrDefault() : null; + } + +#if !(DOTNET || PORTABLE) + public static T[] GetAttributes(object attributeProvider, bool inherit) where T : Attribute + { + Attribute[] a = GetAttributes(attributeProvider, typeof(T), inherit); + + T[] attributes = a as T[]; + if (attributes != null) + { + return attributes; + } + + return a.Cast().ToArray(); + } + + public static Attribute[] GetAttributes(object attributeProvider, Type attributeType, bool inherit) + { + ValidationUtils.ArgumentNotNull(attributeProvider, nameof(attributeProvider)); + + object provider = attributeProvider; + + // http://hyperthink.net/blog/getcustomattributes-gotcha/ + // ICustomAttributeProvider doesn't do inheritance + + if (provider is Type) + { + Type t = (Type)provider; + object[] a = (attributeType != null) ? t.GetCustomAttributes(attributeType, inherit) : t.GetCustomAttributes(inherit); + Attribute[] attributes = a.Cast().ToArray(); + +#if (NET20 || NET35) + // ye olde .NET GetCustomAttributes doesn't respect the inherit argument + if (inherit && t.BaseType != null) + attributes = attributes.Union(GetAttributes(t.BaseType, attributeType, inherit)).ToArray(); +#endif + + return attributes; + } + + if (provider is Assembly) + { + Assembly a = (Assembly)provider; + return (attributeType != null) ? Attribute.GetCustomAttributes(a, attributeType) : Attribute.GetCustomAttributes(a); + } + + if (provider is MemberInfo) + { + MemberInfo m = (MemberInfo)provider; + return (attributeType != null) ? Attribute.GetCustomAttributes(m, attributeType, inherit) : Attribute.GetCustomAttributes(m, inherit); + } + +#if !PORTABLE40 + if (provider is Module) + { + Module m = (Module)provider; + return (attributeType != null) ? Attribute.GetCustomAttributes(m, attributeType, inherit) : Attribute.GetCustomAttributes(m, inherit); + } +#endif + + if (provider is ParameterInfo) + { + ParameterInfo p = (ParameterInfo)provider; + return (attributeType != null) ? Attribute.GetCustomAttributes(p, attributeType, inherit) : Attribute.GetCustomAttributes(p, inherit); + } + +#if !PORTABLE40 + ICustomAttributeProvider customAttributeProvider = (ICustomAttributeProvider)attributeProvider; + object[] result = (attributeType != null) ? customAttributeProvider.GetCustomAttributes(attributeType, inherit) : customAttributeProvider.GetCustomAttributes(inherit); + + return (Attribute[])result; +#else + throw new Exception("Cannot get attributes from '{0}'.".FormatWith(CultureInfo.InvariantCulture, provider)); +#endif + } +#else + public static T[] GetAttributes(object attributeProvider, bool inherit) where T : Attribute + { + return GetAttributes(attributeProvider, typeof(T), inherit).Cast().ToArray(); + } + + public static Attribute[] GetAttributes(object provider, Type attributeType, bool inherit) + { + if (provider is Type) + { + Type t = (Type)provider; + return (attributeType != null) + ? t.GetTypeInfo().GetCustomAttributes(attributeType, inherit).ToArray() + : t.GetTypeInfo().GetCustomAttributes(inherit).ToArray(); + } + + if (provider is Assembly) + { + Assembly a = (Assembly)provider; + return (attributeType != null) ? a.GetCustomAttributes(attributeType).ToArray() : a.GetCustomAttributes().ToArray(); + } + + if (provider is MemberInfo) + { + MemberInfo m = (MemberInfo)provider; + return (attributeType != null) ? m.GetCustomAttributes(attributeType, inherit).ToArray() : m.GetCustomAttributes(inherit).ToArray(); + } + + if (provider is Module) + { + Module m = (Module)provider; + return (attributeType != null) ? m.GetCustomAttributes(attributeType).ToArray() : m.GetCustomAttributes().ToArray(); + } + + if (provider is ParameterInfo) + { + ParameterInfo p = (ParameterInfo)provider; + return (attributeType != null) ? p.GetCustomAttributes(attributeType, inherit).ToArray() : p.GetCustomAttributes(inherit).ToArray(); + } + + throw new Exception("Cannot get attributes from '{0}'.".FormatWith(CultureInfo.InvariantCulture, provider)); + } +#endif + + public static void SplitFullyQualifiedTypeName(string fullyQualifiedTypeName, out string typeName, out string assemblyName) + { + int? assemblyDelimiterIndex = GetAssemblyDelimiterIndex(fullyQualifiedTypeName); + + if (assemblyDelimiterIndex != null) + { + typeName = fullyQualifiedTypeName.Substring(0, assemblyDelimiterIndex.GetValueOrDefault()).Trim(); + assemblyName = fullyQualifiedTypeName.Substring(assemblyDelimiterIndex.GetValueOrDefault() + 1, fullyQualifiedTypeName.Length - assemblyDelimiterIndex.GetValueOrDefault() - 1).Trim(); + } + else + { + typeName = fullyQualifiedTypeName; + assemblyName = null; + } + } + + private static int? GetAssemblyDelimiterIndex(string fullyQualifiedTypeName) + { + // we need to get the first comma following all surrounded in brackets because of generic types + // e.g. System.Collections.Generic.Dictionary`2[[System.String, mscorlib,Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + int scope = 0; + for (int i = 0; i < fullyQualifiedTypeName.Length; i++) + { + char current = fullyQualifiedTypeName[i]; + switch (current) + { + case '[': + scope++; + break; + case ']': + scope--; + break; + case ',': + if (scope == 0) + { + return i; + } + break; + } + } + + return null; + } + + public static MemberInfo GetMemberInfoFromType(Type targetType, MemberInfo memberInfo) + { + const BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; + + switch (memberInfo.MemberType()) + { + case MemberTypes.Property: + PropertyInfo propertyInfo = (PropertyInfo)memberInfo; + + Type[] types = propertyInfo.GetIndexParameters().Select(p => p.ParameterType).ToArray(); + + return targetType.GetProperty(propertyInfo.Name, bindingAttr, null, propertyInfo.PropertyType, types, null); + default: + return targetType.GetMember(memberInfo.Name, memberInfo.MemberType(), bindingAttr).SingleOrDefault(); + } + } + + public static IEnumerable GetFields(Type targetType, BindingFlags bindingAttr) + { + ValidationUtils.ArgumentNotNull(targetType, nameof(targetType)); + + List fieldInfos = new List(targetType.GetFields(bindingAttr)); +#if !PORTABLE + // Type.GetFields doesn't return inherited private fields + // manually find private fields from base class + GetChildPrivateFields(fieldInfos, targetType, bindingAttr); +#endif + + return fieldInfos.Cast(); + } + +#if !PORTABLE + private static void GetChildPrivateFields(IList initialFields, Type targetType, BindingFlags bindingAttr) + { + // fix weirdness with private FieldInfos only being returned for the current Type + // find base type fields and add them to result + if ((bindingAttr & BindingFlags.NonPublic) != 0) + { + // modify flags to not search for public fields + BindingFlags nonPublicBindingAttr = bindingAttr.RemoveFlag(BindingFlags.Public); + + while ((targetType = targetType.BaseType()) != null) + { + // filter out protected fields + IEnumerable childPrivateFields = + targetType.GetFields(nonPublicBindingAttr).Where(f => f.IsPrivate).Cast(); + + initialFields.AddRange(childPrivateFields); + } + } + } +#endif + + public static IEnumerable GetProperties(Type targetType, BindingFlags bindingAttr) + { + ValidationUtils.ArgumentNotNull(targetType, nameof(targetType)); + + List propertyInfos = new List(targetType.GetProperties(bindingAttr)); + + // GetProperties on an interface doesn't return properties from its interfaces + if (targetType.IsInterface()) + { + foreach (Type i in targetType.GetInterfaces()) + { + propertyInfos.AddRange(i.GetProperties(bindingAttr)); + } + } + + GetChildPrivateProperties(propertyInfos, targetType, bindingAttr); + + // a base class private getter/setter will be inaccessable unless the property was gotten from the base class + for (int i = 0; i < propertyInfos.Count; i++) + { + PropertyInfo member = propertyInfos[i]; + if (member.DeclaringType != targetType) + { + PropertyInfo declaredMember = (PropertyInfo)GetMemberInfoFromType(member.DeclaringType, member); + propertyInfos[i] = declaredMember; + } + } + + return propertyInfos; + } + + public static BindingFlags RemoveFlag(this BindingFlags bindingAttr, BindingFlags flag) + { + return ((bindingAttr & flag) == flag) + ? bindingAttr ^ flag + : bindingAttr; + } + + private static void GetChildPrivateProperties(IList initialProperties, Type targetType, BindingFlags bindingAttr) + { + // fix weirdness with private PropertyInfos only being returned for the current Type + // find base type properties and add them to result + + // also find base properties that have been hidden by subtype properties with the same name + + while ((targetType = targetType.BaseType()) != null) + { + foreach (PropertyInfo propertyInfo in targetType.GetProperties(bindingAttr)) + { + PropertyInfo subTypeProperty = propertyInfo; + + if (!IsPublic(subTypeProperty)) + { + // have to test on name rather than reference because instances are different + // depending on the type that GetProperties was called on + int index = initialProperties.IndexOf(p => p.Name == subTypeProperty.Name); + if (index == -1) + { + initialProperties.Add(subTypeProperty); + } + else + { + PropertyInfo childProperty = initialProperties[index]; + // don't replace public child with private base + if (!IsPublic(childProperty)) + { + // replace nonpublic properties for a child, but gotten from + // the parent with the one from the child + // the property gotten from the child will have access to private getter/setter + initialProperties[index] = subTypeProperty; + } + } + } + else + { + if (!subTypeProperty.IsVirtual()) + { + int index = initialProperties.IndexOf(p => p.Name == subTypeProperty.Name + && p.DeclaringType == subTypeProperty.DeclaringType); + + if (index == -1) + { + initialProperties.Add(subTypeProperty); + } + } + else + { + int index = initialProperties.IndexOf(p => p.Name == subTypeProperty.Name + && p.IsVirtual() + && p.GetBaseDefinition() != null + && p.GetBaseDefinition().DeclaringType.IsAssignableFrom(subTypeProperty.GetBaseDefinition().DeclaringType)); + + if (index == -1) + { + initialProperties.Add(subTypeProperty); + } + } + } + } + } + } + + public static bool IsMethodOverridden(Type currentType, Type methodDeclaringType, string method) + { + bool isMethodOverriden = currentType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) + .Any(info => + info.Name == method && + // check that the method overrides the original on DynamicObjectProxy + info.DeclaringType != methodDeclaringType + && info.GetBaseDefinition().DeclaringType == methodDeclaringType + ); + + return isMethodOverriden; + } + + public static object GetDefaultValue(Type type) + { + if (!type.IsValueType()) + { + return null; + } + + switch (ConvertUtils.GetTypeCode(type)) + { + case PrimitiveTypeCode.Boolean: + return false; + case PrimitiveTypeCode.Char: + case PrimitiveTypeCode.SByte: + case PrimitiveTypeCode.Byte: + case PrimitiveTypeCode.Int16: + case PrimitiveTypeCode.UInt16: + case PrimitiveTypeCode.Int32: + case PrimitiveTypeCode.UInt32: + return 0; + case PrimitiveTypeCode.Int64: + case PrimitiveTypeCode.UInt64: + return 0L; + case PrimitiveTypeCode.Single: + return 0f; + case PrimitiveTypeCode.Double: + return 0.0; + case PrimitiveTypeCode.Decimal: + return 0m; + case PrimitiveTypeCode.DateTime: + return new DateTime(); +#if !(PORTABLE || PORTABLE40 || NET35 || NET20) + case PrimitiveTypeCode.BigInteger: + return new BigInteger(); +#endif + case PrimitiveTypeCode.Guid: + return new Guid(); +#if !NET20 + case PrimitiveTypeCode.DateTimeOffset: + return new DateTimeOffset(); +#endif + } + + if (IsNullable(type)) + { + return null; + } + + // possibly use IL initobj for perf here? + return Activator.CreateInstance(type); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/StringBuffer.cs b/Common/00-1Json8.3/Json8.3/Utilities/StringBuffer.cs new file mode 100644 index 0000000..ec6818e --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/StringBuffer.cs @@ -0,0 +1,122 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json.Utilities +{ + /// + /// Builds a string. Unlike StringBuilder this class lets you reuse it's internal buffer. + /// + internal struct StringBuffer + { + private char[] _buffer; + private int _position; + + public int Position + { + get { return _position; } + set { _position = value; } + } + + public bool IsEmpty + { + get { return _buffer == null; } + } + + public StringBuffer(IArrayPool bufferPool, int initalSize) : this(BufferUtils.RentBuffer(bufferPool, initalSize)) + { + } + + private StringBuffer(char[] buffer) + { + _buffer = buffer; + _position = 0; + } + + public void Append(IArrayPool bufferPool, char value) + { + // test if the buffer array is large enough to take the value + if (_position == _buffer.Length) + { + EnsureSize(bufferPool, 1); + } + + // set value and increment poisition + _buffer[_position++] = value; + } + + public void Append(IArrayPool bufferPool, char[] buffer, int startIndex, int count) + { + if (_position + count >= _buffer.Length) + { + EnsureSize(bufferPool, count); + } + + Array.Copy(buffer, startIndex, _buffer, _position, count); + + _position += count; + } + + public void Clear(IArrayPool bufferPool) + { + if (_buffer != null) + { + BufferUtils.ReturnBuffer(bufferPool, _buffer); + _buffer = null; + } + _position = 0; + } + + private void EnsureSize(IArrayPool bufferPool, int appendLength) + { + char[] newBuffer = BufferUtils.RentBuffer(bufferPool, (_position + appendLength) * 2); + + if (_buffer != null) + { + Array.Copy(_buffer, newBuffer, _position); + BufferUtils.ReturnBuffer(bufferPool, _buffer); + } + + _buffer = newBuffer; + } + + public override string ToString() + { + return ToString(0, _position); + } + + public string ToString(int start, int length) + { + // TODO: validation + return new string(_buffer, start, length); + } + + public char[] InternalBuffer + { + get { return _buffer; } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/StringReference.cs b/Common/00-1Json8.3/Json8.3/Utilities/StringReference.cs new file mode 100644 index 0000000..5028a41 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/StringReference.cs @@ -0,0 +1,123 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json.Utilities +{ + internal struct StringReference + { + private readonly char[] _chars; + private readonly int _startIndex; + private readonly int _length; + + public char this[int i] + { + get { return _chars[i]; } + } + + public char[] Chars + { + get { return _chars; } + } + + public int StartIndex + { + get { return _startIndex; } + } + + public int Length + { + get { return _length; } + } + + public StringReference(char[] chars, int startIndex, int length) + { + _chars = chars; + _startIndex = startIndex; + _length = length; + } + + public override string ToString() + { + return new string(_chars, _startIndex, _length); + } + } + + internal static class StringReferenceExtensions + { + public static int IndexOf(this StringReference s, char c, int startIndex, int length) + { + int index = Array.IndexOf(s.Chars, c, s.StartIndex + startIndex, length); + if (index == -1) + { + return -1; + } + + return index - s.StartIndex; + } + + public static bool StartsWith(this StringReference s, string text) + { + if (text.Length > s.Length) + { + return false; + } + + char[] chars = s.Chars; + + for (int i = 0; i < text.Length; i++) + { + if (text[i] != chars[i + s.StartIndex]) + { + return false; + } + } + + return true; + } + + public static bool EndsWith(this StringReference s, string text) + { + if (text.Length > s.Length) + { + return false; + } + + char[] chars = s.Chars; + + int start = s.StartIndex + s.Length - text.Length; + for (int i = 0; i < text.Length; i++) + { + if (text[i] != chars[i + start]) + { + return false; + } + } + + return true; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/StringUtils.cs b/Common/00-1Json8.3/Json8.3/Utilities/StringUtils.cs new file mode 100644 index 0000000..0913011 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/StringUtils.cs @@ -0,0 +1,231 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Globalization; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; +#endif +using Newtonsoft.Json.Serialization; + +namespace Newtonsoft.Json.Utilities +{ + internal static class StringUtils + { + public const string CarriageReturnLineFeed = "\r\n"; + public const string Empty = ""; + public const char CarriageReturn = '\r'; + public const char LineFeed = '\n'; + public const char Tab = '\t'; + + public static string FormatWith(this string format, IFormatProvider provider, object arg0) + { + return format.FormatWith(provider, new[] { arg0 }); + } + + public static string FormatWith(this string format, IFormatProvider provider, object arg0, object arg1) + { + return format.FormatWith(provider, new[] { arg0, arg1 }); + } + + public static string FormatWith(this string format, IFormatProvider provider, object arg0, object arg1, object arg2) + { + return format.FormatWith(provider, new[] { arg0, arg1, arg2 }); + } + + public static string FormatWith(this string format, IFormatProvider provider, object arg0, object arg1, object arg2, object arg3) + { + return format.FormatWith(provider, new[] { arg0, arg1, arg2, arg3 }); + } + + private static string FormatWith(this string format, IFormatProvider provider, params object[] args) + { + // leave this a private to force code to use an explicit overload + // avoids stack memory being reserved for the object array + ValidationUtils.ArgumentNotNull(format, nameof(format)); + + return string.Format(provider, format, args); + } + + /// + /// Determines whether the string is all white space. Empty string will return false. + /// + /// The string to test whether it is all white space. + /// + /// true if the string is all white space; otherwise, false. + /// + public static bool IsWhiteSpace(string s) + { + if (s == null) + { + throw new ArgumentNullException(nameof(s)); + } + + if (s.Length == 0) + { + return false; + } + + for (int i = 0; i < s.Length; i++) + { + if (!char.IsWhiteSpace(s[i])) + { + return false; + } + } + + return true; + } + + /// + /// Nulls an empty string. + /// + /// The string. + /// Null if the string was null, otherwise the string unchanged. + public static string NullEmptyString(string s) + { + return (string.IsNullOrEmpty(s)) ? null : s; + } + + public static StringWriter CreateStringWriter(int capacity) + { + StringBuilder sb = new StringBuilder(capacity); + StringWriter sw = new StringWriter(sb, CultureInfo.InvariantCulture); + + return sw; + } + + public static int? GetLength(string value) + { + if (value == null) + { + return null; + } + else + { + return value.Length; + } + } + + public static void ToCharAsUnicode(char c, char[] buffer) + { + buffer[0] = '\\'; + buffer[1] = 'u'; + buffer[2] = MathUtils.IntToHex((c >> 12) & '\x000f'); + buffer[3] = MathUtils.IntToHex((c >> 8) & '\x000f'); + buffer[4] = MathUtils.IntToHex((c >> 4) & '\x000f'); + buffer[5] = MathUtils.IntToHex(c & '\x000f'); + } + + public static TSource ForgivingCaseSensitiveFind(this IEnumerable source, Func valueSelector, string testValue) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + if (valueSelector == null) + { + throw new ArgumentNullException(nameof(valueSelector)); + } + + var caseInsensitiveResults = source.Where(s => string.Equals(valueSelector(s), testValue, StringComparison.OrdinalIgnoreCase)); + if (caseInsensitiveResults.Count() <= 1) + { + return caseInsensitiveResults.SingleOrDefault(); + } + else + { + // multiple results returned. now filter using case sensitivity + var caseSensitiveResults = source.Where(s => string.Equals(valueSelector(s), testValue, StringComparison.Ordinal)); + return caseSensitiveResults.SingleOrDefault(); + } + } + + public static string ToCamelCase(string s) + { + if (string.IsNullOrEmpty(s) || !char.IsUpper(s[0])) + { + return s; + } + + char[] chars = s.ToCharArray(); + + for (int i = 0; i < chars.Length; i++) + { + if (i == 1 && !char.IsUpper(chars[i])) + { + break; + } + + bool hasNext = (i + 1 < chars.Length); + if (i > 0 && hasNext && !char.IsUpper(chars[i + 1])) + { + break; + } + +#if !(DOTNET || PORTABLE) + chars[i] = char.ToLower(chars[i], CultureInfo.InvariantCulture); +#else + chars[i] = char.ToLowerInvariant(chars[i]); +#endif + } + + return new string(chars); + } + + public static bool IsHighSurrogate(char c) + { +#if !(PORTABLE40 || PORTABLE) + return char.IsHighSurrogate(c); +#else + return (c >= 55296 && c <= 56319); +#endif + } + + public static bool IsLowSurrogate(char c) + { +#if !(PORTABLE40 || PORTABLE) + return char.IsLowSurrogate(c); +#else + return (c >= 56320 && c <= 57343); +#endif + } + + public static bool StartsWith(this string source, char value) + { + return (source.Length > 0 && source[0] == value); + } + + public static bool EndsWith(this string source, char value) + { + return (source.Length > 0 && source[source.Length - 1] == value); + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/ThreadSafeStore.cs b/Common/00-1Json8.3/Json8.3/Utilities/ThreadSafeStore.cs new file mode 100644 index 0000000..1e56065 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/ThreadSafeStore.cs @@ -0,0 +1,97 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#endif +using System.Threading; +using Newtonsoft.Json.Serialization; + +namespace Newtonsoft.Json.Utilities +{ + internal class ThreadSafeStore + { + private readonly object _lock = new object(); + private Dictionary _store; + private readonly Func _creator; + + public ThreadSafeStore(Func creator) + { + if (creator == null) + { + throw new ArgumentNullException(nameof(creator)); + } + + _creator = creator; + _store = new Dictionary(); + } + + public TValue Get(TKey key) + { + TValue value; + if (!_store.TryGetValue(key, out value)) + { + return AddValue(key); + } + + return value; + } + + private TValue AddValue(TKey key) + { + TValue value = _creator(key); + + lock (_lock) + { + if (_store == null) + { + _store = new Dictionary(); + _store[key] = value; + } + else + { + // double check locking + TValue checkValue; + if (_store.TryGetValue(key, out checkValue)) + { + return checkValue; + } + + Dictionary newStore = new Dictionary(_store); + newStore[key] = value; + +#if !(DOTNET || PORTABLE) + Thread.MemoryBarrier(); +#endif + _store = newStore; + } + + return value; + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/TypeExtensions.cs b/Common/00-1Json8.3/Json8.3/Utilities/TypeExtensions.cs new file mode 100644 index 0000000..ee7e092 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/TypeExtensions.cs @@ -0,0 +1,628 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; +using System.Collections.Generic; +using System.Reflection; +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; +#endif + +namespace Newtonsoft.Json.Utilities +{ + internal static class TypeExtensions + { +#if DOTNET || PORTABLE +#if !DOTNET + private static BindingFlags DefaultFlags = BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance; + + public static MethodInfo GetGetMethod(this PropertyInfo propertyInfo) + { + return propertyInfo.GetGetMethod(false); + } + + public static MethodInfo GetGetMethod(this PropertyInfo propertyInfo, bool nonPublic) + { + MethodInfo getMethod = propertyInfo.GetMethod; + if (getMethod != null && (getMethod.IsPublic || nonPublic)) + { + return getMethod; + } + + return null; + } + + public static MethodInfo GetSetMethod(this PropertyInfo propertyInfo) + { + return propertyInfo.GetSetMethod(false); + } + + public static MethodInfo GetSetMethod(this PropertyInfo propertyInfo, bool nonPublic) + { + MethodInfo setMethod = propertyInfo.SetMethod; + if (setMethod != null && (setMethod.IsPublic || nonPublic)) + { + return setMethod; + } + + return null; + } +#endif + + public static bool IsSubclassOf(this Type type, Type c) + { + return type.GetTypeInfo().IsSubclassOf(c); + } + +#if !DOTNET + public static bool IsAssignableFrom(this Type type, Type c) + { + return type.GetTypeInfo().IsAssignableFrom(c.GetTypeInfo()); + } +#endif + + public static bool IsInstanceOfType(this Type type, object o) + { + if (o == null) + { + return false; + } + + return type.IsAssignableFrom(o.GetType()); + } +#endif + + public static MethodInfo Method(this Delegate d) + { +#if !(DOTNET || PORTABLE) + return d.Method; +#else + return d.GetMethodInfo(); +#endif + } + + public static MemberTypes MemberType(this MemberInfo memberInfo) + { +#if !(DOTNET || PORTABLE || PORTABLE40) + return memberInfo.MemberType; +#else + if (memberInfo is PropertyInfo) + { + return MemberTypes.Property; + } + else if (memberInfo is FieldInfo) + { + return MemberTypes.Field; + } + else if (memberInfo is EventInfo) + { + return MemberTypes.Event; + } + else if (memberInfo is MethodInfo) + { + return MemberTypes.Method; + } + else + { + return MemberTypes.Other; + } +#endif + } + + public static bool ContainsGenericParameters(this Type type) + { +#if !(DOTNET || PORTABLE) + return type.ContainsGenericParameters; +#else + return type.GetTypeInfo().ContainsGenericParameters; +#endif + } + + public static bool IsInterface(this Type type) + { +#if !(DOTNET || PORTABLE) + return type.IsInterface; +#else + return type.GetTypeInfo().IsInterface; +#endif + } + + public static bool IsGenericType(this Type type) + { +#if !(DOTNET || PORTABLE) + return type.IsGenericType; +#else + return type.GetTypeInfo().IsGenericType; +#endif + } + + public static bool IsGenericTypeDefinition(this Type type) + { +#if !(DOTNET || PORTABLE) + return type.IsGenericTypeDefinition; +#else + return type.GetTypeInfo().IsGenericTypeDefinition; +#endif + } + + public static Type BaseType(this Type type) + { +#if !(DOTNET || PORTABLE) + return type.BaseType; +#else + return type.GetTypeInfo().BaseType; +#endif + } + + public static Assembly Assembly(this Type type) + { +#if !(DOTNET || PORTABLE) + return type.Assembly; +#else + return type.GetTypeInfo().Assembly; +#endif + } + + public static bool IsEnum(this Type type) + { +#if !(DOTNET || PORTABLE) + return type.IsEnum; +#else + return type.GetTypeInfo().IsEnum; +#endif + } + + public static bool IsClass(this Type type) + { +#if !(DOTNET || PORTABLE) + return type.IsClass; +#else + return type.GetTypeInfo().IsClass; +#endif + } + + public static bool IsSealed(this Type type) + { +#if !(DOTNET || PORTABLE) + return type.IsSealed; +#else + return type.GetTypeInfo().IsSealed; +#endif + } + +#if (PORTABLE40 || DOTNET || PORTABLE) + public static PropertyInfo GetProperty(this Type type, string name, BindingFlags bindingFlags, object placeholder1, Type propertyType, IList indexParameters, object placeholder2) + { + IEnumerable propertyInfos = type.GetProperties(bindingFlags); + + return propertyInfos.Where(p => + { + if (name != null && name != p.Name) + { + return false; + } + if (propertyType != null && propertyType != p.PropertyType) + { + return false; + } + if (indexParameters != null) + { + if (!p.GetIndexParameters().Select(ip => ip.ParameterType).SequenceEqual(indexParameters)) + { + return false; + } + } + + return true; + }).SingleOrDefault(); + } + + public static IEnumerable GetMember(this Type type, string name, MemberTypes memberType, BindingFlags bindingFlags) + { +#if PORTABLE + return type.GetMemberInternal(name, memberType, bindingFlags); +#else + return type.GetMember(name, bindingFlags).Where(m => + { + if (m.MemberType() != memberType) + { + return false; + } + + return true; + }); +#endif + } +#endif + +#if (DOTNET || PORTABLE) + public static MethodInfo GetBaseDefinition(this MethodInfo method) + { + return method.GetRuntimeBaseDefinition(); + } +#endif + +#if (DOTNET || PORTABLE) + public static bool IsDefined(this Type type, Type attributeType, bool inherit) + { + return type.GetTypeInfo().CustomAttributes.Any(a => a.AttributeType == attributeType); + } + +#if !DOTNET + public static MethodInfo GetMethod(this Type type, string name) + { + return type.GetMethod(name, DefaultFlags); + } + + public static MethodInfo GetMethod(this Type type, string name, BindingFlags bindingFlags) + { + return type.GetTypeInfo().GetDeclaredMethod(name); + } + + public static MethodInfo GetMethod(this Type type, IList parameterTypes) + { + return type.GetMethod(null, parameterTypes); + } + + public static MethodInfo GetMethod(this Type type, string name, IList parameterTypes) + { + return type.GetMethod(name, DefaultFlags, null, parameterTypes, null); + } + + public static MethodInfo GetMethod(this Type type, string name, BindingFlags bindingFlags, object placeHolder1, IList parameterTypes, object placeHolder2) + { + return type.GetTypeInfo().DeclaredMethods.Where( + m => + { + if (name != null && m.Name != name) + { + return false; + } + + if (!TestAccessibility(m, bindingFlags)) + { + return false; + } + + return m.GetParameters().Select(p => p.ParameterType).SequenceEqual(parameterTypes); + }).SingleOrDefault(); + } + + public static IEnumerable GetConstructors(this Type type) + { + return type.GetConstructors(DefaultFlags); + } + + public static IEnumerable GetConstructors(this Type type, BindingFlags bindingFlags) + { + return type.GetConstructors(bindingFlags, null); + } + + private static IEnumerable GetConstructors(this Type type, BindingFlags bindingFlags, IList parameterTypes) + { + return type.GetTypeInfo().DeclaredConstructors.Where( + c => + { + if (!TestAccessibility(c, bindingFlags)) + { + return false; + } + + if (parameterTypes != null && !c.GetParameters().Select(p => p.ParameterType).SequenceEqual(parameterTypes)) + { + return false; + } + + return true; + }); + } + + public static ConstructorInfo GetConstructor(this Type type, IList parameterTypes) + { + return type.GetConstructor(DefaultFlags, null, parameterTypes, null); + } + + public static ConstructorInfo GetConstructor(this Type type, BindingFlags bindingFlags, object placeholder1, IList parameterTypes, object placeholder2) + { + return type.GetConstructors(bindingFlags, parameterTypes).SingleOrDefault(); + } + + public static MemberInfo[] GetMember(this Type type, string member) + { + return type.GetMemberInternal(member, null, DefaultFlags); + } + + public static MemberInfo[] GetMember(this Type type, string member, BindingFlags bindingFlags) + { + return type.GetMemberInternal(member, null, bindingFlags); + } + + public static MemberInfo[] GetMemberInternal(this Type type, string member, MemberTypes? memberType, BindingFlags bindingFlags) + { + return type.GetTypeInfo().GetMembersRecursive().Where(m => + m.Name == member && + // test type before accessibility - accessibility doesn't support some types + (memberType == null || m.MemberType() == memberType) && + TestAccessibility(m, bindingFlags)).ToArray(); + } + + public static MemberInfo GetField(this Type type, string member) + { + return type.GetField(member, DefaultFlags); + } + + public static MemberInfo GetField(this Type type, string member, BindingFlags bindingFlags) + { + return type.GetTypeInfo().GetDeclaredField(member); + } + + public static IEnumerable GetProperties(this Type type, BindingFlags bindingFlags) + { + IList properties = (bindingFlags.HasFlag(BindingFlags.DeclaredOnly)) + ? type.GetTypeInfo().DeclaredProperties.ToList() + : type.GetTypeInfo().GetPropertiesRecursive(); + + return properties.Where(p => TestAccessibility(p, bindingFlags)); + } + + private static IList GetMembersRecursive(this TypeInfo type) + { + TypeInfo t = type; + IList members = new List(); + while (t != null) + { + foreach (MemberInfo member in t.DeclaredMembers) + { + if (!members.Any(p => p.Name == member.Name)) + { + members.Add(member); + } + } + t = (t.BaseType != null) ? t.BaseType.GetTypeInfo() : null; + } + + return members; + } + + private static IList GetPropertiesRecursive(this TypeInfo type) + { + TypeInfo t = type; + IList properties = new List(); + while (t != null) + { + foreach (PropertyInfo member in t.DeclaredProperties) + { + if (!properties.Any(p => p.Name == member.Name)) + { + properties.Add(member); + } + } + t = (t.BaseType != null) ? t.BaseType.GetTypeInfo() : null; + } + + return properties; + } + + private static IList GetFieldsRecursive(this TypeInfo type) + { + TypeInfo t = type; + IList fields = new List(); + while (t != null) + { + foreach (FieldInfo member in t.DeclaredFields) + { + if (!fields.Any(p => p.Name == member.Name)) + { + fields.Add(member); + } + } + t = (t.BaseType != null) ? t.BaseType.GetTypeInfo() : null; + } + + return fields; + } + + public static IEnumerable GetMethods(this Type type, BindingFlags bindingFlags) + { + return type.GetTypeInfo().DeclaredMethods; + } + + public static PropertyInfo GetProperty(this Type type, string name) + { + return type.GetProperty(name, DefaultFlags); + } + + public static PropertyInfo GetProperty(this Type type, string name, BindingFlags bindingFlags) + { + return type.GetTypeInfo().GetDeclaredProperty(name); + } + + public static IEnumerable GetFields(this Type type) + { + return type.GetFields(DefaultFlags); + } + + public static IEnumerable GetFields(this Type type, BindingFlags bindingFlags) + { + IList fields = (bindingFlags.HasFlag(BindingFlags.DeclaredOnly)) + ? type.GetTypeInfo().DeclaredFields.ToList() + : type.GetTypeInfo().GetFieldsRecursive(); + + return fields.Where(f => TestAccessibility(f, bindingFlags)).ToList(); + } + + private static bool TestAccessibility(PropertyInfo member, BindingFlags bindingFlags) + { + if (member.GetMethod != null && TestAccessibility(member.GetMethod, bindingFlags)) + { + return true; + } + + if (member.SetMethod != null && TestAccessibility(member.SetMethod, bindingFlags)) + { + return true; + } + + return false; + } + + private static bool TestAccessibility(MemberInfo member, BindingFlags bindingFlags) + { + if (member is FieldInfo) + { + return TestAccessibility((FieldInfo) member, bindingFlags); + } + else if (member is MethodBase) + { + return TestAccessibility((MethodBase) member, bindingFlags); + } + else if (member is PropertyInfo) + { + return TestAccessibility((PropertyInfo) member, bindingFlags); + } + + throw new Exception("Unexpected member type."); + } + + private static bool TestAccessibility(FieldInfo member, BindingFlags bindingFlags) + { + bool visibility = (member.IsPublic && bindingFlags.HasFlag(BindingFlags.Public)) || + (!member.IsPublic && bindingFlags.HasFlag(BindingFlags.NonPublic)); + + bool instance = (member.IsStatic && bindingFlags.HasFlag(BindingFlags.Static)) || + (!member.IsStatic && bindingFlags.HasFlag(BindingFlags.Instance)); + + return visibility && instance; + } + + private static bool TestAccessibility(MethodBase member, BindingFlags bindingFlags) + { + bool visibility = (member.IsPublic && bindingFlags.HasFlag(BindingFlags.Public)) || + (!member.IsPublic && bindingFlags.HasFlag(BindingFlags.NonPublic)); + + bool instance = (member.IsStatic && bindingFlags.HasFlag(BindingFlags.Static)) || + (!member.IsStatic && bindingFlags.HasFlag(BindingFlags.Instance)); + + return visibility && instance; + } + + public static Type[] GetGenericArguments(this Type type) + { + return type.GetTypeInfo().GenericTypeArguments; + } + + public static IEnumerable GetInterfaces(this Type type) + { + return type.GetTypeInfo().ImplementedInterfaces; + } + + public static IEnumerable GetMethods(this Type type) + { + return type.GetTypeInfo().DeclaredMethods; + } +#endif +#endif + + public static bool IsAbstract(this Type type) + { +#if !(DOTNET || PORTABLE) + return type.IsAbstract; +#else + return type.GetTypeInfo().IsAbstract; +#endif + } + + public static bool IsVisible(this Type type) + { +#if !(DOTNET || PORTABLE) + return type.IsVisible; +#else + return type.GetTypeInfo().IsVisible; +#endif + } + + public static bool IsValueType(this Type type) + { +#if !(DOTNET || PORTABLE) + return type.IsValueType; +#else + return type.GetTypeInfo().IsValueType; +#endif + } + + public static bool AssignableToTypeName(this Type type, string fullTypeName, out Type match) + { + Type current = type; + + while (current != null) + { + if (string.Equals(current.FullName, fullTypeName, StringComparison.Ordinal)) + { + match = current; + return true; + } + + current = current.BaseType(); + } + + foreach (Type i in type.GetInterfaces()) + { + if (string.Equals(i.Name, fullTypeName, StringComparison.Ordinal)) + { + match = type; + return true; + } + } + + match = null; + return false; + } + + public static bool AssignableToTypeName(this Type type, string fullTypeName) + { + Type match; + return type.AssignableToTypeName(fullTypeName, out match); + } + + public static bool ImplementInterface(this Type type, Type interfaceType) + { + for (Type currentType = type; currentType != null; currentType = currentType.BaseType()) + { + IEnumerable interfaces = currentType.GetInterfaces(); + foreach (Type i in interfaces) + { + if (i == interfaceType || (i != null && i.ImplementInterface(interfaceType))) + { + return true; + } + } + } + + return false; + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/Utilities/ValidationUtils.cs b/Common/00-1Json8.3/Json8.3/Utilities/ValidationUtils.cs new file mode 100644 index 0000000..845ba3e --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/Utilities/ValidationUtils.cs @@ -0,0 +1,40 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json.Utilities +{ + internal static class ValidationUtils + { + public static void ArgumentNotNull(object value, string parameterName) + { + if (value == null) + { + throw new ArgumentNullException(parameterName); + } + } + } +} \ No newline at end of file diff --git a/Common/00-1Json8.3/Json8.3/WriteState.cs b/Common/00-1Json8.3/Json8.3/WriteState.cs new file mode 100644 index 0000000..b28b542 --- /dev/null +++ b/Common/00-1Json8.3/Json8.3/WriteState.cs @@ -0,0 +1,72 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +#endregion + +using System; + +namespace Newtonsoft.Json +{ + /// + /// Specifies the state of the . + /// + public enum WriteState + { + /// + /// An exception has been thrown, which has left the in an invalid state. + /// You may call the method to put the in the Closed state. + /// Any other method calls results in an being thrown. + /// + Error = 0, + + /// + /// The method has been called. + /// + Closed = 1, + + /// + /// An object is being written. + /// + Object = 2, + + /// + /// A array is being written. + /// + Array = 3, + + /// + /// A constructor is being written. + /// + Constructor = 4, + + /// + /// A property is being written. + /// + Property = 5, + + /// + /// A write method has not been called. + /// + Start = 6 + } +} \ No newline at end of file diff --git a/Common/00-2AppConfigSet/AppConfigSet.sln b/Common/00-2AppConfigSet/AppConfigSet.sln new file mode 100644 index 0000000..32d9819 --- /dev/null +++ b/Common/00-2AppConfigSet/AppConfigSet.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32929.386 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppConfigSet", "AppConfigSet\AppConfigSet.csproj", "{5FD5DE57-CC26-4FD0-B852-5362123BC4FF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5FD5DE57-CC26-4FD0-B852-5362123BC4FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5FD5DE57-CC26-4FD0-B852-5362123BC4FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5FD5DE57-CC26-4FD0-B852-5362123BC4FF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5FD5DE57-CC26-4FD0-B852-5362123BC4FF}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {54390EDE-FC5D-4007-A0C4-5012CDDAF613} + EndGlobalSection +EndGlobal diff --git a/Common/00-2AppConfigSet/AppConfigSet/00-1AppConfigSetForm.csproj b/Common/00-2AppConfigSet/AppConfigSet/00-1AppConfigSetForm.csproj new file mode 100644 index 0000000..6cb61d1 --- /dev/null +++ b/Common/00-2AppConfigSet/AppConfigSet/00-1AppConfigSetForm.csproj @@ -0,0 +1,87 @@ + + + + + Debug + AnyCPU + {5FD5DE57-CC26-4FD0-B852-5362123BC4FF} + WinExe + AppConfigSet + AppConfigSet + v4.8 + 512 + true + true + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + Form + + + AppConfigSetForm.cs + + + + + AppConfigSetForm.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + \ No newline at end of file diff --git a/Common/00-2AppConfigSet/AppConfigSet/App.config b/Common/00-2AppConfigSet/AppConfigSet/App.config new file mode 100644 index 0000000..4bfa005 --- /dev/null +++ b/Common/00-2AppConfigSet/AppConfigSet/App.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/Common/00-2AppConfigSet/AppConfigSet/AppConfigSetForm.Designer.cs b/Common/00-2AppConfigSet/AppConfigSet/AppConfigSetForm.Designer.cs new file mode 100644 index 0000000..c0d66f0 --- /dev/null +++ b/Common/00-2AppConfigSet/AppConfigSet/AppConfigSetForm.Designer.cs @@ -0,0 +1,213 @@ + +namespace AppConfigSetting +{ + partial class AppConfigSetForm + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AppConfigSetForm)); + this.label1 = new System.Windows.Forms.Label(); + this.textBox_IsDemoMesServer = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.textBox_ConnectionString_MES = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.textBox_Url_WebApiDT = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.textBox_Url_WebApi = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.textBox_MqttUrl = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.textBox_MqttTargetTopicPLC = new System.Windows.Forms.TextBox(); + this.button_Read = new System.Windows.Forms.Button(); + this.button_Update = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(33, 28); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(95, 12); + this.label1.TabIndex = 0; + this.label1.Text = "IsDemoMesServer"; + // + // textBox_IsDemoMesServer + // + this.textBox_IsDemoMesServer.Location = new System.Drawing.Point(240, 25); + this.textBox_IsDemoMesServer.Name = "textBox_IsDemoMesServer"; + this.textBox_IsDemoMesServer.Size = new System.Drawing.Size(553, 21); + this.textBox_IsDemoMesServer.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(33, 66); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(125, 12); + this.label2.TabIndex = 0; + this.label2.Text = "ConnectionString_MES"; + // + // textBox_ConnectionString_MES + // + this.textBox_ConnectionString_MES.Location = new System.Drawing.Point(240, 63); + this.textBox_ConnectionString_MES.Name = "textBox_ConnectionString_MES"; + this.textBox_ConnectionString_MES.Size = new System.Drawing.Size(553, 21); + this.textBox_ConnectionString_MES.TabIndex = 1; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(33, 105); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(77, 12); + this.label3.TabIndex = 0; + this.label3.Text = "Url_WebApiDT"; + // + // textBox_Url_WebApiDT + // + this.textBox_Url_WebApiDT.Location = new System.Drawing.Point(240, 102); + this.textBox_Url_WebApiDT.Name = "textBox_Url_WebApiDT"; + this.textBox_Url_WebApiDT.Size = new System.Drawing.Size(553, 21); + this.textBox_Url_WebApiDT.TabIndex = 1; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(33, 147); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(65, 12); + this.label4.TabIndex = 0; + this.label4.Text = "Url_WebApi"; + // + // textBox_Url_WebApi + // + this.textBox_Url_WebApi.Location = new System.Drawing.Point(240, 144); + this.textBox_Url_WebApi.Name = "textBox_Url_WebApi"; + this.textBox_Url_WebApi.Size = new System.Drawing.Size(553, 21); + this.textBox_Url_WebApi.TabIndex = 1; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(33, 184); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(47, 12); + this.label5.TabIndex = 0; + this.label5.Text = "MqttUrl"; + // + // textBox_MqttUrl + // + this.textBox_MqttUrl.Location = new System.Drawing.Point(240, 181); + this.textBox_MqttUrl.Name = "textBox_MqttUrl"; + this.textBox_MqttUrl.Size = new System.Drawing.Size(553, 21); + this.textBox_MqttUrl.TabIndex = 1; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(33, 222); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(113, 12); + this.label6.TabIndex = 0; + this.label6.Text = "MqttTargetTopic"; + // + // textBox_MqttTargetTopicPLC + // + this.textBox_MqttTargetTopicPLC.Location = new System.Drawing.Point(240, 219); + this.textBox_MqttTargetTopicPLC.Name = "textBox_MqttTargetTopicPLC"; + this.textBox_MqttTargetTopicPLC.Size = new System.Drawing.Size(553, 21); + this.textBox_MqttTargetTopicPLC.TabIndex = 1; + // + // button_Read + // + this.button_Read.Location = new System.Drawing.Point(240, 259); + this.button_Read.Name = "button_Read"; + this.button_Read.Size = new System.Drawing.Size(102, 23); + this.button_Read.TabIndex = 2; + this.button_Read.Text = "读取配置文件"; + this.button_Read.UseVisualStyleBackColor = true; + this.button_Read.Click += new System.EventHandler(this.button_Read_Click); + // + // button_Update + // + this.button_Update.Location = new System.Drawing.Point(674, 259); + this.button_Update.Name = "button_Update"; + this.button_Update.Size = new System.Drawing.Size(102, 23); + this.button_Update.TabIndex = 2; + this.button_Update.Text = "更新配置文件"; + this.button_Update.UseVisualStyleBackColor = true; + this.button_Update.Click += new System.EventHandler(this.button_Update_Click); + // + // AppConfigSetForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(844, 301); + this.Controls.Add(this.button_Update); + this.Controls.Add(this.button_Read); + this.Controls.Add(this.textBox_MqttTargetTopicPLC); + this.Controls.Add(this.label6); + this.Controls.Add(this.textBox_MqttUrl); + this.Controls.Add(this.label5); + this.Controls.Add(this.textBox_Url_WebApi); + this.Controls.Add(this.label4); + this.Controls.Add(this.textBox_Url_WebApiDT); + this.Controls.Add(this.label3); + this.Controls.Add(this.textBox_ConnectionString_MES); + this.Controls.Add(this.label2); + this.Controls.Add(this.textBox_IsDemoMesServer); + this.Controls.Add(this.label1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximumSize = new System.Drawing.Size(860, 340); + this.MinimumSize = new System.Drawing.Size(860, 340); + this.Name = "AppConfigSetForm"; + this.Text = "修改配置文件"; + this.TopMost = true; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox textBox_IsDemoMesServer; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox textBox_ConnectionString_MES; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox textBox_Url_WebApiDT; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox textBox_Url_WebApi; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox textBox_MqttUrl; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox textBox_MqttTargetTopicPLC; + private System.Windows.Forms.Button button_Read; + private System.Windows.Forms.Button button_Update; + } +} + diff --git a/Common/00-2AppConfigSet/AppConfigSet/AppConfigSetForm.cs b/Common/00-2AppConfigSet/AppConfigSet/AppConfigSetForm.cs new file mode 100644 index 0000000..1299607 --- /dev/null +++ b/Common/00-2AppConfigSet/AppConfigSet/AppConfigSetForm.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Configuration; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace AppConfigSetting +{ + public partial class AppConfigSetForm : Form + { + string key_IsDemoMesServer = "IsDemoMesServer"; + string key_ConnectionString_MES = "ConnectionString_MES"; + string key_Url_WebApiDT = "Url_WebApiDT"; + string key_Url_WebApi = "Url_WebApi"; + string key_MqttUrl = "MqttUrl"; + string key_MqttTargetTopicPLC = "MqttTargetTopic"; + + public AppConfigSetForm() + { + InitializeComponent(); + ReadConfig(); + } + + private void button_Read_Click(object sender, EventArgs e) + { + ReadConfig(); + } + private void ReadConfig() + { + textBox_IsDemoMesServer.Text = AppConfig.GetAppSettingsValue(key_IsDemoMesServer); + textBox_ConnectionString_MES.Text = AppConfig.GetAppSettingsValue(key_ConnectionString_MES); + textBox_Url_WebApiDT.Text = AppConfig.GetAppSettingsValue(key_Url_WebApiDT); + textBox_Url_WebApi.Text = AppConfig.GetAppSettingsValue(key_Url_WebApi); + textBox_MqttUrl.Text = AppConfig.GetAppSettingsValue(key_MqttUrl); + textBox_MqttTargetTopicPLC.Text = AppConfig.GetAppSettingsValue(key_MqttTargetTopicPLC); + } + private void UdateConfig() + { + AppConfig.UpdateAppSettings(key_IsDemoMesServer, textBox_IsDemoMesServer.Text); + AppConfig.UpdateAppSettings(key_ConnectionString_MES, textBox_ConnectionString_MES.Text); + AppConfig.UpdateAppSettings(key_Url_WebApiDT, textBox_Url_WebApiDT.Text); + AppConfig.UpdateAppSettings(key_Url_WebApi, textBox_Url_WebApi.Text); + AppConfig.UpdateAppSettings(key_MqttUrl, textBox_MqttUrl.Text); + AppConfig.UpdateAppSettings(key_MqttTargetTopicPLC, textBox_MqttTargetTopicPLC.Text); + } + + private void button_Update_Click(object sender, EventArgs e) + { + UdateConfig(); + } + } + + public class AppConfig + { + public static string GetAppSettingsValue(string key) + { + ConfigurationManager.RefreshSection("appSettings"); + return ConfigurationManager.AppSettings[key] ?? string.Empty; + } + public static bool UpdateAppSettings(string key, string value) + { + var _config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); + if (!_config.HasFile) + { + throw new ArgumentException("程序配置文件缺失!"); + } + KeyValueConfigurationElement _key = _config.AppSettings.Settings[key]; + if (_key == null) + _config.AppSettings.Settings.Add(key, value); + else + _config.AppSettings.Settings[key].Value = value; + _config.Save(ConfigurationSaveMode.Modified); + return true; + } + } +} diff --git a/Common/00-2AppConfigSet/AppConfigSet/AppConfigSetForm.resx b/Common/00-2AppConfigSet/AppConfigSet/AppConfigSetForm.resx new file mode 100644 index 0000000..39220d8 --- /dev/null +++ b/Common/00-2AppConfigSet/AppConfigSet/AppConfigSetForm.resx @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAABMLAAATCwAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgChADIAoQIyAKEgMgChczIA + occyAKHqMgChmTIAoTwyAKEJMgChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgChADIAoQQyAKEvMgChdzIA + odYyAKH7MgCh/zIAof8yAKH/MgCh6jIAoacyAKFJMgChEjIAoQAyAKEAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAKEAMgChADIAoQoyAKE+MgChkTIA + oeoyAKH+MgCh+TIAoe0yAKH+MgCh/zIAofwyAKH3MgCh/jIAofgyAKHBMgChZDIAoR4yAKEBMgChAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAKEAMgChATIAoRUyAKFcMgChujIA + ofEyAKH/MgCh9DIAobcyAKFPMgChfjIAof8yAKH/MgCh5TIAoVUyAKGLMgCh4jIAofwyAKH9MgCh2TIA + oYcyAKEoMgChBTIAoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAKEAMgChAjIAoSYyAKF2MgCh0DIA + ofcyAKH+MgCh8zIAof8yAKGjMgChDTIAoQAyAKFpMgCh/zIAof8yAKHhMgChHjIAoQIyAKEiMgChbjIA + ocoyAKH3MgCh/jIAoeUyAKGfMgChQTIAoQsyAKEAAAAAAAAAAAAAAAAAMgChCDIAoUEyAKGXMgCh4jIA + of4yAKH/MgChzzIAoW0yAKFoMgCh+zIAoZcyAKEAMgChADIAoWkyAKH/MgCh/zIAoeEyAKEeMgChADIA + oQAyAKEBMgChETIAoVAyAKGiMgCh8DIAof8yAKH0MgChuTIAoW0yAKEVMgChADIAoQAyAKG2MgCh7TIA + of8yAKHvMgCh7jIAofgyAKFLMgChADIAoTcyAKH1MgChlzIAoQAyAKEAMgChaTIAof8yAKH/MgCh4TIA + oR4yAKEAAAAAAAAAAAAAAAAAMgChADIAoQcyAKE4MgChijIAod8yAKH9MgCh+zIAoc4yAKFdMgChADIA + of8yAKHlMgChlDIAoToyAKGgMgCh7jIAoSwyAKEAMgChFzIAodgyAKGZMgChADIAoQAyAKFpMgCh/zIA + of8yAKHxMgChfDIAoSkyAKEBMgChAAAAAAAAAAAAAAAAADIAoQAyAKECMgChITIAoW8yAKG/MgCh/zIA + oZYyAKEAMgCh/zIAoZoyAKEBMgChADIAoZkyAKHSMgChEjIAoQAyAKEGMgChujIAoZoyAKEAMgChADIA + oWkyAKH/MgCh/zIAof0yAKH+MgCh4TIAoZIyAKFEMgChDjIAoQAyAKEAAAAAAAAAAAAAAAAAMgChADIA + oUIyAKH7MgChlzIAoQAyAKH/MgChlzIAoQAyAKEAMgChmjIAobMyAKEEMgChADIAoQAyAKGcMgChmzIA + oQAyAKEAMgChaTIAof8yAKH/MgCh4zIAoZYyAKHRMgCh+zIAofQyAKHDMgChZDIAoSIyAKEBMgChAAAA + AAAyAKEAMgChPzIAofsyAKGXMgChADIAof8yAKGXMgChADIAoQAyAKGaMgChiDIAoQAAAAAAMgChADIA + oYgyAKGaMgChADIAoQAyAKFpMgCh/zIAof8yAKHhMgChIDIAoRIyAKFeMgChqzIAoe0yAKH+MgCh3jIA + oYYyAKEqMgChADIAoQAyAKE/MgCh+zIAoZcyAKEAMgCh/zIAoZcyAKEAMgChADIAoZgyAKFtMgChAAAA + AAAyAKEAMgChXDIAoZQyAKEAMgChADIAoWkyAKH/MgCh/zIAoeEyAKEeMgChADIAoQAyAKEGMgChMDIA + oX8yAKHTMgCh+jIAoWkyAKEAMgChADIAoT8yAKH7MgChlzIAoQAyAKH/MgChlzIAoQAyAKEAMgChlTIA + oWMyAKEAAAAAADIAoQAyAKE2MgChhTIAoQAyAKEAMgChaTIAof8yAKH/MgCh4TIAoR4yAKEAAAAAAAAA + AAAyAKEAMgChATIAoRUyAKFYMgChQDIAoQAyAKEAMgChPzIAofsyAKGXMgChADIAof8yAKGXMgChADIA + oQAyAKGLMgChQTIAoQAyAKEFMgChADIAoSMyAKF4MgChADIAoQAyAKFpMgCh/zIAof8yAKHhMgChHjIA + oQAAAAAAAAAAAAAAAAAAAAAAMgChADIAoQAyAKEBMgChADIAoQAyAKE/MgCh+zIAoZcyAKEAMgCh/zIA + oZcyAKEAMgChADIAoXcyAKEkMgChBzIAoUIyAKEBMgChFjIAoWUyAKEBMgChADIAoWkyAKH/MgCh/zIA + oeEyAKEeMgChADIAoQAyAKE5MgChSTIAoQ8yAKEBMgChAAAAAAAAAAAAMgChADIAoT8yAKH7MgChlzIA + oQAyAKH/MgChlzIAoQAyAKECMgChWzIAoQ8yAKEVMgChhTIAoQoyAKEHMgChMzIAoQEyAKEAMgChaTIA + of8yAKH/MgCh4TIAoR4yAKEAMgChADIAoWkyAKH1MgChyzIAoX8yAKE4MgChBTIAoQAyAKEAMgChPzIA + ofsyAKGXMgChADIAof8yAKGXMgChADIAoQMyAKFZMgChCzIAoS4yAKHDMgChGjIAoQAAAAAAAAAAADIA + oQAyAKFpMgCh/zIAof8yAKHhMgChHjIAoQAyAKEAMgChLDIAoaEyAKHkMgCh/DIAoe8yAKGrMgChUzIA + oREyAKFBMgCh+zIAoZcyAKEAMgCh/zIAoZcyAKEAMgChBzIAoVAyAKEEMgChQTIAodoyAKEjMgChAAAA + AAAAAAAAMgChADIAoWkyAKH/MgCh/zIAoeEyAKEeMgChAAAAAAAyAKEAMgChBjIAoSAyAKFyMgChwjIA + ofMyAKH4MgCh0zIAobMyAKH9MgChljIAoQAyAKH/MgChlzIAoQAyAKEBMgChBDIAoQAyAKFKMgCh7jIA + oT0yAKEAAAAAADIAoQAyAKEAMgChbDIAof8yAKH/MgCh4TIAoR8yAKEAAAAAAAAAAAAAAAAAMgChADIA + oQEyAKELMgChRzIAoZYyAKHeMgCh/TIAof8yAKGWMgChADIAof8yAKGXMgChAAAAAAAAAAAAMgChADIA + oW0yAKH/MgChZDIAoQAyAKEEMgChHDIAoWAyAKHPMgCh/zIAof8yAKH3MgChkTIAoS8yAKELMgChADIA + oQAAAAAAAAAAAAAAAAAyAKEAMgChATIAoSAyAKF2MgCh/zIAoZYyAKEAMgCh/zIAoZcyAKEAAAAAADIA + oQAyAKEAMgChljIAof8yAKGeMgChOTIAoZEyAKHcMgCh+TIAof8yAKH/MgCh/zIAof8yAKH+MgCh6jIA + obgyAKFXMgChITIAoQEyAKEAAAAAAAAAAAAAAAAAMgChADIAoT8yAKH7MgChlzIAoQAyAKH/MgChlzIA + oQAAAAAAMgChADIAoQwyAKG9MgCh/zIAofMyAKHyMgCh/jIAof8yAKH/MgCh/zIAofoyAKH3MgCh/jIA + of8yAKH/MgCh/zIAofsyAKHbMgChmzIAoUwyAKENMgChATIAoQAyAKEAMgChPzIAofsyAKGXMgChADIA + of8yAKGXMgChATIAoRkyAKFbMgChsTIAofAyAKH/MgCh/zIAof8yAKH/MgCh/DIAoeYyAKGxMgChVTIA + oUIyAKGFMgCh1TIAofUyAKH/MgCh/zIAof8yAKH/MgCh9DIAocUyAKGDMgChMDIAoQYyAKE/MgCh+zIA + oZcyAKEAMgCh/zIAocEyAKGOMgCh2TIAofcyAKH/MgCh/zIAof8yAKH/MgCh7jIAobMyAKFwMgChJjIA + oQoyAKEAMgChADIAoQEyAKEXMgChTTIAoZsyAKHYMgCh/TIAof8yAKH/MgCh/zIAof4yAKHqMgChszIA + oZgyAKH+MgChljIAoQAyAKH/MgCh/zIAof8yAKH/MgCh/zIAof8yAKH0MgChyTIAoYEyAKE/MgChBzIA + oQAAAAAAMgChADIAoSIyAKF2MgChQjIAoRIyAKEAMgChATIAoR4yAKFjMgChrjIAoecyAKH9MgCh/zIA + of8yAKH/MgCh/zIAof8yAKGWMgChADIAof8yAKH/MgCh/zIAofkyAKHWMgChmjIAoUIyAKERMgChATIA + oQAyAKEGMgChFTIAoQMyAKEAMgChKDIAoZUyAKHHMgChxjIAoXcyAKE3MgChBzIAoQAyAKEGMgChKTIA + oXYyAKHDMgCh7jIAof4yAKH/MgCh/zIAoZYyAKEAMgChrjIAoeYyAKH+MgCh0zIAoVcyAKELMgChADIA + oQAyAKEAMgChADIAoVUyAKHAMgChkjIAoVYyAKEUMgChATIAoRYyAKFhMgChqzIAodUyAKGmMgChZTIA + oR8yAKEDMgChBDIAoS0yAKGiMgCh9DIAofUyAKHGMgChWTIAoQAyAKEGMgChKjIAoWsyAKHBMgCh3DIA + ocEyAKFwMgChJTIAoQYyAKEAMgChDDIAoTgyAKF/MgChyjIAocMyAKGUMgChMzIAoQsyAKEEMgChJjIA + oWUyAKG/MgCh0TIAoaYyAKGoMgCh1TIAodYyAKGNMgChQTIAoRAyAKEAMgChAAAAAAAyAKEAMgChADIA + oQ8yAKE8MgChkDIAoc8yAKHfMgChpDIAoVIyAKEcMgChADIAoQEyAKETMgChRzIAoZ8yAKHGMgChvzIA + oWQyAKEtMgChMzIAoY8yAKHvMgCh5zIAoa8yAKFcMgChHDIAoQMyAKEAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAADIAoQAyAKECMgChFTIAoVcyAKGaMgCh3DIAodEyAKGaMgChSDIAoQsyAKEAMgChATIA + oSUyAKGGMgCh6TIAofEyAKHhMgChtzIAoXAyAKErMgChBTIAoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgChADIAoQIyAKElMgChXTIAobgyAKHbMgChxTIA + oYUyAKFbMgChqzIAodEyAKHLMgChhDIAoTsyAKELMgChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAKEAMgChCzIA + oTcyAKGTMgCh0zIAofAyAKG2MgChWjIAoRcyAKEBMgChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA/+Af//+AB//8AAD/8AAAP8AIAA8AGDABARg+AQEYD4ERGAPxMZgAcTOY + ADEzmDAxM5g8MTKIPzEgCDDxIAgwMSB4MAEgeDgBJHg+ATxAD8E8AAHxOAAAMQAAAAEAAwABABwgAQBE + BAEBwAABAEAAA+AAAA/4AAB//wAD///gD/8= + + + \ No newline at end of file diff --git a/Common/00-2AppConfigSet/AppConfigSet/Program.cs b/Common/00-2AppConfigSet/AppConfigSet/Program.cs new file mode 100644 index 0000000..1925b68 --- /dev/null +++ b/Common/00-2AppConfigSet/AppConfigSet/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace AppConfigSetting +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new AppConfigSetForm()); + } + } +} diff --git a/Common/00-2AppConfigSet/AppConfigSet/Properties/AssemblyInfo.cs b/Common/00-2AppConfigSet/AppConfigSet/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..2d2a19e --- /dev/null +++ b/Common/00-2AppConfigSet/AppConfigSet/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("AppConfigSet")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AppConfigSet")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("5fd5de57-cc26-4fd0-b852-5362123bc4ff")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Common/00-2AppConfigSet/AppConfigSet/Properties/Resources.Designer.cs b/Common/00-2AppConfigSet/AppConfigSet/Properties/Resources.Designer.cs new file mode 100644 index 0000000..920e1e9 --- /dev/null +++ b/Common/00-2AppConfigSet/AppConfigSet/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace AppConfigSet.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AppConfigSet.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Common/00-2AppConfigSet/AppConfigSet/Properties/Resources.resx b/Common/00-2AppConfigSet/AppConfigSet/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Common/00-2AppConfigSet/AppConfigSet/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Common/00-2AppConfigSet/AppConfigSet/Properties/Settings.Designer.cs b/Common/00-2AppConfigSet/AppConfigSet/Properties/Settings.Designer.cs new file mode 100644 index 0000000..2828d4f --- /dev/null +++ b/Common/00-2AppConfigSet/AppConfigSet/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace AppConfigSet.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.0.3.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Common/00-2AppConfigSet/AppConfigSet/Properties/Settings.settings b/Common/00-2AppConfigSet/AppConfigSet/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Common/00-2AppConfigSet/AppConfigSet/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Common/00MesWorkMqtt/Common/dll/MQTTnet.Extensions.ManagedClient.dll b/Common/00MesWorkMqtt/Common/dll/MQTTnet.Extensions.ManagedClient.dll new file mode 100644 index 0000000000000000000000000000000000000000..99035f681521e2f7de77f9108af911e9768b8054 GIT binary patch literal 45568 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 mVvNAhON@zWFjAF%cRoA_V%!2bc-3~m|# literal 0 HcmV?d00001 diff --git a/Common/00MesWorkMqtt/Common/dll/MQTTnet.dll b/Common/00MesWorkMqtt/Common/dll/MQTTnet.dll new file mode 100644 index 0000000000000000000000000000000000000000..29514337fa29d1b44093bb04d465550f31c5eba2 GIT binary patch literal 293376 zcmd@7d3aq_^#_cfoOABE$xS+>X>QV{Z9+@J;ohXB4MQnYnPr{|w1AWu88_TZQJd^i z5K*C21{Fk51aU%~5fx{}37IM&3RXlBMR7ny6fN)Pv)0+?oSURYf8XEpynnoT+Pl_X zd+oK?UV9$TA;(?g1)k@H`2Xswp7%vS{wqPY7`+DBN zO@a5!RpvHb-7oGm5 zi{Repf+Sr`EA-C)^?BY&^K13msUV7OOgsL07x5?iTZ-(OUpxI=14ioVL1&Tmrg40G zWuX-7rCsqy-F&a$J@r77_r-7cUW-t(pLeYfy|tNhv)CMeqzOt^=K6sZ1O#T25Cj1M zc2_O-^N|X|kl`{Ghxj47wM#)}Z+X^;uwBjj-ELJ#w|DDW8^LT}j9R zzno&-3HE+}1kr^^Fg#JZh=E%AeTFN4Ei@VLSs zfz3o{AE|UGDKJ}!I0l$YFIWNr=$uCVjkkvXP`5wAoE1wA zw$_GdfpZF8wAvpbQ`ta_dRnTaA@54{0sNH8t?cms8JLzhZDn8~;xrTsCUNGOL4;Ao)d1Kp^!7|z0e`5q*6t$_ z+aj^6eFL*ZL;m!NV(W*ZH86OoBE?Q=<;3eOQ>D*!emn?>vIV6=KkOfB8^}qtD1srP z9-%Lxb0axgT?K&$ijoop0Rah9f*>Hk!b%WikzZep%#HVD+K{G#cbZF69a&%MU-RC; zgF0OUYij7l=Z82q(^ffCKXME;(#VOsqUUAAdD-~x9=49Z^up|{DyMQPI4?$r4 zT^&J?sPaR<%c2!atE}Cfj?gY8D2%PZyD>DRI7nu?_aNkeM-UJgoE{V{9)f^?o?Quo z&>s6VCHANzl_k4382tLHs7-bsLBD|7Y|%V{3X_y9s(Nra=S&f#$Y6KZQIwe>o9GMa>Q3A_}2DwxSVmk9i!Nqh2BUQ#u z3z|18F0miOe0*z;a4ZRL1A!@GIW(w6rOK5)GDMuH7p3^8NYSPadpP|4O&ueI=>5^o zsXZ~kPwn}k#GZE~_WW>S&)e0W>K!8l?MYW^Pl*oIuaxFfAt(1!65h9;78uyi2<)_< z6gaBhF+xx-T`Ctk2HsZCHG-_Mg*hmjeUKCAVZ!(su(&j#ns^wgrD^)S#Npe!1qK%N z7iA-~_XzB?pA$H$Y%yY@4s@kD_#S0q43*0KiiGj)R|N+4YXU?2b%C80JwD5yvc=Gb zGU-ZX2Hx8t6Qf9sb*0RpXk&g5#7`qB{s=2-V0M=Djj%n4d{aUX85me3YAx=IGA$EI zXyx_de|7tK2XI%Cpk=ccTy1`HVw;q_H^`IxmV{ip9#wjJ{dCmn)jg1W6(p6QQ(zV& zn*O11psPAHUdkw^HOVl$ys2rhsiOYIc`QY!l0U+xvaLL+d0G&odBrShdj!-O&UE#K z{-hZ+wxx|*C$wpyLCDfzbI=}|9pJsO)G`<~$7pU#PgT68sZ8l^-rj4eT2^jbbNTUY zvA1u(BQUV{3GB4r5;&^fF>J+rpevUTJ40q0WYup#Z7M~+eFXkdU^f70nTtkHA=?H?bPEcnIF52tw6`ce7V=61XY&1d~ZTFLDd+tN&o2c~uP}jbJ(k^z& zN+*-Cs_%~e2)P3DI;Kx-9(wNu5wN z&+x=ZQ3Ku7+IcYV%r%0GX68TeJlm{S%0I|?9eb7A z{Q3bbGBxlwWb)V3cx;`9L-#`-b0EvhM$Qa!v(NhR(4jvthZBV6NP>bnhG24NmI21E zB1)LU>p`FNX27Yi2c|J$lu8>*#la|YEe=NfP{8-PykpOAY;)Q*pAJC~`=sQDZ=Vtv*q;mRv_BI# zs@`!)^NFtbFa%3YbvPaSsS^D|{y-%@f)tjC!21|%z(2o^;X}z@MEln{hPJB&#TcSw zFBTLdkdl3)py)?R_Dw{kLQZa+W1$VIHASw*jFN3~Xf2@*Om~21GG0Xm@7(+tjBUOo?LA%fT zr+sZlu0Fs=>cg)D2KLtiL;I}2PWwxNqskVeS75!MD{bRdFPJawzh96rzWrk&;}0rB z$uW8Z%AhNe!E(7B($)zX{s;}O&*w4NPvdXj* zMz-uZDWJ97R>ZoMmhDs`XIZ65)xFTCo&c=BejX}jN7#?9@^KXLe)D7e`t>VGEr_GN zU|s>OJp}R=kb!Y}R)T~R0fz40*o~F4at~@7r)s6Ang^qz7X2tj!&gOSHqB!BkG;d* z$fl6^6z}4{z3lOX{5v-~yaPl7>9TH*>g^zTLN=k*?p`6oga9O6?QKzVGSj}x{dPZ1tu()tA8X1G$v&8k+)>_s_v5Mpx z%^)s=Gc^B%YX2qczsTy^@$Ot1dod|ve-#+mzX|NLe-SvU-Z2^)mNmL^p5{}LG3mj#CQ6@dkd`5@{@r+rD_sItdsttgu=m5t_x2GQmQJ$%x)>pWm)F1}47 z$G5Kv3@r9IME-wNzIw-~>6A}bPInAsJru6At_2d-w*`TL4HH?uz)|&%QR69#uAD3k zSUeO(%0f?DvXdl?Z>I{x^0>gzP7&B?+XRj(8yi8&q$|eo0;%mm|Bl5ZZ#HE5BWz0> z>M=`gN1@yiwHKyENlhdzka_Af-(Y-E8d{)DR_$oCmt9G>uN+BluZ}S8MpHCdFb5(h{j6y!vINt9{(|E^tdB~R#*N=$LPj81T+j1v|_`}I>vf|wt?jVK&I=7F|iXW&6%@+b3m=#b;a@3tUku*A6Rs7X-Bn@f)K!mg>lW((2|(c|*dE zt`AwXi<)C~5Mre4kBmS%=KAb{{SkKM_50Zzy(b9G9>`IDL^^V1%X9sSTp0DPK@h@A z61bL-a}hx<_Ull;WXa{%F|a6EGV168ZC>E5L^}EB*AY?4UMh^xrerTm8IyUz)ktD8 zx_Ary#w~_jPO6SBawCzqf|`vBw$l7TvP*U=$p_zVEikZi1%`H>z)ssIa8%jiF3l&p zVi+oy=W}y;UXd`q9TXVYs=!XWt-w+Bj?v1q{LqzatM-5$=BX?gtYjBS7~gI$FtEb{ zJMBV&qw3AsF=f#euWit4>zrP@NEqMlCNQwO3hcB?1dggVcXKFhNm;Lx zFupxNU|6Q3r$kH*Sr${n?n`|p(O(SR>nC5Nj#Gtq*s>JLC>+ebJM_yzx%4ME6RNjr` z1xE=h6?tWU4SJ&YzZmOgegC*c-#^e7@w43@0<4bHBT_vyK21hKdU;IP&88tAHc8gs z{tsba8WVQ2cFxC}nEucIhp;b>3H!g;>iPde*xxcN`X(v(`_*rN(~tK;VT|8Rp96g% z1@U{}iuY!t0%o*D+JOlI!j+C72ncA6ltT~@(5NUu5D?H{DnXEAlIj^+G$WW4TQnTf zXVS?io%?zhOb~dy%MkLJ@d zx^n&9{*ZyXlgc6U+M@(^+9L#xDqGyAGU>|oRbPY5`H;y;S~e}KBk`PN zz88tetuHIV+z8JY1A}U7e%-iez+LJHt4B@?W7wqBQ3wpIQ0j=PaeHKLCW^tbEbp}! zIeW(@K8n&{38Q~=3%oaWf$#l5h8{|W){#z_A@Ktw-+{g^+*F1Ul9_ZAV=y7}XLJlc zW*I$;b-d<#ulIJi&h>K#dMiJs{T$a7c0igJNc+R|HH;NW$kHdm$1E-&tQ#BlZL4vy zO=JFIy&}z<bfs(>DdI z10N!ZgHl02xWf?yLC?oP=5|&YtX$I(m=DqAyzXf5`f%RsBMn|3&3k>U!RzCBuR9yO zK0z1s`mobWkW>5^OM_^$E`_&0aw~OgCg(&REfaWrkRev1Tw)!zK@>f>H#5CjFmHl? z|4=lbmHTH~T-|68LVYkzXl2Czd$2YJdx^2-7J5a#u6xJtmF7B2dN5t~uj-h9M?9NV zP1j5o=E~`5NjW`TU|`P>*lAA{II7<9fRqIZKWDi92+Om9`AeZ~92Lg#;u2=kto5uuyg``I2k*6+vYu7t%^ zgEVN>j7Eqf)RXCU3-^A01jaflRLOn>`fq;kM|@F(2vLI&fTjAQ48!Uti0gu|frJhO z2gGCp>4h{t`!TX3m_Vm5+PL=m1Bt#D`lx;6YRKi9|a(sin9xyY5ImA4>GRFsCQ+ae6*XJz=bpy^G=+_tbKF ziZApe3=GUzsyw(k^L-LL$t?J*sZs2w5_RcIwZ)w)4=DTX^+yuDYdO7%kJEbt^+x`b z?58PjvwDj!^d<}pth@!iKLeiedVe<2m%h|n+&R4$Q|})qde?J$6CbDdqtqKYSF)d@ zyv^z@zR;U6Fvw!e{<1vYnQ=ar#CcIJPU48OvF<$1IFWHB`}y&4W~}OqILQ?lA+$AS#M8f!XRA68+wS=tD zt`XR2R|_0fwiuP0GU*y4bJv{AOC^kNFB2Hpw+IaFoS=t}!xq&&j-6!uWQ*K+FjQhV~kPopznTQDtL8 zNj>ROnK$u#ZcB@6^Mavfe|r3R_69hOdKI8Lw#as6%64L-G(Rv{*ol0UzX@WwCyC`+ z1{cQ`*{(_1#>aB`=41JC63YO4dvQz{i(~6g*~Z5bNGuPIP0N-xaYC~mfwaySy(3U= z`S)59y3+jcgRZOF5TL(YKOcg^_;mah%o+IQLVI*ud@s`nnH}2|y@N#h|5<)s^8c7x z%s`=yTf^QXS5B{&a_HN42@LGJ1$Nr&1dghAJf!85E-jxQ9&fAMFfWMF{gh0T#7Y}z zJF_$w?|VhQZ*LM9*!KzSv^NSIRquGd#!FXP*8(}iz9(eWpH15655T`sp=g9Ol>-jw;fMCNTO z^LB!Q{m=xW$uUm!^Npfqe0MBl??c(YPh{VrvOlb{KSF?w`;P*SwF)`M#qoy;;y?@U z?Ta`X1q5}BBO-&&x@0gClB0E+%}g^|vHvbiu6QuqkqF1XWF18ZjJc(Wd(m+vBZrS= z$6CJvY5{4<^_+#;JXBHbIls!@j%6>DyE*&OUN4BfeETt4D6k&~h%w+Op=A7#Ho$NI z2M;qphQ zw!t7Zig&`A>XfD!eRpZ_mm3!iY+R5?jcV7Yfp0?KjpamUP;xSPI*4c7m?8LEyx0r2 zgKmQF;>|!3n|wHyE#q+ktTVu#D0eK=?Q;AUG0{?{2%QWD3z(Qp#Q_UEb{N-FigPL*@1kfc(Jx2&wCuU-4EVT*!!(OkQK0(P-1R+2f-;@?$QdGlyDH}^P@W#dmt zUAhyw@8(LxQNo@~=PsOk{Fx=?cBpB;h8V|;F*8>6{aXDmVDIAbi^q1OeeYjvxpK_c?+fAbi&m z1OefDjvxpK-**H-K=^?p2m-jd5DM264#nNSVBP}yN_Nf~QIP@%` z@{%U9hT}`K>35B}_WMTXFY=if)IR{HQCceCPmL@b`5L9AEWd1Ixr{7hXm6Q-h6}vo z_#Vt?srX-kmX@lZ{s-oP(o&XZg(Y=9*BGJ?rZdWt*e|Gyk}u@>q#AS?4BN8UjFvE^ zCE~lxV~w%>Se&TFtUKI*`7;QXj-;N+_yzN8j)~jre?__A`qU?LZ7y+?q-=47ZSLQ| zSVv_qS#%a-+uV#*eKE%-S76X!Hq7e}W}JUd;`~%DPU7R@d?}4{!xrNdU&Ki`KF&iJ z=RcA-Kb?z{IO5DY45ssC#))RVWPdz9&Wu%k5hu90>V!nK@bpr<_Lm(*6%G@O2bKS%J8K%vkdL8LHAR#4435o8GgKw zWvVNd=CKdQ<-M5g6ME4;?tR!_3bQcveQvJvMXXQ3LwZ3$K=`>M2m-=JM-b#Cf8l!Kszk-^6~i+V0qXCV)xT?bskv);TT~p5np+s6xn(J=gVPLME0&^g zxX62}OEG%zqVhsS(X}FpZ$3`WcU7GD>hM7m_*2pX269R=5L~5d$e5d37PKZQgMKeS ziPNFX$(hu7!?P!n+O@o>vBPsA5?vgwBJ4Jqa@8%R8yXZB6q{T2xOLO3ua+w;3NIkn z(xUJ@9XRH#MFGvX6ai9M6n;<0q96zej)5}7LlAiU(Gdgz;ZKer2nc_61VM6Z^3$2+ zI>ovoEg|+VWJja-MK@brB?g)Z_@RB140>VEWK@bpLb_78{_@^TX z0s@9~nqomfc*PL}0pZ_{AP5NmaRfm?*yIR;ptWQo%Q9o&z8_r%4P(Tm_MBC0HpP4u zEaNAhn0$$?nh2R)f*?ZQ5d;Ata0Ed>2pvI?1N{-o^5d&e9?T?km6a3y5k_iYy2wCo zRF1d9%u?5GFsGBhU~qoWcRA1%`$qVkhW}IXe=`1~4fT)~`5*M%0&IR;wXIy~sm!c& zqfX7J)NW?3%ku~w+cl+YQ-O%`5g^2WiYw!P3IAu|f3>e%kr*p|SHM~6d#n7uU4Gxj z-<()i*w8*TdHc~bX`gZ{L}n%u$X&Co5eaTx$R@jN3E~9;=eLx8c+a8DDGWhu^A3T` z!zj~TMLsj-@Uc5yMJ1Gmq`$X1+*-RO_3WJo=igIjv1@s2F_H#x(E}{}pLV$;2ne5X z1VNClk0YbV`B~>72ne5Z1VKQ+TCEliK|r|M5d?8I%HYTs9D^VTfwfl^AqWUxbOb>_ z_>v_9YGKfzTpUh zfbdO65Cnv8If5V{eA^KO0pUB2AP5NeIf5V{eAf{K0RgLnnifGo_`V|u0>Td*K@bpr z=m>)3@)e6gDoYS>V#P%Xf`EY0zY+ui0YiT!2m-=GjvxpK4?BV&AYgQ^K?KotFILjS zQBUM4j}lG@AXf*Y+BcEQrR?2;`&|LyO>35ozq+!)bANoYVA5n3p&sC~YTF2ohYGmP zvu;F+$eh|?LghmRJi?choN*5oxT3Sc=_&}6$FxC}7X*Yy9YGKf9&-diKzQ5{1OWka za+M(n2v0bIARzqI5d;C@XO18U2$;yL3_)^v_>}Vy1e`y21VPTPT?hmC@qd{3rKn6& zXJRa+$O8>7-5XsXK_CV5ON~zu5T14fK|uJWBM9O&npwLY@u4Bo25EkM63!8HJ6MAqY6JN}!yAfbeHW5Cnw3ID#M`yyysmfbdsG z5Cnw3If5XP?t=G8z#~xSdndWf8lIAL0K8Yt`hBzz(Dv^L0#8Bk1a32u9#xC$&yp9B z*3rqTkB605_5B##ZnW+stiiDnc(+i|2rMF1`-wTVJA}$cV17nMBXFj35AiV4df`IT(M-T*re>s96AiUxTf`IUEM-U{Jm;Z4d zf`D_ABM1V*tBxRudYaT5ps3rFjDv4V)^s@q!0;$h_UdmrAm;T&c5>y z1e}2*2m(Ur2!d=*=boua(K&8HolhWjpDpTKaPbI&h$BZ3B&T!Hc?bf|W=9YNgccG2 zOU^@(ME6es9*J^aI|4fU@mWx9&1bR1BJV(b2FRx96)vuPA8m5~TKdEbxn+aJ>{2NS zbPfZ3t})QR8R&-+h(7Tm7pOHIVIA$PbY|X4R|$27bf7xg>M4#HO}X1MOki?*hH1=( znXN9Rf*|Q_jvz?RdXt=oAmE(r2!enx#SsLNHu4-mJdjP%t4#j= zl6?Ba!!G%yv|+u|C4W^u`OoE&pX&m!B={ppv(zd}=TxVgAW#-F1ufZv znNBK^rL)uNCJ2-*JAxp&bapupLBQGV2!enx!x03Lbnf4npVvZ9E#GMxPIYN`XFd&^ z&#Q-+2F94BVWx{$5T|nE6#8~VlicL$VPL(pmF+6nSrmdq(3eo$IQ9BIsKre~3|4P; z=*c*;8?3@~*N;B{T4h7PhZO>!t4bOI$F|`ylTYK620JupU?@Ool``kgp?5Is!@p#@ zU;i{X`X2_hhwl=V%w2Q`2CvIRTwyIGdf%0$=2236m)5atAgi9T>`K=3tm;vyPngzX zDYV2zP)u=su7Cmt_Gbb+?UMpW)jQq+MGa?v=!&tHS*p~ydiP`+sjS*!1rN)br2+N) z-8fIIO~Mmv9FGGrPdk_BYwkvZu;Nia1KXxCR^deJK9`SzAP=^31VLQJ^87j5iDgI^ z^~y&*7aqmy8;u!)OdlW^S&E1J;zHpC9cui+SaUhjUPp-wiK{SgU+CC)J~Ea=^@ zsyB0A-FN0&3kRH}=VPhU35iZBU~^jVnMZ12ZqF(4`~Ox6)nT?bV@Ib$i}$)CG99oQ z=N+BcCCe|Ywyrt@g{-wWSS*^GFeQKyegh@i>d)bKl4{%$mOBdV;j}`Gfim{!#SFg% z+O-1r4-QcRZWsIxB-}zMnp=?q^9lSk$IpW{w6&w*g`_AN?reb@>xPLag!}^>?O0RA z?cS)o;FGwZP{7^aFh+-6da6aTsiPVB)STqg2Wg__ET5V;m9ux^xTu4p<0oX`8^5a+wThu><8} zpuoUBATYEK3GB4@3mjE8UJ0U1x^gnHjN~1!GO-L@vX4p_-##V~@6-tFv_BR&s@^ej zm$K-Ju_h}|p3s!?27#QEXa2b}WT^M4O|c;+HhoGU-d7Qb_f-UrsyFqce7aQEZzT_< zY=cPruCDrv)OA}rbQ##M zmMhaJIKwC_^}oSqb!7ey&@+r}DG?p5`6cv{LF&^$HbosAh`a=z{D=0bMiK(6qwL|p`2C9YlUl4+ak4YI*QJl=V)vW$)_u4Wy zPK#fG%*JZxWXORmPC11TnDOhl=4xj)tty$iTORGy?mN%rlM&5ilDae%O zm+Nf^VHwPqs4bO9nzmzH(`F~pKeUqpIPjvAP~6n9inN|AX`KSEhWwZcf@#Ok*c)ap zpUb^jnZf$JeHW*W!?7}5hsUbn~7fi@aJQm`v@S11IwcLAkZQ{KN!(pP+cx4nM4G}O)bpGg-DA|qJgcbkGvJ$? z?%R3f)mLAw&jew0v#X!2-m;aMu9rGp&)>4Hcxt*)*S3uZ{r^G1!FQzEp&ys_qt!cL zS*9P_IL$X?S^c%LEV1i6K4p$Ho7AwT2hPFPgiQN3=Aw(c%iHD1EN-;8l8>9S48`X} zN)~ReEDkKl^C~RM}$m-0UOi%Jt`zd78?c z%cRW14`psGFtGgsLpva_({3YhRN3OCDwD2wTl}ys4S4t8I~_9XGttrU?9V?Cr$5-u z(=R>j`}T$QeICAQ5LXarpmK&^y9DLX;`oN^pz%@$&A563pL!L6)Em}j7`ARZBoK!^ z;7+zw9o!EuK7%grrI@&B8lV6S_q2LBG@lOX*7DW507|t{$Ku zNj>ldVy|9cXhVSo8wl*QczzOmqsks*BY=9)HKsniAt$?8!uqyFU|>rELyK1@A*<6C z1&%6Pytm4vYmCgZROX(v&twVX+bIGAJ5^w4+XZ&oNdiZejdMBbNf#eDD6!Q_@os@)Rs<8BjGxQGf^oJ@5D4$#ZhVY3jP zvghIJt0T?TQv3rd@E)`~rLI<#)7L>Q{Sd?fz*gGbnds*mBAuN@x+~)d<5sASWvUZU zgE0q`FgWamqpQ*Y;Y_PG`+}fF5}AO);Kr-x=E~M|$!Fho3Jh#nV5jX6II7D5D~*=mgbGP0)V-Jhc1~uYzw${!@rIWFTf15N$|2490Q!+jQBDrhGl7l zg+!-s?eTY{bjZE=_%Yxm^v#hzq{YHz4n$;?%?J4jf?(NayZVuo6Pkkv3g!?3JY;$p zp@ud`0B(Ae*8E>=X}yNB>&-#IJ*81`o`1=&J6V zs6A<5T0skSdjX~Te#9W9dQw+Mi07DCtlL9;;3SBpT=Sh~ETkr}&Tou$yDV1v{P(dw z@ZZJi^bZEgm5J4V=rsf(lUXJ>UcCVMSU(KOL$k)*G|Wcx2!4iqzIWY7<14etC72_C zwMET*a2D@VHN{5(x=S!<=-rzgQl4b2yq!1u5MAf`jbC2|Zo3rmH8c&m)^acU1+^*~ z3%!%HCkPym>_f>P!nNwpAYB(q`P>_Rxch%Jo1BZ$NUcu3DnNQ*?&LwS zd01q`5K3KqNE=>eH}J-Inhy6FJ^?0e01L73E>oI8q2{B>S5fxSNDf+K@(SJH;W<6100V}=3^hvIt+(qn#I+VD5{IWEAP)9p8#@EKq7Ov>SC;sPib*?}v*U^xnJ%FHK4ewIvaLD@%`95Kq954<;by5l zl#r!X5X8}gyR8^IdMK6c^@TE?_br~f=G{p&v56=#ET)1~qPJ@pc47o#pjIF2VB*4p zUsOLCX|RXD6W=DlZ>TrIxgFt-MMPR2L7C5Tj@d4Vk(v=&BVg~5FDJN?; z3FF&61Y$rVu+#1;a8$kH163AXDhuy{e;a19ha;5@&0;o2w1>g3@~_P?F6~Umb4O4} zXpbZ)#8uh>#daBkqd1aGcoZRvr63>(gR{?@b7|U7bocH40#PjlcG`Ufj;c4m)5M_% zU1RLCIw$K83FF&C1qSvoft~hXfurgjqb5=oT{&4CD~+fu8S@`0VSIa(z`!mO7}}!+ z7VI$sk@RB)!9!UBM>Sl0h(iH&HMqU4>eM9fCY#GNFGo(^+10<={- zn$0;tCaKI8b1ods`V!BxvPR#Wyu_m+pQe~{qIgC!=OI`k{MTS{Jt?ORgKr$;fftuz zjywiWR5>y(G3Pf*kgK#N~28sLwn0p;dY2KcwUn^JH@8-DJzV{|I-zjyPHy z$bTNg_9EQH`bFTYye40L71?IS7YkT(Gz^3(cKk*-&6`M@&$s@oYsKR@G+xJm18v>0 z1O>aC{AkKZB_x?p=<8j>YFCguw8tqpfuLZIPk8C%9aXyh5xQ1Xc2`7+o0{Opr<33l zEVsh0`P7Gex`g@E7329Aq*db4pe0P5P`QD?_zJS;aH*7woUWxvUK7Q@L1LE#6w6WkW>~MtwZwwF3oUVXkJmF7cZ2>p zdTGun(MgY>l28`<3GXuMFmt@DNi9h_TCQ!7m7}9{=8Tl{aQdtDavp8H-KRvoQ%^am zIOmj;nonX~Sg>!1Y3vMLr;vBneV8D@=dc`jKz3m6pR2?!5RSl zsw9s3$Wl z0&k6Kp8`*O2{LDJZn0UQk2iZh0N+%=kz zu{H&KQLUfcn5HDbk5uC#nft>ddF2kdcbdy#LFV`~PYF)i!20jY4W+juo#he^+eigC zp_MlPi{%~u?A8onZtoq;o1wBlatdVO^Gf(F-;Bl$Z_mKYy_f8ONk!%rY)JiZlqV5< zVw;PgSl+Q&YuibfS!BVY<;@#zPGY|w*)GCaK8oHA(1Go#e#>`o$nTDCMAZ4v&?hIW zYdPHADne>ZU@nE7QER)Gj|&>jITac=gpM}ctidptxsOx8oGxcd~75!lSSraG*>Uh;a+;DTykQd#{L6mkq5hPk&j0_rUr6A3jpG{!HKw{Hu z&8Ik*p^vi~UC;6*b-XatRKd)G(QtO2WoALuDQFh3{agy`T**9K^+BB(&&IRn2uBH# zge)r|#>+`4Rfy+@E`dw?Wpzcc^)5lwcYw6cV>#b#Sn98#W*<=d>!a0s0 zNW;En!TSYtzDnwE{vpx&E*O>KsAj~)svQ)^Ff%ecDPAJJQ1Le63lzstH!{P->jx`k z8Yu@Uj^S%$&@NMQH}O3bFB9KQajd9BW^cvk5I;cinZ)-5Zg$2G`T!(88XSn^GkNkA zZL>c-)NS?ysx0PmRK}?CSr(Yy8LnW~XMh1(@WO=YARgA=3P#fjd>r$#9P^>ddEs_9DGg<+$$-l71lR9pmZy zkUl$4*IO-1rFR0Qmg{*++v$NyAj%4I>EXb{E&3W-9(E;2bl(gBj4R zw9kMhyIIh2QljJc7-rVy{qLp!oV>s4_;u3z#?yaH`rPsK$4K8gPgh&e#qZRj>O<-xYKjdltM`&_1q5`QiE0Y>ln{9N4e{wLPY+=BJA92t1i?n?UlG**tsJ|P`vt}KApR%CcO(8g#g`KQ zr{a4O|GVOQ5&w(gdlUbw;`dfSYIW!*-~Ey?Xs)JKB}L*H!;K zLj-0o+@!CsV-fi@3H6^S8N1_n14D6~kBH2pienQzGLI{cZL`RHLvd{XMdmxi<-mh{ ze!_eUZu43EppPwZeS_!G+UtADdU$A0#gZA7x+<;Q(FkcE-8qJ2cmc^=4K)M9%Q$8| z(D|*k`^YCl^?DzY-fw#Gt1MWL-izze?*u154_Gx=jMM!B)#V!MvUj4(X^Ad}&U6h; zG(sA5sf{5S-jXrbi7vcIVy;(Rt|6c5(k8mJiY{bzLVfx%lz^|Dg{H6qjLSdh{S9{>8iFP-gZ>{jHGQq z$o(ttI)>xZ>HTF>CBR{v={R)}ml=yb1s~4@ZiY7JJBz*x;9Cj?`w`i6xcMaCO;mw0 znGc|8vEP;i9RqAa{MRG?U@!=W5-nspCZQ^!*@}|-prY3XdGCX~X6!>Z#Ww?6Ie4V% z9U9)u&4l-7B4DL?@N>!72Dm1pk-jbIOh9Eb5);!jhI&nDsEvm~@+27Z7AQP89d>Yp z_oueO(AFKuV_xD|g7+@k1o@xM!2|Oab{|oSWMPaDV(i3jbH){~PfiYejPY^?iWn;QxjAkAaW(5&U2LN&M()M2u^0 zn3c#(KfWi2e^GI&mH6T&LdyA#9F7|cDIK>MQXDrJ@adkf%J0{5^e^S`FX!-kbNE+s z_;-lc-aU~ykPMDBcft_i-7tqA-v?glY&f5(o$O+qQ%pI^Iga0vgI(|9QjTM*TvUHxR2brxr1xF?E7;aW zH8;oh=ah||?&7cH*tW^B{e^6zIQ#X*$emQ$jNuun;y7KWXHleUuU_b4?8@<=s3$xe z3RDkqJOjfERgU===tEQ0p(AMy0@|B%-sU%msoLJ&{P4M$rt7sn9Qgy2c@{oP&c(Y- z$Sjr_85c$78Hm{V>o8W5Z!L>4BlFr@B$K*mT5=%#%M8P@{bKCWIEHT8B4PL^7}OS= zSuEZyKteBk8>QY!#k@& zhO<*zi`uc|mSkd+^F*5dK^a@YZ!yL!E|wX?)6+EJn5Is!kY|Yw-MKv51aD0;hj_@d zgh%p>5z90<)dCF@ZV*7P&Ey#t>+*TlqIq@!^GuSFWE>}yj&LLu#1bk#VL905a+V`o zeCd*I@#ly(>8mzizV#j?Rof74H%dB8jJjCk%_qU!uO8Wuu~kb)+v0a1d{O2tL#;&_ zN6OeQtVopH6&4Yn@mX7qe1Eo&&?%X-LC4-OyBZXuHNaNpsFuo3*LU51-voLtLZwpI2YSmKgfTz6X{n^Qv{i91QpTrH-mzwxkwP-B>lyQ&u>V7Q5%Szap}g5 zh3BET+?b_b<`+rld@+Q&q*pJAWM;v1r?ZblvDV>k^(;#JsOje1qfvFvL(C=kq3U#~ z>YS56_0%_29W%pR z^*5Up1TFmfH^(G$(vx5DhNGYk3=!do>K|mSJ{b;!T8#nIA;`?Zbnsd3HKXc7_1llH{PTq|41u|~;rJF7JT`1G7{)|(_+2&UCWn?BR`pKewQP=UC zW!ZjGvAnRYCD6h45MmE>upKVOffuhu)^dkhTV!!x7UD5j=U^M-IQ4{E#&KNDUyKVW zSU3{~jN?*`GLGY} z!{Se5B6?egcT^6;HR++L>da|3vJr#NQcM0ngmm4KmG2pl zk3LBzOdY^o1?F-`y2%mYjEyvh87b+ts;CBB)L=E318BPNldlH!OsYW-(8g*&Ps5cC zRs%Y;8q5ZUYLNP-)u6VyYLL`jrtSS%+Ll3%OB=Uh@@Y%=WU{oSq+HsLKrp6l1)w<+ zKl!xLGfCSqKpWFWPjf7Om^L~zZOefnZK-dXHk|jIxS7qR?E_ibPKF$pHf{#x)0XZE zWob)ExwM^#U`*Q?fMz9r@@b=IlD1QUHl~f9<}~~;ZFFebP6vjxrM_v}a8~m*({^i? zwgJd-Y3l=?Pg}Y@mZdEv<QI!7D!$EOWHSz(phTmJb0YG~O%!#b9y9@@XMHK25f?ihVAksVciDy+O#`l`lTZy#hZIVE7v zm!3@5pfI-fZi8*Pu9rJbG(w&pb1IrXKfzA}j*HRsi0=oEQy9d}@xXglv=-xaK-#*R zmrv?xS051 z-CxB8ky5ne%SeE~it~up;*z_?!9jIf^O8@C;{rIA@C1>+3Tuh}l8*|?hJRAa5|k>? z*(P>C)g>5Y!O3O>Z`l-A_&575Cj7790_<33Qv##DFrbeECJFQ z#E%Qo7Q{azQoA=TO6b=@@8iDbeTcSgC<`nZS>f^JOYC~I6@%BOS-x9q&!&O`S+g`J zKz`68`Hj;|!Zuilx=-2w2iH*stI zrqP`|+f@PIh!+@_3L_Z?TOwI%2LVs6v&i9t^&8<~Rsyf%=3dn5%R1)Hm??Ng#m)2N zXoIIC{DB1AflUd2B%zQa{FwyYU`#n)Bw>1v@HY~0=P~7Yi3Hp~ObIWO(3K-_RnXuX zFYk@E0zmmENTNyATsuDowIv;B;>CVtwsW{r%QjyKa@=ETjxduPxP+T>OeX<1dQ-wI z62csT3vLEiaZ`?IB;dYpO5m9gQ5Dg0UD#bjb(_Y&rQXvJAWexV2X9Rdk|qQ>>T;r_ zPcpC#9z>EfOBRzx#E`G69A5<><1ydEE{1oE3zra*GZU>Bgj5~QjR2u97Bk59CBVEDOkcG2PtsNH5K{;3dNn+lpve* zvvY(8$bsv$DaS)3^yUbUkbn#0DTi$6=ZbH4npM)q+z-=z_%-ti3qR2i>O0TR;0nOh zIj+8=5Nr=xQZUF?UbvMn=Zeq_U6$t?Bp+*hb-FT?anktFltVHU`Oo7rJ3qn3TTrtU zZaIyyHI|2l+IR&O#givB+HfqRAH@0qe(+Uxl%;KewP5Sd=NCk=^@pz)Wlmw8K-I81_8CrQm7aM1INsbhXbKsa! zOe!Jw2fqyqe&jXtbs9t=pZ4i>M)K2L*^jbXw$|R2dO{KP39#>Q@=#DY@#BnsYFRuPEBsWQu4>0nt4KlnmtZU)F;&wYrN2t zC*Yi(CnVDD9Iq#*7NV!jF;0QY=_v$GNu=1oQj{oqMh4GKL}E@S`4djhJfT6)S>5?I zn)dv-=-CUYPEXlLPd3gIdm>(PG-Nxc45G8l9b|($v28Y)plx${I>~oAJ@bSHJ!hx( ze5whjB}JuO$n5i6B+3M17(#frlK?vWBD^l z%c>AAAwiVZ&e4~}P_3WMF;B{1^JeF7Ny9`{%%?zVl^sbK?9*_x1q?u=aX>dr zYBnbTc7$CW1vFQ$16z9m4OFOiyD8uI< zq0Z*ZQkyU9%bJTb!I9dWj)sE5rB|`JtifJD@1&pzp+-W3%^9KjJoMJDNZt($X4Ue6 z6nz11cYz+$f+RV;EoqTS(qp~ZH)ZcdVvT`!7LcB6A>O6u=rldw$))F=;7HR$M?-qJ zCW{vv{M_PfgZh+j?h*B;K;18@`qDeX`6X)qTg{9&XWExsZs>bi=X$f=p6SlK_@wB5 z1!Ozjk4bgU=f!2B;`!1hE;3zg$I z#}Nv-1PMn#0tbSQqewz7g}sv#RR?<8QfyL!QC9<9F=@p+qvmGB*{BW|3`8ASIrt!T z;vf@|3E_4UILLH_J4i?jE*xBnXi#TL67~GrqODv7yUri#t6c-9KJh9qc-0<-J9o2% zFNA#;-Jvy@;QRH@6TOgVa+#_AeNrv}g~#LRqt6~a!B}Jk!XKe;V158b^~;VF`6Cn? zn7iqR=|4Hm59yG#*L`3k{<+BHO{zbpl5I@_b4v(c;R(z#Ahr$~@PmQ-BXlgc7vY!M zts>;%eL;Sx-h7YQAEBfq47nGPm{7T`75^GPU2;EZd+2i{^9|#dms3>|UTy$jsYIj^ zZw+wi@+KAy%&+8~qSTAY9q-_df9i8|-f>jk!R6;w_aH==4Lxel+#z*UX8U!?`x_Jk4h&RzvRqONecKI(OYcNuS8Vv%*t8qo` zI2Z-5DnpHR*n31d=|fYHyZML2UCg5J4k{}5iqC+3Kg;|cYz_>L+LUl)jMFWK{$03F9JC*jwz&Y9bC*YX|fb4$`D}Y|q=%$Ku?MuB=|kj&5MEGVmIAw92y2Te*y~a`%a5px)!$ z^dPH0_YB7|$i`d3z>PO$*uuRhW!S=9C+$BE&!sJ=PahHjePnH=s5qAf{_FcqQUFn40)!IifMk;|>c^uv5Gq=!Dx!*YsTeVq(g9W0ls!+nUv5 z5x*N~{UO$=PXL2G^}fU1uxEYW$hQ z;(xvxK^uf-2Cqgu0!viJ#_}GCg_Ee<6^Q>IZ#-O~w;6^oBMF5rx*j zLD&#oW^$_lspiM3LiC|g6&)%UymB`N^n5=Qn)o8Z7HaPFAQ|00pyINhhj9U2@lr^}=$82AHv;LKZUoZdHUf#ejX)9MHUh=L zjm2~$kn^Jftj)YDX8;{8 zA1Pdd0UGER5XCtzpcfKl5eZgt=M!jn`$5DHIH0V##? zaw54MQhdz^uSG@mcd*UKoo1^zkAa*Ak6ff4W6znS9@57rqNI;^qGWWCJ5eO_y1?53 zhP(&)muMobSHg7-A}nqBWS*W~IutU#n8}cKHj#0$$f(p$W&fX??pvWar;u_ovsKS* z7V}3hAJlng;IXWHiL$l)(p}I3>#ZBv%+Fl{-S5h?|s2`97vY38J-^W<8J`4J2xGlT4(0 zBt-7qbSF=Mh@-W3SK6KzXUv~coQeB5ucjoqz0;;b@G8zqZZ;jewd(+yTjZjS-n@~^ zIvrt4Z}-X>r*;%tlG{2_i{930=|j=?cup2w2~8lkaDa1KE0;Xl!@=R^dY=x{gqjT5 zI1APx8{XT}OFeoOT`u(uwmBhBVuT?s3Gj2c{N@-hy+zG3j$=8yH!CBCc2CNPoS|ho zW7nz&+RO%Yt;s1|oB+K}ttwX#)EomCSkkt+(T$9Tvg0N}{!l?M{!l@srn^uRZV76? zIvIH?YaW3lB$UTnWFa)1ksL!%!O1a%Kz5$pF$8s)5=@#LLr5rXptxfQfu1$!2*w{n zNW79`2+EKAHTgxgb@N`!{(Pb`Zjr-${Akz%)dnc0H;F0c+CvlUunf>vt zk)K~de&S={JPiRxj>vicnIm#tW^~)M@7HY~jK;p1mR_t!rdvU7S4Yl^K(5$4#)E)7 zry$b@J*R*v;s3Zb+urYL%YVI9iDIW)m9l-0^2k_qs}f#|;6QF;FQYUg(!D68jzcV@ zF57~H-lR#cxGg~NaoZ1k??|-*A8Eqp_Ta$B%_{KyG|!iAVCDCge0iJotI|GlLq|51 z5OVB}5=hknX9`4`ZY)i>Lp1n0CCm0usk#+1m3u?2K{4AK0xp|Fx=-WDKF!eMy3jPy zCXKE)9p}x@?F-bA*IyIex#vYF@v+AnnZNA~I2s3n>T!yAQ zCB1I%Vy>So#c%GQ-x@vO$1$QF@Z&g9F2k&qK__3~k=M0koHwp5o}G z=T89TI7zjI&$6JM?>pkF|#wh+IdJJ|4Tnr$RPT z)Jfk#(l+gOOc=QqTKWtYchBmOUTxu@&f0sp`4h*3INu^ZIBL}tz)kV!aTQyFasi+Ulu%3FnND)x?jHrCNjUJaoy7c z+53oZp^98*Mo|#`{E^EO1%sS|{wS$A4S(U%HBq=s$qB+8#}z4qyiB$%gZlL>7u@SW z{rA4ZycQjhkW&06__anuVG%3Rlf%KG$>I9JxG>mXi0{KnW_jVP!sIai9nv;6*f@2d zW+Ar_Kd)}D{!WC(hZLAdb189twn0F8q%vA)F3+8ITw&EbZ zr1@rG(IB4xqZ!1mesj*Q(3^cJS3TMmdsDI2(S%}fC3s~IR1grZas)v@Smy|WfN-@V z2m-=-M-T*rcRGR~AY9`Jf}rl}`X<&~+H0SJIc6o_clYDVkcf3#K{vjR9r-guOwLvji;K|!7(@|ivIx9sfz;>yt5^3o$P4i zsWMmCuEY1-VRb){E#-fvId89n=2$YjmI**Y93;8Y_?_UL(#-;UJp&;N+6Hok$i9nV z@SPv}CI#xm#O06Bli%hrb?9B0@0Wvcx>=<-UfWOc?y!IdV3dwW{Zsmkls>aIWn1q8 zDtjX%L|bJA0pY!lAc#x5w#B$@DSv+bRY%B%UO~7{xIa>XYR7lvUqIH|^U!bb9r^PG2G$4+?F9lm?YRO+ zl`Y0lnQxra75@pr*~Y2N@2bqjGy`gy$Q%(E*wq3ei07DM_mp_8j zIKm71KcFq>r1+v@^4|DL@bisvw8vBn-|*Or5$zWYB3a*u5*TUx9H~R$VEH=?em_*3 zN|{EN0h{^uI)Q;j=P5S5R$#%Rvl82`7dWcyF(RdH>C&=|M(=BgYj8@gYIU7G+*Ugt zqFD~y%|VDlaIHGci3Ie8(fwYEMK}_i@Rb;b_LkjK$&uBX4~?Brg<*nwlCv{ z`S4GHf&G`j(7qzD)BaoFsItW;Yg*|_zagmKL4Gi2$2-M7zWs#2z}_XW(|%mwsCvhz zs4Tj2-(uJU`aP7B^*IUS+s_LO?A-!8?Pmp!s&|YfUzQ8HaUL$#iyxEx^np%Lnh=RUs)qCAciS6&cGHDGcc+>nPwmgNwm?c=y=8R zCQsHpV_jexAIa(UZHd>n-w_zt`vi8{ZwVY#@A!1phpse@fwwbcZ4iCf#|7qdsB%LX zi;Zba`mO_?*_SN}TMKDF^^-uLb6kq?3La5oy2gYon|&HW34bV+{m10jIRO{rHo+7Y zjWi0L=u$_&6q(OR3-=44LsM}64DEk7eR})=+!dz)K&h@vgnG#hBW_FWl0C!TJq_)FdXP3{83y1{6oSZb|jP?Jp z_8xF{7S$j3v(N6{yDeq2EsYQ$Sst>RP=ypq0t6)V-lg~Qz+Mu{y%z!~9Yj$=ldedw zBGQ{uMNmXVcIhe#2v|^r<^BH7Jag}JvxWV?@4KJ9&&-@@XU?2CbEaD^oiJ%+jzM$r z!KRmj4a|jZp0eD(Tp8o*$N?g5AR@AY*>F-A8Z7!)Ss%V!@aT4eMDNS%=;ges%`d)j zFuxr4<}yWZerjXu!e_6-8U|nv$N8*Ngwxw|M^pN0NjerxX`@_g!spuP1Eu%L|22tpWYa-Zo!~053hvV76a7nw{%NFfxaaZz zbtH?G&**B$Qha2dmF^>9gz5hS9<<*>%Vm_6}S&Og9UFJ3YWGOTrvFT|-g6pF}K7wyWF1S!fH$Q0l|{9y{;nuTxpp5cL{I9@GnkUn{-J+cU~R zoiB5E3dQUK5tMhY;)tWn0-(Beku-+H@$~h0KDY^W&!ZF2bcxG zJ04(`R9f$P53>;RPaa^FRLDPj53>-G)BCPSW&!Y?2bcxGUp>Gq0RH9yW&!ZN2bcxG z2OeM+03UjQSpfXq1Iz;8BM&eOfR8=EEC4?70J8x2hX{OOkdX!;J3H=I}$ z$wD<({-({39+JEfkvwcx0u!B*2GXNeJ(l#`N?n-$AAZ&GerkkzD$O|$s&wvYP8#J} z;mM;wBRT^>IrJfwp?9xz9%fD^WL?rn$!YeQn8!=fxgJsJ%vU;(t#sxpor^1-$5%Q} zG$&LVx%?Hjae;V}R&qG`TU1KsHqT1=>(ZY{K5tTgtqnEZP4);;jULS4?V{>TbP@4q zoR*}xD-NXdPBLoZT`=Ok`J^ghIp;p+dvut4N>QrgpUJ3+AHXPnu1cP9rRsN)>K9#y zF^h#XKla}$NIaSf40+5w_fMC`doGQ?$*7G#kb$Q4cQb3_kIm#g0?gu`a8*jU(<&Lw+L2n|z9244#3KF+Va;ka(Gfzoj;4G-DH){hU{~RDUU0BidMzBcBgAzbpJ$6qk z75m~;v8|F^MZaxf)jC|7joIllvz;zhd_c)lo%m8*MGNWfh)4DX)k$w*764TqU={#u zf_MFiSpcxu?Eq#0P~!n+0l>1i3t<)j84oZE02aDk2(v5-rv?m#i%PJpU)1?9W+4)* z<}Q+1Qhi{9_b>|~8$G}*0Gd3&EC5D%fLQ>H_5ia07~=tE0Wj7B%;MzCim=!z)=%6A zZF|CQ9ZGx}t7Znr!P~Z6Ipez&a4H2A~en{Dy^i*Eo)Q-8k=pe^kDNxO0x}N ze1DQ8^RQehUv{^U#f;FsG;a^VW~Sb~GDj7rGWi`y!D;qLn*{)y<{S~t0)TT&4qz4l ztsY<&0Bs&%769!YU={!!9$*##<2}GEzJ3+FT)%9Wb{U(6NE1E4EC9GS(SG=Px1Bh#hBZYcnbd)TmeFDtpi9y$B+0ID2QUkO zl{~;K09N(@vjAAd1Iz+ong^K0v##TzWz@O;917|?GO&@~zhGy|i_?jZW`CvD1rxdS zL+r)Qf$(btUv(gyiTg}38VJ8Z@YMu&>)z$*h2jjLVj|@(Q@P1h>N1s@OvRSz!*|Io zt=cSjbbEkV0L=6NvjCXol5leAF2ANcfyXZ1!z=)H^#HQ~*v$jX0$_I!Fbe>-0K44G z0)RU+9l$IA_VNI;0NC3D%mUyW9$*##`*?s^0PO1lW&yCD2bcxG{vKc!00(%0SpXd9 z0cHVkkO!Crz`-71766BMfLQ<>>H%i)q-0RoP4iFY8zz@pSMe|fCz_d_7v2#soRILs zCn;W#eE=_Q)x0UXLvIAhgn@@#t*Zm$kZKXTk%VmrVAFuE={>oX>LS4|HY;G zcUY)cZ*jw7qnXvkh9s>zGYif;I>x0XSM)K_;9jFLD_#@fv`$w6-o-P<-R(&g?xUuc z7u&=?*Q%)BAmP`9-*dQ3B9-E3%QGx83uWaSV`f`%l$izR9Ubd%ktu)Ztm6X;>7AGuDGqbw5vY9o- zRm^NFPBpXOf<^4QS6#{#t)eu)8!ldhoeMK3hKuje#QV5#@$E7j!o_!CYEz}|Byo4i zyidO2VkQWyy2pj_G~zF2I--ho;p)s-E-RIzG26XrHlB{()VHgHVC_t9B1+9k325P} zfU?=#fvi)U6fS1DqpGQ{yQMDfbP=*keT2}3K`yDaRmYpDQI%Yq%eAp~+a5$pbim(H zOQJ=YxknhCL;#I8rY?nEGolWK|Iq0%G`EYCWH)b?tV*`U@8Vjn+1K>kQEK(yQ_|an zc?GjAknM-Z5%E;F)%G^K#`EmD!{6=?P{4RKLcmMJV`yymQw;1V++V%czOjE~DX`@X5sNmC5u?;Pwy| zBir*Qisd%6Tqck5eu$M;C|7;M3LGYo`?lOXc@)a13neO#69rKnk#?Fq9eo35c znEwGD#a#ljHtW<2NMROJFM>}!AIJO^3D3TxU2M&i@w9y6apHooAbWp1tvR%fnsF=O zrfhyo(kt)ps*4wa+Ndy_UnKbTLbglnaV4=yd1n`)o}DF1dIMyKZRBZ>y9veZXtmKy zS@iJcEG#n@gzeKCiYgh~){9rkEL_fa9G%p0w8P#ED6{1Y5Vso_WcIf)FH;q^CGkj! zmePYs!W+Mg{tk>G+r63!z zc$~@hx8%1YsGeK34IeQAw4o(CE*q^Wv^NYpN@!<`SCf2#HaoW$gLdBzY#IUDk_`(o z``fxIaL!5yvIVE5E?lwS72k^8ToT>JPoCmpbwATdSvS;gKgDYS37Tv8YOMCnYSj~odLAJv+ zcWam_yyLw{tv&u4=^LA_D~qlXL{C#Q6Tcef&6(mY;F6%uw#Vaz`mVJ?T^=o&upqO) z?fVEIYi5RfCYr4zxl>?fZ7*6|kS**8{UZA9hR&>Q;L}TKTpnO&*k`t3fyu*}P1$Vp z5+23v)%I%aEW2*{?p~7Rv~Y^@uMbE0@gDy{DSruEF#^iZJ`hd8 zBMe>n6NW`W_eqQd1&+iB1)8s&x)%zF%QFA<4u`_TVNswT9T5uOa44K66gccJ6e@U- zrOTnIFlks6#*7dJcC?5JNY#++Pv&3{GN(+0VH@G(VKF$LDjq>SbnQj<;!o}jshUO4 zeFT!@Bw%RrVfPf*?pk9>4y2Q0mFpRLzX#^o{6gbpw{dY?&;2COTw{lhTsp2S1rwt8 z(m>`c{G1Cq_vq}~Rrk@G_Sn5j(i=7Qw5~pQZ`8F?DabX01d(#$km?Ki+K{M{p?ys) zO<{ABiPb(3l|Epaz}nexd{PdH$M_$7gu~Yf;7V(tY}~-jE$QOB!p3(=8d?9@Q@_SQ zd?k2;%nGx%_bIAVbs{&+i+nK$Br~oX9W`#0>qZxZEBLx>9#y=RP>EO?6-FmWEIkUb zIc$JO%c!s*Gu4xtSQ_Pe(&;Uu6IzY#*?JK4oFW(I)!XP9fbNdwrp4+W*%;p3bW$`2 z*%r^`6Xr$5mNCs^I@S*RR!cglzNsx^)g_w*ZFPN|$^PcCuEU-I5s_T$GD z=)w9(TN+BRM$$if_(s6#080J#Uf34`Lv_^*yWVi6>Czd}(d03gVNS`*rZ5%y(d*Q*M>bGjyUQ-ibRV2gJZUh@zfweN6R)8(_|K zJ)t7g6T%tP+wFYS6P~DgyNC?fTLOrlP)2{-CB8RNEYjJKbmEQpwA6G>;i8H8ver7r zYsM7+bj1JR+llX$G@_Y*=o^cY*T_u_SwN=Tp+aRudPBu!&7=@PPbK9rFAu4|GW*+p z;3=tiq_in1jSB0F_u*V#$#JNJdHKbgqv|we>F|DvD=N!aQy5Gym%@{!;5ph7p#l}Nen{Vs7CuZT!?|8n$4pve$H zDt09*8;0upheoAu-;v-!3pQQb(rGnXxe|Gm+gk7dU&l5J;2Hgm=Er@@!DIZUVpqF^ zXH;VqJhKJ9nf+~7doEEtxa8}kG+;az=9PP0yak*wDvKWS2+rX-!wr2L zGVCcLe1Z&|Q3M$ceFPO-$V{%r7;T5j|3M zkPTL-v$jbcJdPK2@FYfKX3Dywk?Fs{j`0)*qg6=5j>ekOMBANIm$~b2=h{6#FOL2PwILVvU9-~=vZSh%Q?TA(zMyH5q3#o=MFAq+;7i6ZG z%&1nI$R5iKQI+W)mE`;<9MJDgdQ@L_3nVz3Y51_NQzA>*3vP0kPFBSFtDr{5Rx7si zv>Q>{*JK7&#Leb66*2o!knA?4RG673A_iRrSXHJ(@?d0<92|x$v#d;CO_tfDkrduA z?U>)DI(B+qf?YR6h?hd_;&Up({{>48lZL_aEE^|%HI`xCaxPCa#aq)5+T(5bw$zQQ zi?)?T-NklT=t(s;a`|S9&x3TrG|b4HDyA80`N~6+GBW$yZm4K#*=T!G>O?Lm=h;`- zKti=+R2o13Tmc4B=`>O4mju&`TocxvJV=n!7375^2=Y_$#6&6mI00xF~#^ z5lkK}jbTA%f7{I!6mE=mQIhq`Ybnk3^nK8;rNKs`BWVj7I1EFBl?|7X&_LCaropaY z*dFgDJV%e?!aG?sVA%r;G?-G#cU1AkG7T88d`mRANi8Wa4-Hsk_P5<$L4#4zo}|?2 z=PQ-H<|}17l@|V!!v|0uDS*sU09SFE%zkkQV?$eL8|Fz4(4{qoD+pTlk%*SNKe z6S3R@uBBnzQS=YTZ_4goE!AF__=`Dl2ZOc4KlM_g4x;;xuIq0VstmO%rLa%wlP$y*Sv~qC|F@D zRMav!86&LY_^6dS5N~`9GZ|pwa$|=%z_c$irMHTRDZSObrA?Jkhp*yA9lnO)#^yan zx?bGz-m3Zd8={!>rhPo=_Qk^Lgcem4UE_s5nT0>{)p+47NY{4=JLPeUZZiAZ?)D-| zkr*uOPcozG;{%jhO>0x%%Jnf*rwvVhxNT`$nhduO!l$oQjjar>iw*`lgL1pG#G`|= zmzBoY!lgPoL;-wTSj1L+pke+EzR_6tP;s^X^;dc`1OfDT6EEoTHb!G+qOBC5@z~#$ z5S5AU;FtX75&?y;oqm{+YI>3CFT})WCwA^*W3N45w?>tkJQq1_@?3OCCeKAq@MD6EF@1@SQm$n`a1D)7rCWt+GUQ z2*x`wrSI0IdS9kszDE$+>JbcmV^z8gIr?_#^r^i)Y-(qa+6aTvSxGr@7>jJtI1>_w zQXbR34wFUN>fu=EAT@8`Xq72acb-;^4r#Dmy{zpchUB3EqRjrbpL*^yT4kamNU5nV zW)&+lM{@-UIZC%o)Y+m9<9Vw`&EUUFI_ZVRhH(vUP*Fdw-VZ9IJv+qei+?L4Rv$*^ z3NapyCL?*Y)Q1I`DG6qX)!U$=SA+X7AxVNl)B>u-KNBaLXZ|axTX)ywtwt_e{u~S| zY0JZ4#fsaAunP0aJ^nqMpNy*p%SN2e(?0`=)mGtD=&%3$9qFJO`#J_)|g??HYwklgplID=XIKIJzZco!x;Aht4m zy96!;NAMPYXVFM6=O^jl!+ZFZ09OEx%&~Md&vQF4rft%)T8+L!R!hc%2eRpXypT;F zVj!!x%;uMXwQkm}r|mDGJ8=-5y=#a@fi+Vx3KAa)ulJ2%TC;&^%}jl?sk)x9E~ZU1 z6#q_g2(0b9a$!OC=suwB@yq2}9&DH>X(fC@M$aF~EPTLs9HZy+#OS9}IL`L~(&$-c ziqRDh0cgvVF3X>h<;RW)1QmS=M|Rn29vuV!Av zQ3Xv3Iu`_EzzX}`!I|&ay9BsK2cOkd*_|QiPbxx+_L*QVwEvIM{$sqL{XZ}oGjr}C z=1}D4NRrAI#w_xnf-g_@Z2owvq@|W>Yt}<Fb!FN{g=$bC&C4}$kvRmzGFEZgVW~xdQ3Gu2bac!(;_qEeqg^F}-B$eN5 zES8NWU!k#-!M*|<{ig&|*7x+^C0HTn)t1r0m!nGb7qTh((=cdR|26vm8!zbp8AdWM zehqanhWa_5A4jKy6_|Lr@;-xn-sZuXu2Q5uW2lxFRM> zynG!jH}!qPprz|E;} zgkeq8T%y1bV-!Vaj8aA5u+Wb~W0Y^JwofGsj>zD_7)3^^vK1>Cqx4Pb?3=`$=%$!8 z*Yx~==9ccx!h#`kFEV7#{(5+E0)iB|XBk_L&9y1HR|flLXL2tH+Jg9-LAC3Pu%8)B za{bTf;79kAbY&Hwf=-7r9{r!uDWn9@sTL!x5C4)<9t5%3upV5_kL5R}ifagEmw09K z$5}fQAdYEgO?^$By`&X%_QD(ieb3gAxR}A8d0!d+%)+l|dAeLLX^2aZt%H{v&{e$J-gp=AY2EHD3v@exhv7&5k5ykljNyzIe(`Y17}f`!f5VuQ>=HQ#Z} z;$5gJJW3em<)K+Tnf-0|d-YNANGYczGm^9Q062KWcMc;QBFY*+18&_*98%p!JF`N3 z52iY)X*;~?i;YUw;f4129pUv`2+hGIJfuC!O!1cC<+R5Hg(rmqQ__adQ#hECK1E5S z{EeJw_6p-Afl=G&7~ffH2Q7o)D{XfeeA#7vw7AeA!rHo-_05g#tll>=H@Se;=V0;vSR=*>T`jdq-`vC~zR`6WT!nj__+b>c zbdQP_V-1adt`zOIz}(HIrHgUZ_} zcgyJJ(bOB&7i60`5;$@ummcoOGANTXMu#k4&E%S@woF@HGi)`MapG%CBEH7-th`R8 z_(ELSUIs(JxY$pa+0t7XoXGcEz=prs{95_3X^x#9=BD<_aAvU#J_j8d<_b8CZ8~)a zEq1H|@+UYGex|>F19O}~-AB4OycSI2hgXG;F8CDr0Z;4bGl9+Hm+Ds}Eh^;YAz=Br z$;&3ZsC^a!q$jE}X>Ox&aaxdXZfE!?$8uMu*o-r&=pRw4QS~#&a~2O^d%Ow$&fe7f zPm(~m$s@j$aLLGPFwH<>P5Da?87H$aim&vLizGfYfym)LK+;2Gro@NhC3=X%*9MmE z0Lf|&ceg{gs3nNCS$1-TGQ4<<*u7sdASye96=LeQ$U9vuR?2Nlg`wMOv~bv>2An|i z=$oX@Zh$ZM;Nm$WNUzhb0PVZ@O(hG}8+yEoT^*fdL2b@*UHreW`f0(7`f10Yetu>o zVOL#ED{nxzr}~^x+58E}A?+LCbRz*`bxcT8v;PKr%%F@%Ov3tRsInG|xEZW}dOa;**%OO3%(p+xQhzI9R2(a_JYz5iJ-HKDO^sg6!A)A$u= z>2xbvmuO65g2wE%?cR}7m^c#hUQe;z9Zh@Kc2Z4S3{bPyw@z9qp=Pl@PU$D}m74W^ zm7XqDP;@LAslqFY*Rj$H*6jl&lqpn}g{57gP?f=6p{klp0ofguKd-DqU4COphZ1%v znZO(?f~enkZYo~TV;V+dreodBISq=H8S--{_}%{Kj?4kW~+!mKK@ zuo7Pl6)%>sXaIXoaRSn4QD%SJBVGqmJW@JcN$UMCHV0*Fw`~VK;clv4gk{4_T1L#? zlFZC*&W94k-fNq>6e_xxWgL)GDH#X6j`Jy9vr}P7Z4ae3P4dMaqbW!6eoW6~V#Opg zwny;#jZ2^-X7dJpu3<3e2~}OKt~Ovlur85zD9&Z+klyxGT5tSKN|Vi>hBYY!#%wT6sC@-! za8?!%CL9YgQygv7W)X|5lPYF=P{Z6&{fr8d8531}`dM}tuD^|Gg-MPa5&;d8sfIwdz-sNdAID7hxzrTp3If&({NxG{H%`j~JDcBB z+==`Uw^c^~mALNa;yT^nOKUHy;YEAt#!!2i7UsLKR;(z|A_R*shtG=i&}s|^(HPVb z%w`9PdR>8IDBDn+g^i(|jC8Y5ho@#C;bX1BZKP55Y@}ITMqvhDZKSzG)ugim93=+C zx~q&-n@}v$QJY{|S!_RtF+h-5AI3U>&m2b9U=r&H`7H^Z;<@$~@|t zc)?%mU@(t554JggxE%ck0GE{?!3=XRh<&~W9Db5_{2lFC`6=zMxGqk(?i;gTBi%48 z$ZZeH6xYKByUB=FHMwvOTw$w@Z0|63I}bD2wcU84p_)0%SI4YFXS1+MUsWO(`*8=6r+1X)>A;Cj z$J<6YdapT#qfw6D3yI+6sXWws$xQLKkuKRd>d>&F9X8UU8J#6hZLgUA^cR@Vh)v>tv+(U9m`~ z#P8kfrnuYlwGc4APUg?koi@xY?*wfVW3yG`i5OF1B*v^zUX00s7^_jgX=oe19KtA{ zpDTmCp6KP+bCgD7+1L4{<=DEof6cFsdRShLv4c6#UdWUj6NOT8tVVsLWFvBH0bbPK zCK!xm)bLr3E-58pp6jW-mZGsrj&0$YB3qyUep9N;4FJ1)QjRb$-_Myk~*3W=B&W7(($nFel&wHjhBF*LOAk*8}x z1AOcBpfWAUk4b*=L}^SSOsb=c&D+L(qE)rgYID4x)fO0o(rOVN3Gs|pTZvX%8qjF< z<20@02=nrdAN@*NDQ9T4m5jpI`HEKXpV3NCXeA>>D@7^MO4*cXWr?*KVlFXgbxDa< z1AOZujx`QWD`8R{T~?;m?(kiW(Q0eFpw+e*$c1s)JTkQ=zLki*Tb@MhufW#i1l2!gewW+wc_;u2Q3aS8SV?2Xv5;+F+wtq_ZLEv6P9{V(Vt8 z+YCMy&@($&%mj2pUH8Uy?xaVyYlY^l+k{i+0yNjzrdy0F2#Kd!|IAmDdAuz1c-dq( zPI-S$vg*bhJsSz>jcc0gd#b-SV3NyJYAc+T3SGJ^8p>cV8iECh%zunRs}J}azqD+S zT;G!)a}^~x)?gYxh1Gi3BuvS643qg&uyylG$qW%VB{MR?)N0;Fwz}OOFY0zD4C&S! zX5JAiLch86!VQ}1Z%Gfe=yMF@<}QS2Pbwh2-0b4Ub>auakrFb;1?~OSXcaTJaO6*X zn9s|^KX6qkg7zE*Imi3Af$}>OTh9WyWE9w~H_m>5at=snT&*rTYM427fKQTuYPzGT zYbSY0=31`wo*%x9>w6SNw zx&xZ1?Fun`j2soaLdsy*M1A|*3>=x%3@+d|2D|=Hs{(p2I}?8!X1ee0#P1GZukc&G zeZC9qAN*47Q`M4cpVh$?*??*0PPMB>egYEMi|S zev`zW(@xSu@Q?87v_G>v}*AXLU8+)eHFT>q_g&{QdWnEb(zP(fb1c&M@shyMr`lR zWOFE~9OZ|JToT#5?6!@uDBL)0pCep+8ysc{+)BI49nSWUlZw|6GMl%r1ZfoKt z1Wkm-0HxB+yQpaB2#3lj9LQHX!VkrDKY_kn+yw|7K}M>^6)Vw|T(0r)!{#LEG;~f| zjxZ-z{-l_BMlTdu#mu2?W{OvvTVF>$tIrtaiVGqVnz$eq};>gUtAO=TqskHF?R!WPoBKHn8TP>dx=aXZp;QJDt;g`!j48&*Z+rXl;5+ zZBaq!1@{G()Z~7psd$^GsL=U0vcr)>6HOv!1l5zED&=eL!qm`91yBREg6xB@Zc~vX zn@2;e>1kWf%XD|~2Kx>&+*Nc)-N`>h_QmK2Lo(L-p%#aS#Jq2x5unX5#g?ipl~&iT zj6MC16+6^9z_+aPtpjzasSF>@2>uE)-FHYn97?-g!fz^e>2|DPsR2~<5gZcHn2|o> zaJ-NKM`B2a%fb&IQUz#XhtOHDIE27gdqrDsC6aTr$IM=$F<&iSqOTc}X09%1AXv#qtA}G}|5xT*}1GU2KVv!!c~DabUdvu)L=RJ2W<% zjSw4`tMT4RDc%z<;yuI3^PU_D@2y(FdwuJ(WWS!Hp?mBtLL<*)Tay+qq9^e6;bY)} zU|fUoS~g;tIL)~a4$HaPTrp(1`?e4BUs(loa5liURICy!mbl8`GOs3m+|S^l3;1mg zbv>`bNx?*Z2LLPbqlBeD@v!EjSjtQHapIeSeOxT4-Y@jWN>csbG3Ix}pnk`i-;W3N z>oLC@2ldOD-%W%19cO+wm;Kb=*66*Mpx)ZrVgk_Cj>m9onY*KITQ$YZEwhS#Ca5e6OWR8*+jCI{yXyAqnWuiYyqXe{K5l`MF=9^=KW+rCQ_A4l(RH4i%G75RVq6{-FMj1h&jEodz6lE~V zTsH(|EDKA!f-+^WZwQ_?XI@gK%?&>((MH$}piQIEW+`6K<}{2FZEjeOHmBpsL%w`- z7l}4##9u)hr3!7nC8KaEU(x2qgf@ag8yP9uD9T{8X_@VN(@L(fEG+E`+LXZ~q>Zo} zK$|9`%^7$>o3k)Vv|%-;f^W{olZT7><}MX&F8NB@C{<{4u8hK&d_|j^650p~ZDgcq zqbP&X=IkM8V_8_*6|^aXM@SoCH-I*5E~ZaE4=-qQ0Y-^7H!nwwM%bljQypl! zVzklbyLfT6<$7G5h>f|b`tpNT`R_Z>>7bX~hs|Axz-%(GcriBgqMf^r=VnAf=OgOr z@0CzCdK3b;$F~5|bmgs>TB~4i@7Ly(Giw#gWE3vqtF;RDs`&#B@?fn(Mt|Ec{alJ- zkiii1n#X}Ci-e6f@d`d%SoH&p*=Jj9gX9Icj6x}`Z21|s zAxP{xL?Ho*uar@^l&?t4%tcquTv}i@1miAa_mijh=U~J*}HuhzdOwD&T_n2xz89TEWHzWsT_01RQ0zX0QcH$qBG37f5|y3*RL4&q+?Jn z-4#0>lk=a=)wcPf=VpXQwQV)xO@{vVeSH${WrkU~DlYI|dT%-%%jzH>ZiaNmskAH3 z4Is<^h@yln{{sf=C(SICzKYe|VR{!OLLf~CD637WAbhg@nY(f3?%@+L-O*6Imk$A% zLw|+H@lSCkH!o_oZe5%LG{5S?Q z-hk_Xupz(7Gg;aEbUmZe*mJwO2Bx2QW+$7UW{;pKaQqFpqxd8?W=S>J$>vwVvuCfl z>17EEIfstc)+Wp~7uR`Hp^96e;L;z`a0tZm3-eDX`Q1yST6Hd(P*LY%6P#{{ts)@# zelDZ%C|^mwJ5*iQf=!s02f|NAs()52($P9h%|RQLj&9P_JC{CoCCOsG9-tXMjgsw~**P11RhI6eR*> zpOsN~imxbpr}~uLxY7qVWR;O3tD<ZI2r`0Kmq7EIs;|P@u7=VP1)i+lwy|4C%0g^L5d} z{I7tfPACtcj^jIJ4RwAkqwqXmQRgo49g~-!AP)#6BSj#^N(j`~0@EO9UIfIAkiw;p zcrvvMv}67muCj#A@Rg;xogvZbLudO+T(}2?T#{QBVGy~}H!ZdrmVRh#d0Ck&l+`jg zsY}n-n^6$W=|9R(X9v=JeIUfrezeq_zKB^--%Ii5EE4kSH+WIszr~=wCsW@alHMSd z+dhhV-PYIZD}+zqx;vEYSMsWo-^(n#%vZAiZdK}+yLx2+BihA#Xk@}L4;MCd(`$$q)P;D{a1X>p`XHg-)+dqXx^akS(}I?- zWmqvSSO&Ysp#B=oCOG9nHy09Ozv5QEJz;ck=OZO~C*%|UpIf@U{&j$Qo_eGrp3fH&YAh7jQ+01!{{kj9AO>i5+tw>fBcCS1Eg02mf z!FAD-KxZsCkn({X*k)W6xjx7mpf;Nhw}=>}`0bOYU?z?xKA zhKi=u(a)8m+FW&TF#a9J3x9@Tm4$zUTi6%<0(gV?&5e1}LlP z*xb5-HTnhV7C$imPJ(RjlH&1FA1;215RM6?u1Ul-j;l(mZNehV7C)3x_zT~0Rbli~ zalj*#j_Vl!aW$EY6ay$0>4*XPW^jzi5PKR|_gF3h!P6L`y}yc$Gu_$x+#y;^?Vsou zv4x+MZo|`*ZpO88_y9^z0W4h~Kn}0Q7}|z!g&I=^mvlPnS${k5JCWaW{HO}6H`Tv% zJ*H*tZjAAm`V)M0e(&)cPknhf&LGQgEnssh>sgem=qt4^mAJI|XCRBK=V!4kU(e40 zbM^c@wxphAP3rlVSY188VE#!xD=G9XA1-DYj(UEPuhgWMFje2b#!U8Q3k$^ZZ)6l+ z<}0y$pX!+*74<9+#IlV3w%@|5c8$Gak18v7R0q@{PekmPDluE{IUbbt@UBf7kaMW*g%q|(p^iSb{=`+L58JV6d zD>|(iJ*Cd$KZN0NxBtqhEq;c<8#viuA!)HWs=4~OjjMvNA(L0QOkTm%TG=8E%)3~u zO1Vxpmr~-fyx)O|c>Dj)G=HC@sX2k)lQw&L;pzX8A!YtT7}}Y*gQapagku0-)1UbR zk#eu{@qj-H@EV`i_-F83d)$ZJM*Od15zD@TIn#}IlsMD8{W1!l^VKx({Y2~AoA*p{ zGtDcbzl}kf<5NW;k+(=B$E`1!CQkHn2UnsRSb~-kT=h0#T%S+|*G2CDo#EF>zW2kR zc83@dW;h0Ppc}S)&$^LaTNY zKJ_f%E+KeR<=d<}PPa6|7B90nCia5#*K{HN9VKiR}nny$&CRPMR(8x#;M^Q*b z#F30?E6Es3%MyVB|ADuYF=cRF^iQBA8FTfWWf}A1drLA#SX4*i}Xak*B;LUrkGzmivutDzj6gWaT& zcs)q0n5&eS^IIOu-7_WVT;-stL6P&{pn6!$B}FA~%jHoe#qCL%B6OGx){aNmZGY-WhhO*gM0Vb_e5F1y4pdgPj)C=tcz7#?SFG3$1*$@$*p$H*Nw! zxXD8sKV_z*o8tKc=LKbE^4FmpSCcQB$E}c0f| z51--$Qqhi~VwjgTiEkx~TJcFG82_eJUiZrJbGXs3;{TG+FeTRH(=a85tw&VizR{fy z$5GBA%g@_B01P!U zm`a#LMvEg-a;P@gigc%1Tbqa%ZEXb%`g6uVld%~a&?|44&5Igbagl9rve(w?#AqT4N{l3LboOl-Nk zeuSK6$5xhEn8a7JV~>fiwULt3^?)=xCNm|w6pz_4C%blViy}fO-AQ-0H}$Poeu9zN z2#%mLyEq3t?6H^riS8V%Az_(Qb7gr~1}E~)kF!zo15Kp9%P-yEu7JCb-~ag4^7H+w zhpYFP0(|eJj#b~%-L;;c>TgAbl-#Vfxi9p2`jl1hqAoizTwPAb=Ie3_btU&8bu|Mp zb#;`hZT1ECY`1=JOsmsExJ&?V4!PTRHTx=^c&63gFdCQ8p-1kLQJBV8J@VtKylW{M z2f+c+Da%O7B*jWJF0Wq+zjW1cy4&KIe$~~P#x_-qAXY~4Ugb8MH5 zsfzvwTdp{N)`Y}5an_i`HkE9u`m1FDgfe#af>+mPIA1V%{Q7(Rj0kyGOsn| z)hRFZ{kmWg@`D3o@YLFPz*AqtkiJjn`!x8^{*Vtl3FZKXbG{Mg)&}e1x;T0Bns2tK zba_QjJt&u)(Sv>N8~7Jk)S>ocCS!Kxf_^erMqwSk(odcct4IQdd3m6s$mnl-+v{(N zMLJ)S4wpwL+q$9(;_P`@S%KQbQjl+dW*zBPyD)y^EH!`#-58B?Gmx|g^^nsF*Vo?3 zQc10P)Y&*$Dp5JLR3cN7qGSG_AUkKgaUUlk+rn8id%e|Oj$4@{Yo_t*wbpsCeBc4x zPaMo+MGN&sxi)8e&ZDXM(^S0B0gx3-?!d>w+p*^{;%B|`GR6a|5R1Q$Hj2=NeF3-) z$#<0luh??uF^sm&^~HHAiX$#ZdY**1eTRj4L3N%-W~vn$X_H&YS{)S%MzMRzdrqi( z1SW8iKc_G(c}tdCwbr64-20SeaH%aNeVWD{+{0sS25OY%6+K+?arrfyG4SIG{8DX3 zT$1Y3vi1PvD#o+Cpe3H&2t)d#-gKFd9b*9o+KWUgocx$LgQLR$t!K9`-NLxq>8aZw zIA%iWq?;mJ-MC5`&tqm(()d}~o+Am@Rok-!!>=tXQ63#5fF81S8luljnw4SHihiYv zp2M`UFcFqqW<=|&i5XyKoJzGZ&@ivB3!Ma@XGWW{u=C5-4V76{nJb36Z%Q;$*Sd+! z!UlZRwf106aT4kmfL-FWZH6R9IA?0Xm);J{N#T&x1Y$=`Qybadfk#cmz z)daI=&6}tbD_FD=G~rG_wUvYroRcQ?x?DXzxy$t_@M+~0GRTuVK$`$IC4iL8MQ9na z$NQH0q(PsPmF751!HGShg8R8!WvRJ6%bITA4nWA!w}phnV)X_*zVjE#giGUViHYtO zj;)sG18RGp#y=4UnVzNaP{lIPrl>C)Io3$@OPfzIu1zVN>@eoktjUzRo)?!(gqv^V z(=%N?_jt zz6ExPSHYQ}45nc+%qX4J!)oDg$MPaSG=kEf^rx>QV0Ph$81}lbSUn{-YJwk=`ZSXp z3-Lm3Y>vShzVnE~P;y%}##b4c6t@7*Np!wF7edHMF(cN7natD~=!!CEQ4;GNV)>^m zG-_gO(>*@4$SzX!SNPS^Wz^cE6qbjFxmq$QE+SL<*#j7d$QrGM%UNB791GfD{&oD~ z3=xK%2~#oA%eItJ*o?3AvR|m>U#%kN<$+!%Bh~N~%j;ztISG&WShBT|lU&8^Ar%-d zM~e};(?7B&4AAYHN zS3xW4{awPjdfy5!sJ9IUI!+;*S3%GmSca!z$`NNF>iAhaBUy5Ftj!g?a!uuS{orJB zCy8xIBCZ>{0^GE(@}mN_lTp~3uPWdvb;wLr2@3UPq^Peb3H7tl+9GJO%f-^NL_7&? zmrEJ!yWgP77X3yCH{Dm7gHhfUG|`&TbZZOS<3)jX#DFIIxuSCZ9Cw)C*}l8*&7EY7 zw=34T-pbv;*T!*;Sfu7PVJ35QN)$D3HyMQ;_)5(~{Mj^=py+rq`rA;i+>F;s4}gl`!aZ0A^l zWeZqB4$k@#CQcpgR==oYxhnK^n2Bzy6e;w6G75X}RiU3zb7Pg5<|YryEhBX%SFuRv zdeYJRZu{a?Pj`^7h`j-Dpx3_p@U@EQpqn+U#z3hdXHcA4XlS9~?yn>qUd$OitIFV* zuArJQl9^&d!^&MR)&*e@nw21vpRv&aeQ@3NUK< z00$|+VHRLqDTP_NuWNXAFn*=fR<3SeK6cDw0to0s3C8(ICDcL^r5KAi3ussXZxrScY@CVbf%3_tsDWrANp-JUBG0x%mirpT z?kL_M!?DTf8+pZhnV2`akFS>Qx{qsy8H8DGL&h9&due;{pd6snpTls#k?`e6IKbuD z)T^6B*zVKZP|Sfrvb7IYfkXswa}SN#sY?MBe_Sd}b7Rk?rSfRyc{E)zJzr zZS56!h;$>9$0y*0JkDdFJLrDG)vUTt0#G4x{dEqi69$Of#ir|eiUea$?PLtVCuezC z-f`&GIqFmpg!I}Jm@c8uv}Ul-j)e9unMu={cr<(>!N9R zmhXrA;D4q2;e=szG~K*yZ=q<+)=+4CCSK6^9E=i;&&Kh8p|QfpUl)zf!^W9TzG)g? z=xFRb&&4xh%Lp{?1Ri5xL4k9hfY{<*klEk%iKmz1kUZLqo__KiPFfn{VhvgP$0wlE|k>RD9ddl6q-Y(q!#tz#|;qKywvhEjEjZx(nZs-?1b}I zV9s-Tdvh&=lx9w_jc?9g8?6PC4>_-=neCxV`!5h0QE4@}NG6p(h5g;6vMQ;$uIKXQ zO4@fYGt>KJqo-XJJ0-;`^lzn*Ql%5Fi0;Q;bUZ6IG4}0V$@%tY_VlW{_T;f9r-W=x z?lrm-Yh+eDZfqg0t4u%XY#S*C_?G+i11UX!i}^jvZzHOH5~go+d*Y_g3|OWq!LbH{ z{|%Fw^Wb1i|0g|wsts=AHx;|mVIQ2>E2RfygKGSl!=SCLP0i8P*1^zv)a@1EML-S+>m#;yD`uMjnY;ipTA*Qmh7fW!kS@(8y`-;lqtWrxU zd_!#$5+1gwDYGz#uSTY?s6FgXVOh=uq>-u2RD)2wWMta6ehVCH9FgtGZd`7-4wsmD zy9T`!+~A%jWto+@tarQ#+#1I$9#|DD)tF-*Wreeuzjs5-mt@iHa<-}4-5KpruPe?Y zXo5OJ%-;!h%@?tbiHC-mGE>{S4fQ(P*4@;1fP2(>HCKSvp50UUzsTz3Bz0A3^!q2e zP256QV^NuIj>{dvFszJ_9KpC>DzVA^GB`OpTiV0T(zET&N7V|}=jVB_3G$zU`&`Vm z5;*J=Y{`$QeH&w>$1LK(r-19e&y+5zDovfctqC3{ky*xrH^H8;$}Jeo73qCk7Dl;% zYIQ;|=(rs?0{UXog~Ku=n{;^(K%;V(7bexF5qI$p;>_+RMzo$aS&hiGdzozH6|FC- z9S)b?D%TS<{~^VfHn9mqg!P>=3ODnWu>QSj_)E|U^YTDg%SiF2VkN?Q6;R=C_xalP z2@;lVd4XKR9}R<2r+Fncht5`WNF&HLELcXg%7!_gurMALRQmq5smKL?;_@~iY$Fhr zwT(cgJ8_AMgInHiD9;3%1Sx|;ZLeb0P`mtbF=ryz?S$^0kTk$d&zGgjQRmaewgGFI znVwTN@wJ9r^n?GylfI@olOCuIAj|r8Yuu1z={s&DG-)lWOnquUZ3!oRTEYo!BBK|y zZF<-;vih!=9xj8uAoqLXIw8eQR1GT+rF{ZwD=qvE#&RM*?T_<+YAa^~`#!%^TM>t) zsp-Cd|8-6lg0y1s-G;5&b zUd5cP*6Y-lF#i)GrVoWm)n6BmR2A5L08VRB_6*GLlTo;vuLkCSP(wIJ2;}9#z+6V^ zM5tns4%-HFx#8X8w%y5@hHyUKKK5 zP_i&D4|N$bQ_a$_aSH{#+GdgEYAM6%HxOl*Stm`O4U^~DBg`{JfH@~?vr3DbV7ynw z=&%}8J5)_-!%oNi*QvxXFK^clxjZ^)ht*`+TyO1g<{T^)O|ZV_*iv;@G{O3w=Sm*d z1g$S`u8+A9)VIf@lbUF*Pq)WGW)(NI$+)4((zkdd^}r01%2&}Q>ldb(Rc+EP#DwFH~B5!CjSoX3x26KDQ2%|lRRG=tYK~Pe!OUt z4`I+IX^s=;or)*T@lilDM`r0v#nbj7E$97@UzmRo&&5lyaq%RRW6{fMlZTRP;&lSH zQT5%&=^e_42^+mq=Fg$F&IlEa>>ra^cz~})_J35H*jy;(<)Oj7%v76DJX*Y_&St+` z#_lAd*zVKC*=Cew!{T?tW1*Hg3>J@B`9^?+mdF!A94#!gJ0<25{eJlT)k=rSUjk=D zRB)}%>Ig|1+TOV%vpmG{hvD3hWVSRkH+ab- zZ$FvuCC{JXSQ)X{?Yu0~vn9P_I!AP3pegM^ev79+eO2 zV$=GToVA;ZJH5+bCtdtp$x4uciU}U%=Vc2Zo2&mB?d>UkDH)>nSRq6Hi~pJ?LmtNq z8S*4XV`kFEKg0vUk>RU3-#7W`%yJ$1oX3v|D|&8?h`G{*DDej9v+ePQd~L38BP{B< z=VK;I{mOuz`zaX(6khAOUz1=sp2WhuJm|S)^tb(+0f!wuRV>n3KsvlYwXu?`?PUz1 z*LF9-Rs013!o0pQb7q;D$Dvcp74=#(*_1HWYoL<2`N++bh8s8;N_60i(mhUe;Jw1> zZ3@YaEqJH{m)YO;Sp`zH5dy8DbM{UavV=g#eC|@vvhPTckgOO6iEoS$3CX6IAya0q z#ytb)pM?q`HY7y6G5rC%;hNDoRB`E{@xV>8Zl%j%SYLdG@JZFNNw!a9dXW4$+l&V- zxgawo)2;5@KH1p}v-E`z}lmjy%6 zMp#>ZZd;E>Yw6DjX6>wbbZYBy8SK>*TLT0^+q=)6kKhV^{Fn9~w__LlDt_s?A&ng# z2KGF^l#Ef+PRW?+;1`5j%Vf;6cp+n+$6#J{OB%^9v2re)Z<-OM2~;e~xvgP}js#&c z2R3|;uXKO9N!zO}DB?p#iUkz~@gcQh`3i51=TXU}EmM}brOKA6Eoj+px}prOixvTu z@|NrsJLi(po+%+y9c}6Sb-%+KlzD9{^NV;kBX`2cSJ!IoY?VO2qkR04;2RIr+e z$Sk021J1U9!X`^6RJX&DETAY=sae03S$K)B)T}o}izB#@2e))Anf+}yc(J8OP?mjp z0~b*0OVqIIb}fBNmo<|zHOk#k5b((K6SE{wP|Yz=#${F`4o? zbmAT#0E3W3U@oQM8@**D*-@0xiwekGC)IZrN!->FC9Y+X*JKt@5^b5}Z6fw|n1qmr zmPusxx83ZiqIfKm?4l%X$@Y%`mS-03zXRGHqe*9YhcvWcJ69xLYN*k0Myd#aUP9-5nz+26(h%JqAORb8~Fk{kjX=0evu4o)7yw5(c- zLe!O?@rhNPJ%TyFx5Up2CW8onYR_9isXh2j#h%RFijo!e$xSc8*Q`F7xmSI@fx-IX znZy}Lw>R;O=ZI{6erz4)$Lj5}*Wz1vW+Svhx0~chEsF`3z6EyR=-a&_tjslG`?k!& z>wGm~%N(n{A}pwSZkZ{0ph*5ur{$ytS(|FH))E6oy#c;;(Kc%Bp8xNE zy0jiEOsb=8y)3BF8`{CTMz449f?j{Yfd6+0^MAsIKJzRgoFmNt8PMA6IajNfuaCcX z{AA(6E3C>HD*atX;ct9JCC)4OdvfIgp=6})aaAnRxt(-6xi<%wz05T?eNV2Snld-v zeV7~7;}CK%3b38vmbK+sLDe$Yciy7wF!$sN>x8a;ZItUvKN2+F9^Pt?sEn@C)=T_8 zHoqMP_4~y9b}aiLtmx~sLx(*F$oGE`0RH|rhSqYL!vaKhhb-N$9%@4m+A?tszkiCK z+nKf#Np>Hb&7WHhsq=~xZ^pvx5IpQA0+koF^B)<7fAUrBFcaL>i(*RZ@}PEPq}W)o z5;pESfdksdlTB`CvUljX%%eBxl84CLZPXbu^S%Q|kaJ)2^k^{|cZdBGqa|3%mn&Gp zR-B58FN2ec_v625lr;*WC%_x)VBFN5l84 z>u$)*Rd-*R^DuR130rY0>aGm_|5kURQ>yMV!F)!CjD2W#U*bjGh1^w4zoHg)w%S0U zN|zV^n+3;YPhI{zYhVJ8U~j%sMcu9?bXW-ZO5JABx2yLVxQbis0HJZqNbSv6EaWL$ zplok`4Zf_J&EoKU2^+1VT_OZ|JcK&rB0K`crxLE1!IsURZD`6KpF)5{Fcbu^Ymh=` zEmE??da|r}E7%q#?i*yb*p2(GWT*~V5=@GQ>cD0$zr9Z$(jH`{IMB-GChoI^^M#~C zM7bXx?SdHT%;wJl-m?#Vvp=|+3S{@#*yd^#IXMn#Y4o=-&o*f=?y~0_9i`&aq0wu8 z6R=3DUPNZ;aDg0t^~j28HCM5ER0cbS)H!bbY0u3hYWA1>yexsm46fn(8~kkO15EI1 z`E3X66Mo~d`#;H^S^~82OUWK_PzC>Lzu+9>-#WagzD5lAmu{m0TZ(bji94={i{b}v zz)^r6tLa@KyVdk=vS^xacPz=EKq*T}Y?4{1=PM=g1J$(Fak=~kkZM|He;bO4Q@<6D zl=dJcX29Wc%TR;t?rdvQFBVi?v1xp=5Gq`NwLbn9cFzaK+HsKzo7v=QuRi`JE^j{# zyY@7o(VP#n_?c7Vo+nb=<5KmE)0{9(Gq0zv)5+x;gK&)9cx5`RmEKAX13XNNbYt2w zIJrr*e2>~H6s+CVOT`?3hp&$x!~N1(eh=5a5zjMt+gM^VU|Nez@qj8Ib@wQ5z`-MP zjR!blA|4ovk;t$gkxp0`1HdiTiSWk|p6WMX&Z>V;U+a6xqVetC zVe*Hn{<);YJwbppQkL1@#&VXce#IlDeN_F+qwoPms*is_^%*Pl;gmpAFP!a&jsU5! zKE4X?;y6;_>L9)mM^7>w`gM*&akQU*6l!pLd+rDv<8!AGt*Q6Bq`^%Tr5ME)r4Z(2 zSomVA0PV##8B^67ooBQ!m=@aw%`3B2SC44O zTUoW=CuVcqOx5x^O2n0*xo$UC+5}ONVxtb8K=8eUN)ay=)ve_1jvz)>4fc(eA~?%O z&T%*nNAJGrtiWfp?N({8xfA)|0g-P7})9jQf)w7SREbU645(|OdACAtPPCEi#9M3gYmTbaCPNkifsNYBusI# z&}c8NfHC_SynR&~JTGvVmtFNQ7b_5xFw%9Z;k4DMBxO>k+F_!+B`K%KEKJ}lN%@iL z^Z{Xzmxm;!%v7B!9w~h!HX)+2D>qjy86e`u<*tF~(>vlTF`9bSX;8gFu(@V8D~)q` ziJ`l;T}@tsvbOORRx*-ZFC||Vi*~+(V?WI;bcTl zF>_2svHSK)%8WN%V}mPrWjPYB0j2TV{0zHR#|BnMZ1X#eEZro<0N=Xka6FAyQ*%6H z;5XeDF_rS*r~P@V?&^pWfeI|1yo)MA)}vca#S5OCh5=7LDH^mFr{fBzF2zyol$Fbd zFjhQepW>==nrqbT)l|=Ug@tdpLVY(E&ma@lZ0z~C)bE9bRS4zyX4JT_zpV~5dbw0F z;qYw!OxVAj6PyZ{W@lBOv9tI(#m+)ovw@M!!b*I#Y5Eh@;~!LpygVczWTx0z@kq(D z^I&Lcq6MbrMpTDq-|UNs&m^;R|eNbN4xr4kgDq?kno%QQu0T%sE%S^*EPW_ zlxG90>(%h0uJs^_+snR9Hh&A3Jm%RmMz?V**7$mm8ggtbL83$$+;z*a=TkJe`v-*A z(OE$m*~v)h)ryjg?BH~t)8mLgHW7Di?x(rjf(Hb#o4zd{%b?<(qB1x=M@MQrtkVEjpzFIi{S8nf13W9>EP2vQpy$@h|PR0XS?3`N)> zaKbG?u*#0d^&EEeAvuL8G={-hn*-Z<$DoGkYU#_XY`*grn_{-&zMfuxm5q;#_g7&4 zXogk0u6S=_{S+LZRjsW>80CH`zr|P}RB$$pVJ*yCfl+Nb+YwMjsx#|$o|WHFQY%7c%C2!@2~HX7UseR*{|AO-&tGfd;6YB`FV@=??r-q z+rnSDrR)z|UaxPgd^g-uW$E5p@NZhaFBl}`dtGpKLFH;aQoc786!N}f^nI36XM#gA z|2^Y@B+Ne!Q^;NfB+z?#6uf7M}r0-GJeYz|Y?44C! zub*?<#hGB#)k$!l{p^O|wf*&d{CmP=`dEeOJw%YZ_Z8&k!<5Uc zWrA!$$_>Gks~#hlI{WT?iy*sO%H#Kv{iUlPBmG|+o$J7Xx;R4LuT59V8y1Aym5050 z#^~U0izddI;1g()2`<`I-*tAm;f73bo8eZ!lIU>XY5LyNP<34b$Xa{SA7`o4FqAonj-3X_le z8Qk@gLj-yD9Pz*tTZxkY+fM0JFVlCzR-)LQyREmMTIL1X%s~sTvYR|MTD;d)W!FQe zI9F(XyWi|wHG~}-eC_LdU9}Kf#$3NTMy}D^0&^-06~8}Uu1Ue{pbFRL=k9gY-ni!A z;y&9=_PT06!fk4PdywWr?$O3Ynuiznx@wJJ4erX7>tI|9aqVWVkI7+n@U`GTbA4d> zeJwbMcSgqs@ilLqa%?a+hz-v*4tnbpWEQvDTtms;?QyOp=9;_IxeDf*^iAjbuDM=3 z&$%u#*NrDQ*Z0hI=84YreRJKE#JkvBn;h@_mYM6$#C3_eUOUzKU23kiZ+5QB%yqzp z&UKZ!mK^9@cbhBP%(?D2SM5p8^?oHAF6!YJi+4cc`oVUJcWCgwrLrcp zUKkt}{M}re>?l_c>rkrqNjbTW3#zN+TK8(XPUa4Cxt5sUsobil9GWbLGdQm)zjrrR z$O~8@6lPsF36~3lZ7pQM{4SD)b0A=6}+%3zoQJ#8#pVf9A2Vs z7jp0Zx6HNV+_z5IJGe18%UmmLE5Dn9bIf(G`Q03xZ?414?^aHmDwY0o6z{g+B6IzE z8^yaLxY%5)TD&`hOU-qS`Q05{VXg+l<(}Xw!>o0&;{7DJw(3;y?7Tp(2hf9s^+l&S z*VE=&!{R;6JehJo@Iv`L61-@xy^oda#o%LeJz#jg6if^i@^j1m*XZ7IJ!PrDE7&*`o_iG(@6W-O=J%la{WaLi zT+?ZP3*mvCL$$cVvfo`C1Rn=`m}{HFb!e#a6>%-Z?scnYm6*T)P=ArzWm7&F|dAb@4t*<$}a@;VyE0H*wu<@h(nW?^?X;aEXGa zf(tyD_&sMKe_VB$QEBPorO@mST%yuLmo2^c`l>sst}xe&XDx+hcU4_u^>^l_a@|{X zlliq>p^*1h-E6M)&z9f)RX;J;>pzg+b5*}L*SF2@*HwQp*Fjgx@3pEg%yqN*^;K2V zRL2H~S-iKZn#?uJTyIy6G1u7374My@apro@F#B`WM034kxV%@jqPcRG=KEEvnrlBR z(T7#t=DNq?{i|wyb1k_4Db z`89^enCst`=BRM7xt3U(W5c4keroZ?g{PToMT^%Ko@1^Zpzifm9pSgl^*xI>F;a_`p0C zvX8_Ml4ch{sx6Lacm+fhMXD!$l)5ESS6}?B;Whm{4s{L1?;7^Ai|ddYi9AU!XDhlY z(|y)e(KShpmLH#EWj^A*%;D)KBtKC^$6he0E0VvkND7&P6e`L|Dme)$O1Mh;SXwq0 zAL*ET-xSof6-{)E($7;W!d#pv{3Puhrl_f;G0BSBNn(=~b<%N0?+KP8AYDJ1!!95z ztX>V0R1ADtSr?Hci9n>&j!3uBhiZEOB5zAofNJ-XVCF%wufzJg~7L~BF!D5xv z?H!?Lhtyq?G*ldwR4*BI!^CB2Id>S+NO4u_ZcaiPD};eLY@Bk#!3yhf9+IrdiUJJG zuM5x?Fr0Xjw8VGg$B^4(c zBxwkwL(9Pi#yVqk4|q6B6C)*cB^oXB8wF$q-B_7!hNP(?3ChXXk#0TGd$8#uMV9*a zD72hK)av6N>0Q`7ktKEAWV!`nf%IvagO&@$B1r>=E6S0%4@rC4AHVfkDsyNu;A#IJ zK+B|;KQ}z>53@E9mU_;rJos;kSS2ZHv!c&sIZuHuP%IHUWey$Z8n5xtH6*TnryA7;l7_B8+9n)|U~SW^m)rJW+eI;{E8PQidx+Z2{T^ta zC@FR2M<5*#A)(m0o&VzXvZr2sf#F+8uR20bz}@k}kpz+WsQkrS4Mmi|wpH zHDo##8I;(Aoe>^VCsqa}TG?eFO!sE4$6WkI!%LEwt*D_SuX&0Z%XF95d(5?hWt=1p zEUoN@Xf3HBSi(Fl+DjTc0_n9#l@z%EiD|1OO^{^Kwn+-lLY=*~s|fbifH_E|w4+kD zTIxz^$0X%Ra?#-V6k>f{=2um_CCk}l;@lYc?K)@`?Gl0-b z;PB%!;abt+r0)5!B%NVT_v@dqNtm!!)dS# z6w|d{l8O)9H+hekr%jNwYT~}hRyJRoBx!vv(n2k*sOAQdD90FFD_VL{4Wd*Gp4CRM zCE83$MPL=i%2sM0OIltGb*r`6lCHyY&m!vb=r;={MYlac*td=85mp*^jmPtyGmRGdpk}`{;<)7M0Nfls8 zXau{bt(H_3T5SY-q^*^7T}S#`TQ8}Xw0x^=loTRsB=pUa-pbq^_0J@I3a)%MaX^%d`^xcvk!=l^>7On4< zR7A!zLH|xtl=RtBKOkw0^wLrPK~lDCmG1f>N!?1ImtOi2NoS;&f%-8?D!Rk;6E-wl zKV?HB^wTypQvcb8M(Jm4Xte&Tq(d_DWAyWq{AE0o^xq_vk?~B?FG~7G#xq^NENQqb zS*CtPQW2SMzW%4AA<}ZOeofLQS-<7_4N1RBTA|;R#9SST9P%BK40jSq^^?e zJ+Jkuk~+z9zSrF(ot9M8s4fW?jYqIzMh!`8Ws8+DK9V#;mZgGGOHyr_uDVgjrqp$f zdQx{tmZiSoB?-UJvobHEk)%}Vvyst6QeD|!0u3KYDnF~?C#jXx#Tx;VRPHT}AW16s z4n~M1c##e{^fJOE-GDk+S#Kl4M%Tx%+LW`e5iNBpX8nygNmFDw2O9B`n#!0BHd;v9 zBg-=0XeH^ntb2;lMpADXvkW6qQo6i4<{0fI!5>0`vMe+@N;)7TxWwoz2{tuCtXCOb zC6$r1$>=W0kfZ5WMo&o#sy!w6QZ$P5c-muq~+ zIQyaIV)!ABqn=Aa9;si+fwRL6Q9AmqgfqqKpv_ZhS;=P;oayDc4dfEvZ$YlBfoW$4 z900ks8+!0?Li;yW@qD9R=*Jj_(messmyp_y1aVZ;WmzeT6`((Yul)>{+=A@uZmNLs7 zk9SJhB>|6ngrf9wMOnE9dMmd1C&+7aqhCRu4fq}8L*LtQUPVU5Vv$q z8Y6abNMp!-cqc!Q(L?dL<=Rk?^Q3IM29LQs{$_9l9M=enfwWzN65#mLhK=EvHE88o z5ZkBiVmuR5wk4wE?PJXILwmM^GlQi3Ex8?fknJ@Eq^culU)90d{Usxi(XlhwsPgAP z2@C3lt;|`+257kp+S-i`Y19w2GwKWm*#M&C#@@6V0mmKYW3At`nh0{^+FW}#R&nlh zINm=e3uN|ewDcU41IH?2%3kHTVKlby8Q&G4{n~dU)Kta%a>uXWOx*mPAS3#;0;y6d zKaZ9rz?q3tFwUyIc6%Ivv~}fmktBP5gT`3?FY03C%QiX;me^wpqPHsQ1VpJ@%n3-P zdNM|dvre@NBE#7rh!XU=jz2-#^%=i{C6<|gP?FNwS3s+3p|nk)KX6%7xOUQR!SVC( zTCSXpY;qrtcQt+la;`r{ETiM!aNOSmOQ^1?mlJvYg5w9ZvF%*&<8-jBEJqK|5X|dTU6k8GF!$GiSK&Egv6Pns@l2cH zSzuqM4vtiJ{1(FT#(JNE93wp>$sSv+elGY|wNP5R5(NO8s?E2E0x=3zV|Elx>6Yy51#a zzLbt3c!o9D4EEmy;j!=t1)r^CKgV_{@SGv-D@Z?h#TE44$Jtx!C#EFzK{>tI*7}9# z4?wTZNkN&t808juoGj&vUU(+g9p%z6lv(olw>Uf=x*27<8_H9mD0fQj-WWXgb46LX z2Fm``QMQ+|ob)_OT1JCSK}lHk9Z(r<7e?@r*+alzU@PCbdWDC(p0%hsTwr zwtsazZZBmynae2YVWK<}t?Zkk%_(^%2V_B+-?|=z^MlGAG|#k3JqBkMcR}f#fRa0* zj4OxIVJymqT~XeW$KGx5SPMgWwJgfE{ZJN_9`^T@=cQZ}j>m)Bp*+$9Wq41NAEl!# zF4MZi;<48jlpWflEEk7zy_9o6TTt@H*+0Vh!Shk(q@YZeGRqy0cS_kM0gwG$QC6<; zqfOc~aHdD-8JjZ~;LPCpD05O!CQF&+j>kKt?2>@Tey%7h*SKJl_A;F55qjA?(L^c1nFF#QmzC@uobP3z9AZJ4kZ{k`KF)pwXKK5n%t=9+EM=BFb6(0W36EgJ*zK_u z=K+cl)hi&WQ-JO4p(s1Tw zExbFbQ5Wy=)QmYsYHhtm*G8MMQdW@iRvmeV*#L7)lVz|ii5eC6)kbZ94;-bVJt{(8 zf#$sgmZu7w36Rwdcr9bp-2dVyjAFl4t)!n!% zxw`J+*w*v}A!G8; zcNU!g+IQ~%NV{03T@Dgc!QBqDtQ-3oo<7`I$q2&^?yN@RUGZ}7yYS?4q4pZEJl?2c z12?vH!A6kkP7m+rp{3xS4ey}7g7ZJfd&S9YQfHKzG&OtcSX8AGjyr%n)vJ7~i895L0 zZI^Wh&Y$gm0p!0^`7O94?F~5j8;G z@W$twA2!y8V=Rvwn2|!PYP`XKGQ%#3woif+eo&H%`>3Z37>ST z%coRz*L_yr=dbA04(!`VIbBNo)}7#t>iKTfa7?b6hSVNi<({-e#vJkFjBC9my{GA9LPvXoi!%y}uh zBus`>Y2J9f?Dm)pd8zTCaAa^}Bj=_`&l#rYg)9rawKGumu%OIIL76ONmOCDwm$FL& z9{ahXoLC*@DJgS6V!rqk^TY#>UrtkH4so@{f90+Q^Wa4Y9v%h1SQGa+7y2Zu0KMjr#N1pxWSB z-QlR##Cw|p?H_WqPm|a0!l3$KdD9EmNp^cgz*zKhVq=*W&tTeuYdNof1U#*jk4Bl3 zf--wC$}RFZS;{PTJTr7N%A2tEf=@swkFP_yB^l*;X|q$xuC92-p$5vmF({MTqx6&K z*Z0HY%2M0Ey0nq9oXl&K^e|DLiB|Sa(dLvqlLL~&)e!=9QTK1^?n~XLsXMfP_dOLW z)dT%&;9B20d2gorp1MO*_iU<9+TP2lkp$z3F^p_j5VyzKAq_END60c`6j;PO04+gU5cZC@a@M*}po<_EMIUo<~W`Xs~f( zN93KYS|MrQ>|leIDdE+dH*A?Q5oQ)QR!Po@iBj&J*b3~`oyOj-?cn%_wK&iAcE^$S z*OmBuz1O=lL^UV~XYk3gzN1FsokLn0UX?2C#fCWZzG#T^8qU1lEUrwChED8r-WRrc z+qZ-{l;w^X0mq)1hdqn16LO_4%pO;GZX0FYV9vE4Yihsic?rHv{C6rm&)I2XB9v#j zr5%*;l6@|mx#@^=R)L>D@cEk~di%GBOAAsU?QLVme`*JQx)9E*Tnzgq(sDV-nf7Jf z{>xkcPdA$Ow~f#LKbFd8ie(SjEO9&_Js$>{Q2ZxK#o4zdeud-T9It>ZUFtT-yi!j< z_AUMvWR;Rd8x=(FO>S-YL~KUKQgFt$j#xXiX$6rfh=y%VD@qT8A^xg7w~ZR|OeH$= zp*PP=Jbw*VWee=j+u@pOq9d;1R4A_64x>HOzHuWg`M;xtYci=tgF%bs`7i%7s^VDp zZ!MmOo!#;6Aos$O{FkND7S!mUx!`%_0oMF2SaJtP%<)DsoR#jEh>>MW0Qq4nw}Z$` z&P^~QfVsePnSE`LAC|TUSpER(S_S2dkAd}4c5FJX?=`nq{{LAj6;Linx40@K@a`y|NNJY z8Zq+adE1_h=T)3NGxNcZ>P6cvcfs>TIemc=s#^dGg)KR&x^1T+70-- zYqnRG(sqOudmMj^#;PtDXM0HXPsW#=pjB7LKclMZSZJf-|6%0+ZKGQ7pS@J&)mmPO814Vct6fS9DF1?tHV~84qMc=A z`uw9t1vbN^4a!UQYQ#p%TJQ#~K)#iEsWa;MOLzzOp;nz~3~%D_in|4|QrEbOvuEaL z@cC*(4D^au6DQ!YlruV}HO5&fv#}HGC7uUzn~@{WtcBz8e3LxhCXaX7l)o0tT#MER zfb`642(!$e79963+53RJZ3Mc0*mfP^2^}rJ2M=mQ3bw;1_y3B2q0PUwYJ|7-lUfvK zx`Mdbw$u^G>))1Gw*T(`ALi@E%5?h46C?98)V-28XH)k>a^yS%@_&u42m4(GdlesL zGr|tzGt04HW-p8nM)F|4jnHcU+kP?35j*5NL0pA!gD3HOjosMYSx;?B^-|UsR|#$# zT9ZQm*sJHR!@lI1`3hP=^@`Ya*wa#rs`j#to4N|nau(!Lgx!N&&}T6lpXK0KdHdfs z%1>pmR1vsqr^<$RHBpY${^3oP$}yX~boih7 z{yP=c_n$Mu$(&x`;doAeka&!-9Rg9^4(}w3uwG5Er&;5tz_Dj$jj~19st@j3r<&*0 zn4tQ`X=66jw4yyeg{gbjkm5K#Y%Wo7y=}r0huyt&E^-8epI6uv+ zpj66!q1{5r@wTzq#`6woIqV;no9#AA%kOL~u`cS4rHZ__QT0`xZyU!z`w6Vc6k$~c z$AGteE9yg!RW>Ik41_bbb@{i=*CTM{=d^L=Uwr^a49ukn`&8cXqEA>Aw8L>&^{$!r zIAYlPw=J7(luj4JwTKUUk-BoR?fxsO|2=*djLiQlm2F%6)Bg{4>dyZH)O4o(O^_en zGe3k#s`8Ioa)7S-f0h|-l-9PUw~Z@cUl51?wn?*lB_oVa6Ep4cX`;aX{RjDS*2B)? z{m*={F56*Ut_Z{SQsw+Fn+vOIgXO>P2VPBd^v1ckoRn2T7UXU_zTsGbv%`ORRz1Np z^Z#mtE%o7b{mS7UjPM_hV>o*jdd7Tf*_5pj9Dk?{g2*`7RfHbfL_T$PDvoQ#mrCI1 z?N$oqOnckWI~qKwGOIpT*$(Yp>4~+N>>kP^-bVD)@KUc;Ye?&ZvKfi&agU1b;rLfUHSrHneE;OmEnJCI1~Rwl`xgPzzVY zbjylz$qqVePqe9AN%-}v9z++amT@xJ0HW(v&p8-uB+>6(7eif=h@N)M1)54!xmPYL z%04FY=#}J96jrJk{7bhy8=A{3Y$?&(p-B!FwwCB(##(PX_8HNGj4yz`COQ+J>;T^& z6J3ih34cK82+?+^g9AHFbQtR3z%CR}%D3K*ERX2Vl!HLGiRyGY?OlvLBC>Wl5A=%Y z*XeoQ#hHNZMOf)5v$@Pd`htpqK8#2KBZZ#NhN&Bu%RZo_>^T?Cb{~QV}F<=e9AMsYBC2_ zyqkxQGb>|K10NSwpJ;tsZ=VXxkLYWliY$U?O_@NSN-TkBr=)g7$0YS2a@-OImNSXU zCJ3J@Yyr{Ra>A!7TSgRB&f??B))Q4vkMVJ1UlSD_+svmLyFirPrI}B4c9W=4Y8xMS z_JSxdw6jkQR^Poaf;E`0q(y8(yB?sMZtD8^)MT3!S&CFmcJN?d5qU*-_VHlf5_NXV zWghH%q7iOMV0nVbKVqm)Ep~<|HewXeB_c0KSDRfY3W0RB*?po<+D`DP!=4c>Z#x<2 zog&%pb(v$0f;y!6)Mb+-<=f%4S&vO4y1ihgPd%1NgjZ@kmaT|i-1I5vJ|p^W)k+^v zw%erjK<7=`>QkS+FzFkg2CQ05%srnkS#`*#A!}gL37~kB&iXWB{Y|>;)0oXBib}cd z)91x&i`NEk$zd31D7CIQ9fEeE$)u4;=BjACyj&2z4uHrh8D74YwHF}zkxGG15c#S7`$+VO>!M&pXT zc&thWGtkINwzS(h&9_iDz0xe-rlw_7#ZL;UShec8EWSWj?8<~qzJ>I7!WTAlaoi4H z+((T64i|ecZnq6}82`O*Go=FE=XUOxokr z)~~ZkQ!8}w>rz0)a3q3{ndHC2244NP^xy+Be7o6L{_WGffMn0=X;PW0@I|Ic!{+3& zUM6|2@)d=2ZDSw5Lh@ce$cBb@wx#UU5jMIr)5h9R-1JE{ls+}hh9akB*wFfUnKqO) zZ@vvZvM#ovc_VXe$n^uC;Zs-J=q{z5^6hQb?_Jt2HiTDPA5%AM_FV5msxg0~Um-n@ z>g-cUn>wGiu{<{PD;vwv8G8!JSXAk-4ds_VV?!l@`WEDFtg86CUq6$2RGj78-=uFV z-0&-;Un|`A8^GSF5d}t~XMO{jS1mM7w}g(?{D&|4!?N68 zRLg%nJ1Z&G@?ueapv$D2xXjys0=q$k<($AC6CM9F7yh2(d!pe(1HrOr9rT%M$r>6C zR8ms9rEBk4|0L$Dh`p}R9HIxjpS1Iz$ePqeFZq0G0*7BW3YV159>Wzr ziS?J1%4$>ywx7hd5e0OHeKl-9(Zq^f{UnnO!DcC-P4JK;tyx4yR`%)6l)2sYvvCE1q^&m=f z*bSndlI{~>+s})!D?#MZZLxP2D^Jv{TP~2R zBFOzS|9PyBN#FR-XHzBRa~#hWuxwLz*gu>3d8r(*HJ7k3qW8UX*%B5@RJuU&;m%)olGI&?q9jQkSwxir9(ho1nW#)YG}E|8fSmQ&?M; z4LH$_3Dz;sb<>_i)v6>wq%beCl0#>s(CY1_U&$1gSpVM8O z12(WLL^X%O9&dI}lImF-;m=k`OUS`JU?c3SSLv>;9qjNKdqb34p<%%1tVI*0`x55x ztt^|!ac*G1R+dMEbKF+8!dqG59JiGP`Y6(3qQJ5%5zcB~v6)0k&dme1v+YE~D|Ey^ za_g(oxvuISu#(K*cDowZh|@RWO6ThGalipKny6WYr2z-oexe$E)&v}4?t#j3c>m1-hgk&C{N8&5jf|Nf!f7v9dv!UpnjQd^6xD*59P( z0l%>AL`lvf@C^Lmxw6Fma+bvt`OGg9_$&NwDC*|1qmh*Y&$FULiy~?SUSN)rQdtLQ z&%obUd!iA}{(--zv06l9S0_8j)xP}@8f zK~$kxpTIoUf@plNK|no;hBw7@V~BnWE8~>MW)R^$N*-H7gjZZ1+eLJ;x2ta+yG~R! zEYCZSl?Y?-FWrKx0C}t)QAc>z&SOo9azfGPV4^o|PJ`tJqOm>D%XOj~l3c@;&%gU( zew~TBN?J^G2vz~|*jXZ+Ve?qA2$c?Jr#x1UXj9|}sQX7m-$afB@+b0-m=gFW3nz+= zmfdHR z5{1IO+iiB9sCQH@yTh&!B}FAU++nwfaAd#B9uncmewV!@!elu)<9AvN!WhN1B>z=CT$M1@MKB(9G{)+_-sXX zI4;@qh04-0Hw;!1d9Ilb)_?grlVBy0A0$h>yKv+uP2H|QM_#HamIZS^7+8$gmz2-( zd8{}OGIc)(mf$@V$#J(7A4t?D{U8xsviZJ`FnaWu~qi{Hof|ilonq{5K-+ z$;l2C`E}FMIjAD9l~7Q3_n=BVT2em8XUfXFy{YpGs=}9<6ckjI?1OkJ9f z8-J+Cg4aql{(=avm1>;Jhy8R5UMtnP9T8qD)p=`#8 zYQRY3$*)OT#O99g8PtH=w?IpzkwFc)mr1EXjd?85zzMV9HN>ud1xz{=9Bmv`lAs7dwbgk_5l_*J-fBU|vZsm!z_1b6_7X zpG1_}e`)X#9@9>ylOw}0KHH?tfy4P`Nor&m!SQ!?V1BT}Re+KF8WFAnjO2HT@aiAQ zpAg|n#z_8#2v;&jalO6F&yqPO$zc>PCMn+z*EL4-a-?gv%3z~;71H4<#~5CdbVWC< z3m(JklMdHB#&RFhC9bzRjpd=F!xfNmJce|$J6oN`@s^~+^^ozr1L?M;eil5Q_aq&z zfK1>6Nw)!3D<<$!q{H=)BtDUJeWz^;PU6!@hpQ?Rc_!)pn)XfbM81%8xW+PxFC$(5 z>HC8x@pYubm6OT*bJD%F9tobzcajd*QKs%r6b zCZhW5&I0WtTDR~{@N|BW$Q3A^zaTmT=`y&ZTwY6OS(03d%7K>*-k2y2(#_y8M6a^% z1kdE1iT+G@52F*%@%;7~k$$rMxL4H}h0#UV&E+JXm zlgKWrTF5*eM09LqosjuFp6Fm|qmTu>lSu&~*?bt${@Ks^5mJ;wy*( zLm&9A<{K2jI00YA@I59S2wBa!ToA>cbuwfPuPP~@<7(Pk-oVry2wBI+m~=8^JzqeU zxYD+PuQ7EOLN@Z-CS4EN#EW*tNaS-|Y1_=pNlLergEviEcx9sM@TO@CuSs-!t*`iu zdlEffYp~C_T8>S(IJWl{pYssXRcmj+9_<*S^o_af3*Lfg{>CJSFL(!{;6;x@w(=fC zofbU@8b}nm@KMN@d?Zn?h0lQ|66Gz-gY?B8g+!gZ z*8<8_1odkW`Yr#SbU0h=<;RKej%+Xgg(zxrQ0QKMkqDnK_wj2)9)ok)K7N-dWN?zh zKK_&l*C4**Z-{UW;yZ5Xj!{~~y0Xo^NFx5hxr4dL@3K){x{JuD9d5~o(Riwgct28^Rr-Cj_{I1D`4I2D0e3Mx_6Sp zQSL_6wfDz?$9OHGfxVlD9^(xa$sTf?qsM}GQiX);6NQ9p5QT*6w1xE75LEbB1o1xP1Rp>;jM7Oyf^<_?mt-e-66r8zr+6CaGJACn zJ;gsJ9Y*j+zJPSN()}Y}O7t1T^E6*WbZ|&G&}WnmWBn7~LAr{N?kB#FbQt-c`C-yE zSX12TXMUP=*bcw&^Q6lI-7h?kbl56q_$|`;t}X6#hCd=5w$WMsl5~?mcb2P{M)`Kw zV!v|xUf6rmEdzV^0xBaZ-wxaF9Ir^aBP)wLo#XDL!`3{{>yoaOdvT}pyou6rY}*Sw zf(YC80&k%#p|=hUy}+j_ootogd8X1?uvLEN3rUCVevvODT@KXtB40-|0wQ>ce@>JR z(Y?fXQabD*m-%<3n=pHH=w*IX={WX~Klnu=>^*<*r^=GOjhqtt2aoA3Bf&aHW`thh z%N5CMERS!Hw1^#b&kD`sZ%kSg`losQ`Hjs9y=qdkvCDzl$`?`T7XOGfq1Sj9qS%N{ zKz)h!W_%fXoew2CnXwaSoFbX~4W3LoT+6$`Gl;f_!U`78BEnU_e7=}y1gwhX^OZ!n z@^zDMB*K-ioBS&xTsyqQza_#QM7Q`4ie&D$`3XsCcDl{akmaVxeWADcMWSyaj{;pM zs=6B1y7)b!#;akii$5dsk2n*0m%k;7jkpX{q_66Odoyl@-s8oIPG&p+a+aia8{Fqf zN+(NppQn)}u1DVIvxu(1uB7{X0THfoKHxb-Gke?uT0?ZH%(KwH_!gqOW!?krAi5Ca z>idxICAt^m0d$xMS5Y7FABjr0Jr8uA2v;B<^D9KS0{NKVBDw)(dBPtOy@s+p;V+4> zjh=GePelUT=qa}+!Zv!wOA}!mJ>wOLHpRO7{>`fsos9JWs!P-;&eiuhZ%oua&I2fj zs1~Gq!L3BGknRO>Vc&hjXA)uGeZ%JyVc&hrmk?p!ealxXk}ds?Zzdg%(+lMS&$>16#3v6n1yE!_}@i1v3r z5A-7u_VOa)91-^NBH{`WMz^TANrcfYDjpJHbS>fq5k}V{_yAQ0T;;bDc0^_Sc>t9r z!Zm+;QGsZ3Uk{+_M0iy>h&n`gRXK>pMA*w6MIaIOaz|k$!YikkNFc&1r3qLUd7f#yk4kuN1aQ#$Fh zl-NO*7~N80FA+w!lsHU;*Jf$)BN1MkrNwz7EOi-ig$PSsM%*I8>!GZ8NQBozS@BYl z%)Ol81F;=c$;t_fB=uBYPL!0Sb{>@zl|Hbn{()tk4=jBo<=f$WR8E8t;e1q1#He&I zANhqji55h$5fMNgi1ubQ3o9>r5S`3u12kBYDyOs9rF60m&SF1VVw9Z4Q6h|zv-p_^ zqvRrfBf==Th^vaEmkQ#JBvtAP;xQ4Hx`KF3>HH%)g;f;VAk}wcBl-Y2679_x9#%<| zB|4cg7RXhSDs^QsSm|VbmBnbX#8OullZdd?mBn--EOiwzn+Qu?MJ!Szy;K#sl2oay zigiR->Z;-kN{4%UUByl!+}rCa_7maT9XD~52;c6wiJysZ-)}YX8xijNttPG#;WJ5f zafb+>Nvew{M7RgpUA!j3J;?4tAFN`wH)C>G4dF<1GGi)`vm_Ozn&KCwll7}9ekaSr zuqU{txJrb3f@_MqM7SsTBk_a?_XK|=-VouQU=N`WQMu!uU=LA@2=^e@66J_+4{|M0 zg$VZx*A_L2aKCVEQJ)A~rH+8@G4Lm=#uEOeKnq$Og(J+MBUFtbxcTI+?K+XoVyd zT`zG@>12Lh;wf2TAM_G$h_DZO31g_LAJ(>^C`N>}Z77@+NiU5=6-lbpjYLf%EOjGM zpVIk9Yzb>De28Krz6J^<+M978tci#rI+<|12N1Vgp%XslCNkA}qDH z_=X5e?IR8lVX1w@aYfRLulPlhDz&fpod`?qE3Q#G++W})?h>`l_%X~+JSD>22L9p= z(cX;T!u*9kOvUVE#ucEFl2jc6#8IV_xd(`Rvcx(BhzCSihXC=M2q#)R1Uz#>=n}0o$Rj%df2^FUXKu+(AVCJ~l8OgvO1y@ZPwl2oa~1^iSj z{L8n)QilsWN$Hlo8AZY)L@A<^8IC{|h+Hztghz^MM71(11J#wJN^KRZl}_eo6>Ot#BEQUh+BmOcWmx;ZD3n(L_=z+b@v9C8b-6#;>tU6mdi)<12!$HBrwoIic-D zC!!JX<5TTKZ$&cJ?Zse4tR&>#Ua&E;4y;Ib4u5%M8qv`99m6|_rDK&YV^WXsj^ZBC z{7FN?JBi3~QYU?OHscajd31Oob*UU|-__LN4!&+C9dMZv-b1uAz03;lDY7M{T83B4 zWxd4;N%A4HerZsa<75g=JDnA0^J3w1JHlb(572%Q;$%mZZu# zTFg;8+0vuME=ll9*w99!#ePYtmeSRd97c;{O2?kSm$zfYbx8+dPid0F7?CeY`5Y^Z z6wFVpa*P!vB`tz>*c3ii^fqZv_ynqu|W~*ROMOtd~uhkO=zU!d{K0&EGPT9r@0!n#OUeLCs+nW9h5??eltoC@ zRz!R+w7JrYylxK**n$oJ^6jvV4vR99QY}^B4bEXviFDXvM})f~*m1)bjMEoq;%tuQVvtPt^qHbHZMf@T*E}z=M3x7+TXy9^NO7EV_Or3GDRa#^r#lVwkA#EL%6Iw{kHzqq2lKVzm%O6Ii+jx2K z0gdiyo1aT3qcHbk-%Xhn`LLjz#vN;x4PCP?jeKP4N{!^~aRJHtnPm8Fgmvfwol&Lb z+Q=s+`E5Ms@YJL#EtiKrv!P9qf16|({bl5Hld80Ic6wn_@8t&kwJVCJfpvIe5|-?( zNdrd0YOnZ7_DH<`zK(n=ZYr|upOqHLw7-Z>LK`vdInhH&@6B}1PE4zwjXCDqVf$%X z9U^R7O@q%Iqz+qC)8Z6yESaWtCc?JWwHZX%4!U-d2wPg$^o7z3$ClQ$7DU*Zx^{sG zTT|DnEK-)(?z+}MQYss`aWCiwA@Nk^Insa}HjpLu7el)!2_w-t)X;95bU3nz_R^$H zkrvJJ3FeS)!8en3T1iQ%7JM^lr@4?0`-{C+m*~=@pMV-GV%U4^wL~K9Jr3G3}WkG<}7JF=wqD-zUCEQas3wL4Om zZ-?zrN_#9R)p7v#R+Q3SOIpNQ4tpF~TGKy8FN@g1QLiG)Y95mEIrg)1+7=@0yG~k* zC1{z?vA34jZV+KlcGk2UrNh4KqQQqL(h~b;1#P%Vn<6V~dx)^NR?!X-VV|g~{Yr%W z(^b1ngmH1z*ivu_^_#KT0BTG$0mx13MbvwM!K!Jqk>tz;e?eYbD@l#J)wSJ9XE_GD zDXMEf5d8tWDXMEHiM)ork96105`_&jtnS)nMbJawH@3A~lJYr@rZu!P%P_xuj-zQ! zjpZuB(bPk$M}(tkZLK2_j;3|B8ALb-cxp$Nt8_RA)YmMl6yaFjKr6Xg5su{zwZ%j@ z2Q<>$*C-v%0Zp{6L^wkGXvNnm9gfhxS_>i^q5ZXGL^whRXlIFVgbvai*QsS&GDP7;j=U5vJDyV8X%D`$<>))48Ewh)zAQW11p zzE+m!mpEFRYBP2!3WEINwcfiFwOs0GP0&KWQM3W5nO5mrMLCeJx#qT8(aX&>tSvM@ zNviHGwJ@cV-zB%y+L^jdkuA0Hisbd)N~^dBy`(ej$*naHN%L6Jr**BZwP|}*4l9>= zTia@Z`xV{K3AMJwqF-5a;mRJX9?T;(+$z5X| zq&*~RyXo9GrB#a<@m!kbHDc=r9 z%#qqvMI6V-k=i>V>{+9<3MVm#e2x(ut$9d7F9)rowegB9^QxY(j?q#irCQck{TXPc z(y`q2xooVqhsb`&7v5vFH$;iBDmG5DJB2x8 zc1e#Mrv(u$?U55YPKzgcRc5jGI4yOwa;|F2g(1BrS@lAFNzX)LIhVf%g`Zv`$1?0{o?Itq;*W zc;h!k8&32N-pVFx6N$u-O_3?u2BI=u&wHn8+lcPMif)>=pD1ts1?yC;>`$s>WzuhX zPt&RrO@Oy8)3sVexOr)#l9_u%buhSr9tA-vn2p>-o#3U6~~Y6FSBfOoXBv@t|> zW#5N>tZgO=hIh1?+Sf#7VV}Tk?Euj=*xfKkJ4y6W&s*Mewev(JVYfk+c9m!q&^+xv z(M<3%Uwc911^WvYXxh)Jepc8~kgXM$1bfz7{%KvPg_v~T`iVBsq?guDwS`30M;lQ& z+J2(*ql~C!n(r^@6TOs*TCTM-$t7x~Hdc}vO;>A~lGL2KTDwMsbLtvRKZ9QKInJr; zv>HS>r*6=qh;UBbr1dAlIdzM6kO=40&$RAml^2{-Ki94k;hefvEBmX`;hg%Vwt@)f z)NPt}PU&z?-J#VY!a4P8Z2%F@sk^kfL^!8@qa7l`Id!*oiwNh`J(}xzEK@D&du{FS zsGG-d7Cor#Bf=T)kanI3XT!tVLn53hk7#xmRXUtSk818jI5Qv9`V-+Ceq1|9RANcp zs1w@YOPDSd?gW}dozyZfD=#>|pVCfAI>>*^X%h9L_E^$1wqsdv)M>5SAIj2ai8bmc zEmYD$zH(W7)X!SyE2ulj@8={&ozXHS&0{#@{iky-fCTLVp(vvUHPzgS|1|Z+3`*rLWFOj-f3fq@a@h! zZ88z=*LbI)4_qB-I(kl2A#H5GFzWpWI$bZY+}M6~l%da%UKUx#xNeQI)Ata~2C~=x zBJx{{0_fP~rk3<#IyA#a@Dy}b-l+Ur8CG;&s zSk99Aq}$S`u*3m6U9d*J5J673uy zoGR*fhz<>CV^>jsDoMSatE5l4Qy8U6db&w@QI+(~iY(to-HfWNZzDP(X}4*4A9R07 zQZcKlza_%yT$rAL;do>b83yRa^Hn=~h*qqf=&?CT0&gmFpPYL~k#3=@yp(Wum?H?nECAZ~+=X^m;@YCm($TQIV179DMX7 zMe?b~x4>sHd?!^%A#+`$3#sDxnl{v6d|ey5IlfV}pXufOc)vn2!YYSG`xoe7r*`w` zK$CuS3APV5DbA@wbcjhkoqI)xnUv%_GCIN}{1q;%N#DV*a7EeB`VVNUPqdBh8=n}H z@K?CvZ0N)Xbk?V-jqb8fygtp0*{twp`h7|Hb{Lly`ZFSoOAGxS5yqvZUgRG3f_yuS zOG~{35q|C1N-s}@UpuzaU5T(ATI&Hs*bc4r2ub*zuy;gjJznWxT{twljlO~iqnoHd zA;Rdk*Y*1{caG8RppPfQ=yuXi5@B?^=&lcxC4MK|O6@%@E=rNB}x|^`-K2*;p8d7<&|1kX)(c@3&`H#@+K30}li-PS(>f?#r z7JnW+O5ab^Wa$9^G5SLymb)u@oF4i_rAuA1KYF}AoX9i$X!HdAAkoLpN24d|&QF!) zYM{ybV4_#f=cAMLT|{LoT#HW89iAym2YADgrn^d7#H{1*MW^Y}CcTTErVll#L`=G# zPE>wE#h4lTXC~E)nWdjKDL5umzehAEDK2J?UgmGiZxI`m)F~!Q_cv)!%zV8SQM1b9 zVzTvAqAoxS^`#~y$1Ku!nKUbAv3{1Qr*n4965aW^%Au$8nwX_}Uz2vkEZ5f%B{}~P zvr^9|3ak7}%xYb{Q0d~FuEwm@s}S{cz8|w*_a{nnejBq~6its{+g9*!_Bpq;%GMIsCG+ zo=MaT_BkHZ?jO>tB=)GjktlKUir8cNEtA&A9@q6ZGCvj=`bF#s-BFSBc|xzM$TDp9 z4$yt{fzIEg??Bg$Eb&Y7Q+hul|A-^8r}SY&xVz|-K8^@?7oE~mh;WzCkNONE+$Hp* zK930Nep>&O2&{VGvlsB_#!{f;7;-$nhcB8W>B&>8P!ex!3Y$pdsjiY)kz*k#>H z6lL{_yKK$@@5}oDwJ_5K$Nix%G$}UjioQ)!K1a(u{Q!CK8=L3-r+$p6+1Oh^zYzIH zw2ix}|4tMe(Fy1p5#Ci^)9(`D-ll8%QzDG@b^Q$y#`?N$yf3WZje=4ao1WD(u8?p) zdm-Tt_Cmsa@P&lC)C(yov%ig(ok>G&2;UqOTArIb+D3PG-5|e0UDYsK!oBW=I^3mR zNVxaBkZ`woA>n@SLc(3+g@k+03ki3d7ZTpH7ZUC$FC>g-Az?fV$tx`>F5ir&H7y0G zn2NP!bHWJsn|e8--3b|SH}xt+`90^v-O_6kJ?xncRG(;5c23-F-G^vj_DY~oqGIz# z$KBCmh^o%p0Mt^E?7MgM4wCZiur=@MJ;)NjPPnTNBptTxJ$)qU@au$o`b0(2%YA(+ zSz^22*FPpp{Qlv-o=rOJ1rPM4q{D9&9_VXHhkfEN{WH?d%KQT8Ytms4d8qFr-JeNc z105k9_LoQcY0}}Frbqe((qZp;tml#L_S_9Xw@HV6>52Y`bUJ*C|3rU9I_z0bbpgL~ zk7IJ9Fssv3-9b{m9rm+ldKuE;HxryJvlZnQoZXBg9nqQedYEg*8OdMU1mv5Lqo`dVC3<4dA>eeT9tjFUuKm#1;| z#zmswp6}xvj5|ba+dhqRG+q+@(BpkvF$2C*!5+d|_OowV+$c}9r>}j}5=KoT&#q77 zN*caIj$6t#EoCewdYoCVX&GamNq6JQ8COiI+_b#$fXHED&8E)ATcV;V^_#jFF0khZ zb1#|_(6pivMl@(kY|~1{B$E=GRx{QR)lBK#w7PNGq@hh~7>2IA^vRsmw5CzQq;qi} z8P!di-t;4*DN%>C1x-DS&P0KsuF+VMNnF*T9HV zBx~zsbRk{Z{3lJlj6OsQ=f43ON>p=Fk@$wjSR(&P{fjp=k`+lWjf@P^JxWe?Xk^SK zdXrp|H8K_x-CpY$-`H3|^muJqpp8UbU{6~U<4dB!u&1qw@h#CYtE;cK@jcNws|U~t zBHUl+W1Jzv{dGRZC8Fk=D#!a8*NJ*;x*6_k+?SMZhj#*g#xv4oXH}2)GvJ4uphv3p z5PzeNBz1-R8!aR)Vz1ZMj`ufKDV^*g0mddG>>&ZhHX@9Cps||>BOhoSB*GR8GENd< ziv=0K5@AaR8<&Z&rGt%pqGGeW;zNuFL{(-506izdo)v1mC&Hc;YFI3)XJKy*GfEO+ zZw)hCh_JVY8*W6{Tf>doie%eH7(t{9=#cCXVOWVGI+SD)Ml&MpJ&{Ht5%!))qZ?7^ z?5KFF(T}L*>}Ej2iLhry8RLntXGIyQMBmSA7awiRBsw#%3($N?s{LY&C8Wdli!oM9 zQtcOOY*sp1hgjn*Ssq=O>=0{QB09UUB#Sj}5aAs}oN=EB?;zrgzlrb{x|$mAi0~J> zni@snuOi?K%X%d{#2Y1u9D0>x@rEg5gSZqEnJXf>Dd8%evn2%?vN1!RrP9 z`74s8Zf<~k_y@mgU1eB&b0gB!jf-z#+@y5)<#Q|JFCx58Ze=_t!dbhO@tz3h=~hNj zdsS+j@md)ri2ho6$fuQ2o=EwuN`zliw=z74Fo)Jg10uW=Z*BMyVGeDKFe1DYXk)|? zVSa6mR*Gc(+M4wnUp_Uyt&M z8PIy71%p=uZ6)%LSQg*O*hLf@u^Q;0A}GtI_|AqM{Owa{O`xyiyBHry%I8?Ju0|83 zgLUs^@!gCdBJ|SDh$6zcbT{y?U1OiXxO6w#DU!AAVb-=*`5)qY7~RM+%6cNcr_qn7 zt@UT1;Y9eIcQ0c+5q{_0%Sa`{?~;2PGl}rK@WR{Jw$ky*Uvaagl*g3I7NhQ+ut}xgm-xZj6aC*E^mNwlL+H7(D;i8 z<1)~A@&DL+6Zoi#tna_7ZrAOQ1peSp?ikG$LIgf^Stl-`MmnM zzwbG9>Q>dQTet2)=U(yX3UG>5nXb?13UG>TBHniV8+(OqF5d2zcf&hGJo+2yskWnd z^f%H|?UCZqRo+GRc=6~e?;?xW;_+Uge}9-}i^ZeA7oBEH#G}8-zSs^IkNzh6Vtbx= zbX7UsP85%>DyQ3N;?duLUt(vAM}Gr;iH(X!e*-?lUM(K|4fqUuqj+>Y%(QoiM^~IP z?LE%p@p7qsV88dyz)S7Rl9R^#EW2fY>_d31vKq(k?t!!I@$7w~X`Ibz9Ccar8~M5W zJ^HO}(xYG3?)UJF`n2?3zNM z*MUio-o26Z=xrNGkKVVv-$PH>lB72l-qnq@+iUQ=b;*8j$Dx;G&IR*%|R_NwrXsB5s^3icZG-S=ztN2^*>eGR%{Ku35@*>l&ekJ;AjRjEy0 zxqi$RN={nuG5gt}$@LzyKZr-MwKk_iGPc$hh)1!~T9%Jc>PGH+M|Np0L}+ zqu7(S;>cv|Njr}{*UqQx73@{1Io{1BPua&(Vo%$35*r=p)AMP&g*~_J&)Dj2$ugg@ zwc=5I>+GDPlCgF6O7>iR>+N;yRjG#p<$AqcAvtNi_4b(Klk2UwVeu&TtX+-oc{TR+ zvv$3B6noAVo|ue1XM2f9vFGiAlajILZH;&oi`x}Fld-s6D;~w_?Y7gBv3k2xJc_+w zXNHrp7i_h76x(3mDN4pR*w4hH*hc%=8Ohj2`-6BCd(pP-n~c3^yNE}zKiN6`lCeM8 ztHq<(OEx+n8GFgzARfhDw&9Xw>}5MxJc@0y6@!woO?H8J6nn+qes(hUid`ul#a^{D zha_XK+G_DAw%O(kPsTRe0`VyJnr%BG8GFqh&Yl|+f3`=lSEafKmY(uwTP!(gz1QtY zqm%2sZu^Nxu`PDr*ko*rO~>DKy6Z^%t%+^HUX>ah=+<+qJv=4$7kkwH*aSd z?Nj5D+wiu1Sv=alckH%EGWL$$DIUe%wO^JcWA9pZzVj&dp3N*z#@@4dArv1u6no!x z8J~>3Z%-1BV%u$WLNd19-XI>uKCqi7CSxDi_twO^*hKD0li z#6GmmFQ8J~dI{T(J-1%Mo|+PCuzgZu4R&Tq>?6BCVh;rt_V~zNpAy?)Z<849_Z{}Z zl-N$YR$_NzPTpz1|A*MG``3G;=T6&lQnH;N+xG0ySbC%9$M)!y*eABf{@BMoKd}SY zb7zuI?TD0|pW1Pf^BfZ^`P5z{-m~`plF#hIl=XJm#VPCUvbB=)3jJ`&F8g9i&cE5M zDLMaU-`$^cZOPy4XY9Fgw%hi)FuDJB+kxWIzTIPUDw451wm>|JeQx)q#6Gu~Q(aDq z{oU@lD7oI>?LP4+_Jv)4aWeLW-7Fr(zO;L$Cu3jQ|6s2Q=i7B9U)d&?P|W?E+t;== zd#*pfwjJ4XqvvaT1bbDglX;=!YulYYx3zoiF*B1j?6qO>sP=Dd+gZujx3-IT6#LG8 zIXfBq&i=xltM7Z8Hiu$Ws!!nNlJ9K~_9*sB$q%-ay<62;;rB{@vMa@VXV`lsKihrm zxt9HE_svb#@T<+7=RB%i`CS$yW6D2CJc?<*cwsW8{ZjELX8g!y$(Zpk7LQ_{zqv9Q z^Zf1NQ7qu!UX_dm{FUNS%=#6Jk}>PgW6$je-@lSQ*Dt<*9eY*E>YXLN|G0QjyR#(d zznGFU&3{c|bnZ{{6aNtVOk%&_*i7^HvFG|M&5vE3Y)hK|hv z?r*s+8B6yQ;!!Na-+6s9mf`Oek7Akr_8XG1On;Af6wC5g-js}G`A@LtdZMZS9D7yj zg23*QrvBS0v26cCi7gK7Ey?zONQt$;M^vdyw_Xds9eb{?bNo*1xf*i(Zj$pkwYMb4 zKQSfN+CNQVPY3#*(b^x85^Lj+lh|9fT(|Kr5pPyHd5gr$!(M6Q-_D-v`8IxAT!A-U zb+z%kh(|rq*6(s>GS=2VNj!?R^J|tSW9|H<;!*4n|I53Qu|s@yxAQ30-mh7fjJ5aw zz@FRoT>l>Ss#F3aB-h_2IcdFI|Cr^;^>Y2NcoaL-UwdydcBsEmJc=FWCsrn7hxuQM zN3jn6%+<+Q2ftc8iiP~A9!bVR{>$P~EYHtUL3&o>YM?d?CWUQkf5|3i}e(saW zSiWB<9>og$Jx?WL1^zzqDAvi(eI^;}yoj<{fKxJ>+G*wpNw_(pJ31R zbr=6R_UMe)pRka zSv-mr`ZMFnSfO7n9>u!(-8Up--TY$lD0Y;8(u>L1QGP%1D0Z~p>*ZwZXn&x16g$S> z@=7vxjGqvXV#oUHHz#Aq`kTe0*m3^m*OD=O{8(uynM{qH)^}R-;RIJ#*mp9=O)IHzmtY-JO;Grjb0OMk)$AK^si8_{C>2y5H0@uM@M;Csc-?KJZfv`4zjG;- z=~6DdBWX`cv1j}tnND_N3H!J`Zrx!#u4Y3$9$f)7lSl7?TXFTdRD#pgZGVEd{pd?+ zyJ(B>x6jxX|6gp2J3^^OPmMd1N^{%d)NP~NkEuE7XbPws`cnQocrDj*Hi!nkBZ;{9SiFttcDV5OJW3-nWZ94jl`kMDzpqNYIG?yRs%RQCR>$EZ*1p*>)y<>t}7>Xi&E3wImqQ9+mkc( zKd1a-?a7=j-Ky^8$+pou<~*4JTsf4Yl^feMZ#T~Qsk6i`%m7BUUPU<%Hr{@FFaOU* zv$KtA$Me9bLDXh<#WM3;O8*FR(eIld{=IEJ@MtSHdox?w%U& z1%6Nd)Y6VCqgq_bmwZp*QjRO5d%)+mi z!kZB)VaX-Q8eP4VV${vc=-jmYUOLTf1fPnf7 z-`^d0W#wAp_U}H<@9L#%MZA9lePVdDc#5Kdf4G%&xE-x9bGV z?SX&W*0tqY+{kx#bDePysMVA^Nw2z{>iv#W-2K94PIvc%udsa>t_Iz9;YrU*TFcG+ z?mp3-5mIe;kLl7~`ObD*>S~!6qjFq|tE(qpt+|v-CsXu8K8l}VJ#a+*>y*YZ?4GMQ zrBSWb4;WoWB`^Z8XA4|8F0qj*tWQ`@u%Y@87crjyl&% z8~M8T_vky*Xpj7!oGwpG?l-r;+`OGkG3x(J+nuvqo872OJr>+{xqUtGY8o5IVz$9i z$#&`(_-)&5`)}v@?~C^6MElW||L?N@ZyEE+QKyv~|EVMM_mAy^9XrX3Hr_jj1s2|O)&Q4XzPf^l&d>*0i zy=(RMI4YlPkD~!~@6GfC(p>?j=Am^xjs_%}dPMBur;Dlsm6@9EO8DtFYe~)j+qSEP zu0~v&asQRF6$iG^YD9xbA^D-Lu?-wVcifjaNIVw!89~ zi+>&XSJBj*zvtg03i#aTw%6I4`5NrNE4S2krq+^b|NgeoJk!|z)Tf1X#%#Q%r9Q;( z`gkO}-g}O(dEAli>cY=P_m|^RoTlb+XJnV|uBM!w`Xt|t?alnG-d%~gJile*w~C{w zcK3YyoqNc3PfPwMZ2US3H9Bp)wsiHnmOI-$Z+EtPHsYQECQ}+qNX<$6v@xAVTBDts zo@%?ZhAY!O8$7UlSG)UHykxZTY2iPoG(Ii-*XfN<3lEICr--RzHT4enwAHjN?s-e{ zDZNqd>N<5TXQ!^~{(Z1(YnmtNU)(&EJtjLlpmv9{v#nZj4wZ~QA>FU3Os6 z5-ZFoGX>MfFd}w5zIdEM!o^R_&d6M&UK)HW8 zP0gP==G|JU(F0RbqyK%jJDVKXHaCAd{pY*L|Lm#G4Ln=AHoK?#^xUBFOqXh>o}pY_ zse9bn&td!<)#WleC(_va$LArbrKQ>jmh8^3soS*^cgl^eqJ7u+tWWV>q*FTox@$sD zxxS({G(HETo@smz=6Z>~{HN6=e0TX8wDBpyM83xOY5+xlTj_k-_*;VC&iUULtvc+V z+v$!4H%bpw7ybS1asQHapmxYfZhLAiuKZhghCEPzPrW(Zt5m*G&4&E**0~bg9;c^~ zm?yDkJ>{My(!cdIu9a&4o_bv#*PjRW>cL8&mKZgT?_7S5-3%k`KO0vEtLwj-?)F8h z{#Qx}s5CF2Dpb14#**fx!)~E6v7}*Hs5)Wks>Y}z!9py@t76q%^}~{hB@N3$b%GkG zPE>={Nvc$xtVXI{DxywPkfj48RRa?AU z;NJrKR<+H$6}%10?MS;FT!t?e)#1xME7T-&KfWgP0QeyIq}pQEscohn+g6Wlt4H1q zczgZ^_#5DFfWK9Ry?0cp_pTc0eV_(=2`r!D{jr~`mEISKf2lTlUt{?O_P1ERQ=7f- zz@OAz>Srv!VEGk`(swD1C4j|Z31UgZ(gaI7mJBSJShBD*#nKE*HkRgCT3~63B?n6@ zEUmG$!O|AXAz0dD>4+sCO97TnSPsY18A}%|Ct~S=XUv7C(M6fC{;LUkH=I+ie& z-dKvU^uf{>%b8gEVd;;h1j`^SXJZ+RWeAp`SVmzv7t3fYW3Y_HG7d`wOBt5)v6N#O zk7WXuiC8YcG6~CMEEi(A2+K4q7h{=@5 zQiiW7{D>oRYrl}5?%jRc2{^W>_IA8QO?1Yp-nvZJ4mumU8osuy$|o1qzlyYVJp>*-ct)Vp|stREzoC%y`yjR)-7w$)m-l`b=W9n zYS^yf+H1MqT18*$s#Ww=uv-3B*HTqGsLU+Imvn~frK;!X=}4!qZ`I;Gf?BQMwN|sP zWnIs@5xPa~QadUhGON|&OFlJa-Z}SuV>WYin`(Wi{5JF-xy)Va zkh)RcPR_ZO*WJVU_j3N7oPRIpU%~bYUTYt>b04>JAGdQYZ}nR4fz@oUW_y=2L38YK!%zRTxWp`LI&2ySAZx+Y4j+ZserBFp$d} z$Yl=XGD|t7lv7GMrMq5#ZN4q@R@^rl8d^2l(%747E6{rwXK!4dc)m_pq(a{fJKY=ne1Fz4LEs znMV8i)U-lFTQ}W1rMxn&JKMcji=lY3&vq%>V^|mSml~&gov!_JT31~-;Jvg8v+Ts( z&^Kp(nKl!7eu16c+csHXXmnMZyQg<;Qf-c^ISzX3{ii_FhlCNOV`_n+Q8&}9uFJPG z&0|wan#?pM_!3Bkp|3917}{&KhW1*mp?y?i=;&LluE)0(Yq&i%hDJ+``6%*0ldgKx zgO4Dc_Gyi|kf z=DN0F+h0uIhHZZX`uzFZp|tIrxec4S4I9nOVPB%eQ;DC;Rgj?csX+L+52Q3D8$Mn+FySZ_ojc_F$$* zdoa`6c)_ZSOnhzR6xg&anI3IRz@z;b@Mu3$FTIpehH~D@cvR7Q2Od@QzJbX|`IgmW zPKTYDIoVt`IR|>(J=FgcP&7VU8mrZMhZ!S=@nxjJkr$(~Xkier?O~Sgj zESUzq3}3jTt&OjtwGM6 zO{aVJ-u5}{yI1`TrLRoYcytU-_nv*QX)}uEG@I-Fvb+;?^^zl+ZSt-gesZ&1HLKrQ z%`&lFQ&cW%4r>AHK26sZwH{qd)Ouv^!&sey>qjcNm`D3k?j^crSkr8UN2Qf=`WV*L z99_%l#fG9ensf}?0j?#}P{}!>R9CKXO6k+RO=y2D%9)~O@)@L+ly#q` zwf5o6wNhnr37LGv<+2uVN&(wBtTcWuX@P3(g-lBan`@&C4=d4&j+{l3|*{>i#bAEtFRCg|?JD1a)%jv}_y*Q;8r%=l`=d8u{YE>NA+HZHgkvopM_B_pTaoNGq++ntDo;QqDPsbv$bYYtI1nWHIlfnOwq5q=)nZwimGd6?*Tj z4AR-H=*;qPt7>jlHMgpoTUEm;HJnnzDYcwZ%PF;-GDM$0#k5{!j_Z@wdWilzj(VEs z@mE7Cb5zsTWo8||@b)OaD$=$!UA^~dy-VGlJ|~7QESdb%54d9k{0s*YknlCBL@5F>uH#{Ob|t zST7lz`y!b=tP*iyBoZVGIAd&p{DcP+2Gp4VN^Ypv${l(mYkd{(or zP@DU$ZoiT9Z|3~lIR7@zzunTjvC~rT?X+~QwU67dk89k=HSXgY1H2ytnpzUTzQg$E zeYb~8-peKL0o{>p)vv=Y;1UYBgaR%h;L~2n^l2~T__TKlxr7{_ z_ED~;Z7Jln3VE$UUTYxd8OZ4aIej3fmvVY3rR;c4ZsUU^udPy4PrYcJMf)`6_0tYdgv#&Zc3TtWqx zFq5MTSgTD#TGvp8i5vW-5FfL1Rg24y3RRo!={-U-`TDTh?6SQ=3k;2i1%~>3fuTNM zU}*2J;Pe%ozJk+NaQZf^m6NxbqnkOpnWLLI+D@-O}9hXS&y@@o6@z@#z|` z#;0q%8h?6|uAv&A=DHexNoLnjE$3g#+qHtXYc+3Ijlav@o>$}3Jh_^;ahG~>@>6+} z%~|1BpzjPLef!=Y^49t^!%sG^-P^3=dbXeTCLWUCaU++xnakY9W#)Laz1z679FMj- z$D^&z@o1|jn-_1Z?zmk_d*-%f9e3_8ZB56?=8W)n9rtj`UM_hbmmCQ4@gAhHgf*#*yYlsw_RenGw^NR$JDpO#-^pZ~?!~Sz$P7@A6<`$M8kNf_ z=5hvdIRm*Ijr*hePMHDf&&&YzXJ&x*)FQoeBcU)nG=ecb0g>3 z%z3tPo^70`JGZ<$x4ApFxjVPH7pM2)^j@6ai_>?huQ4xe57G>QOTo+GNc-fFJ5n(M9MJO#XN zA+Ot=*X_=0)o}hA&R@g%YdL={r`K|NEvFkbS=DwkYAQ5MU9EBo)9{qK9rOlu7_?U9 zLvL4Ipi5OZXiOakU7>nFSE^pn)vBn_;5jgrlLbw~b5JU0rtS-!qX$5voKnpxS940S zp*;Oe-$Hyk)Ef+qdBdP9ymOG=HbBwbz$j=aa2~V^rxXULRmTL%q1^+MpeF^Wg}nk( zq2a(K(Bi;sXuklpd0=1xba0>&S{k?#Ix=t#bWDJ@B@(y+IzB*KF)2_4tq9x#y*Tg( z=*++}=$ya`=z_p1Xf?Ot>Huw5O@OxRhQPzn+Q4Jb+XGKQV;o(<(Ulxs&Cy3Vx;F4E z@;nuI0lGf$5;Pvz4BZ&m3Vk{77Ibsqedv}z0=g~mG4!3l-=GPueJ7Xp8TZ2;?uReA zANF!T{J>kikGEIZFR)g??uDk=AEBA{7ihMnZO^eD_EcM&2FZ|drlPvXE zg{2<5*wVJow6yJWEN%4ydnDG1+GC*A_5|qF_GD;{Jso<3Er!-w8V|Qy8V^ftf273h zAm|D^47$>egs!$@p^w<}p=<30(5Gw#biJJpjoVq!jdnitWgCTVwu_+KxV7(C8u{BT zjj@EKakbOZDEf?hY>%ap|0Va&UhbKFyq5CmSV;3}doz71A={@Ca(pTQ@3(;F`qbwk zpGqk3xrhCt!WMWd0j+fmYj>2>LiJ?37u2Xz{aewtuupwh>{IUzwiFXq~3`n2EYaP14Y_NY($uG**lb+u3X>jo~Tmdm-F%UR0htl;#OKJA^= zobm{lyp~ITic4P4CEwnJwqf0?NnhCCvfVbF^5>@0 z)`ik(>k86o-I1I=hSRsP{Z2a7zCE4yOFHkDblxxNv|W4BsaLZzsI;66Dy?k>m6n@9 z`9m3$zaWG1cgdjqg&CCpm<-wr-7}~kPRgKu=#@eJFqq3J&7l1_l1muFB}BM{@foxq zCvgcCT*Ac}MTJ(CWYV5WWKtV;X41BQmPxhm$t;I{nK=o%H69jDSS+u>6WKo;fW>IUO%A(e;&!X1G zv#7Njv!+5{&bkD;Ig94iEm_q5ZCMMT?_|+dY|pw9n&7S2$!-3O+qs8Z_$9Y(FSqRn zZreU?n`%mJ3p8C-*hJ+tU4oXhZF)WQ&1R2bgfujxRt;%MBWF14DAuu1oMm$8T+@^F zRA>t|B!_a2Vx7!-DeGL;g;1j^b8bb>MVxXYG*2ltMfEK_3d|6;R1XayzrA{bnXlet z9;yDyJYE$JrT8hTC$qQe%N(GFGKWcgw6I)VITSy$;(E%2mBKnIaIXFWddtp@kN?}Y`CtMEBP8C8z-yvaG7!j5UqrysIOjsw33+sgmVS`WyTs?Kxv0m69)V@p46BY@}gq1?P z)`I&z3{txz!ZKl0SSgGN>x6M(y)Yqc5aJ)`-ToAYgn7bzkoJ36{32mQ7#Ajl_-AG= zFP`q$AVeXq9$`qBCkzXVgb`s>7!$^Y2_b%Dz~zR7Wx`5fov>cm&=}8h>(vSCg$ZGU zP&Jiy3q!&@VOY2doS|--Qs2zwZxHHi=XV8XsJ~Cq&7GeoEE1LpD}{B!dSQbwzlGZ$ zWgv}*N@1O_Uf9qW$8UuwU!AaCsPXGIO3xFP2`h!mLE7*2;%^YYLHxYdZhiU%?hI8> zQ6zqU_Ajoe7k>l$nNu3X*KMR;VUe&3r1~1f*KH-AFf1$*MucU;sIXF41yXr2@#}6vl*g!nm+r*dPoY;_3?vBf=;+U)2w-6u(Yb zFKiI%_HO+UIA8rVG*A2@VT99r4XYGC#{SL2>co$;|H-g=@i&0HAH>(WQa(6eol=@7 zevzW zCX5Ozg)w2BFfObYCWH+_jlX-LdPCrRRaKfNevz=ZuuNDktQ1xW>x9dN^}-Fp9YPhN zdY&)!K&m%Sm@h06_7;{2%Y~J~Dq#$qud;_P7eCH^+3*eG?+|)Z(+HxN*Dv@ zt2M)yiyvqI`{5hJ-yu{TDc{NGcp`?sHyFMgQ)AJ6G6ez`Ep>3v63i63Ks>4@dx zZxHSfdihemFkcuJ_7+Bj<-(}2O1NCOL6`vNt6d{@h_4FBKX#-C^7gPlcVxc!VfHtS z>@9w|uu8aG7zgL8tWg`pPq063)DH2zPO=|_y@ln%D&cbB2H_5&cet!C>@6%8Rtc92 zHwbqKz0R_}u(z;WxLmkFm=Nv|dR=6FVOSUumJ6f8Dq%HvC(Y~PFBisz8-xkr4k3Py z$@{|-hJ^XTu&}oB8^qrs^a`bXaK0)& zH(&hT!g67iFeY3sj0-mi6T%%r)lK?Om@n)tEEiS@mkT!tcL=?sTsir|-ol8mTo@Hr zHTp->c3pdJjQQNTv1430abf6K@r4Ot*W>8==$(ovNb^BV7(U+lkw$iRepDC}#)S!? zI>F@&3B$sOFe;3J^VQ$ajWf>}onYQETAfJg-;CBE&rj^1Jtj~5FqnaM7KtAbzfAn7 z_?6}MuVS`Ye?AF)9kT6de78VI3!ZKl0SSgGN>x6M(y)Yqc5UNw8eql(M zCkzXVgb`txFeF5mI*6`b;5e#CXo84 zL419>lp`z>mI*6`b;5dKgHVTMePNNXOjs$b6V?kGgt|!97ZwT2gq6ZNVZE?HsLzn~ zg+;>t;0!feIq{VS})8po{Ff1$*Mubser7$Lp3lqYkA+G$0uuK>gRtjUnI$>N` zFH8sgRtjUnI$>Ox5UO)zJB1-(o-iyd6UKybVM3@zxN<_murMNw3M+*%VVy88tQRJP z4MP0ko7*44kT5JP5=MkkVN4hoCWQ1hE54o+hJ_JfR2UP+g$bcLSK1>C3G;+uVMG`e z#)NU98ZGS*hJ_JfR2UQ13FE?gVM5p-#2+iU{t||SdBU);NEi{838TVFVN6&jtQR&2 z)mW)d7!u|Q!@?qAL|7(_3M+*%VVy88tQRJP4MKIE)GrJP^MqkxkuV}G6GnxV!kDm5 z7#G$H6T$|e8YlG&L&7{^SXd;C2xG#yFdtUlX(L5ND-_z~s_!@?qAL|7(_3M+*%VVy88tQRJP4MJVv>dg~|g+;=MuuK>gRtjUn zI$^yqA#4!hM|z6RuUZ%q<_W{Xh%hRQ3Drf?zrwIEB8&;+!h}#wll6pQVN4hoCWPu@ zmp?2l5=Mk&!l*DNj0+RO@N`#BL>Lvugb87TP+j8k&{DnwBOY{$MAf|h)^w{e0$FeF^?D*1~ZU92GV+QVL}+YobsPPPDP3LjSDe% zj|(%qMPeYW7p|0ggi&Ek7zgL8OCstD;vXX+<`s zGpoxsg7kbnw8-Tv0Lc%F9}z}{F>t>6plk(5`Qq&7pPyh>oR8NrAin1O07&s_VH~7( zs%xcv!mu!Qy-SY^@sn7$9XC3Lh2w8_<;FnnZ(%}+AJKApG05$^)A^C5j?qTm?|l5A zmiJ#s7#7AJa`Ct@Ayf~$^pG$vObDZETs$UJk4S!DSQrsTg)w1Vm=NNRd|W>W!@`I# zDvSw3e{}i7!Z?_LeoqM1W3s)%urLO4e+m;qwbrGpC#4<2urMNw3S+{AP(3B`j0y3=7496mV#(($RjkaC5QFP$G1#)RRo6y6?&>s_Jx+WBE& zR2XmczmfdH@LuOfg>fNX1IFcsg;8N#h*yNUxG*Y=3)S}$7e<9~q547M!l+RFDCt7H zg3Q$;j0)pI{7JHl3!{zxFVw%cPmU_h@wgDLFLU{YQDIydGcKMGhCJuv51QS2!l*DV z#Ou&pTo@I`eOW&!abZ*#7veQ)ynZO%F(Ql!6T(o2i^qfsVJK796UKxIVJJ)D!k922 z3^kQ_Bb!M*!h|q{H_Fm@iwI-FgfP_H#jn9c+F#Gmm+NcvjruOVNJP<}j0Q zdYPeSnOSFEGH;kB-ZbxVuiksjd)NEe`wy>kpjV(@V1D3+z|z3uf%-sKdzu|)XW03+ z%3fn{v&(I3ztAuC2m53E`TjNjo&JOVI{#Jweg9Mc8~;~7BiJU`CD=XKJJ>&Xc5ry` z+~9)XwZS#PO~Frt-v##tGt+X@j!i2~t4M3sWOS3un>^EGdy`L_eADFDCK>6W^d9Na z^!w8PmY$z6ETbyp`i%OFqcaC&j>s&}oRzsK^XANDnGa?@nR$HH_^b=FF3Y+#>z=HY zS>IQHki9&6b@t=g&t?B9`^)To z+3C&mnjh8tl;-`K4{yGt`2)>gX#P?2FPeYb{Kw|mExNThwMFk17qpn#;?fpZw79NC zZHv2GJka8$7F%0vZ}D@BZY^iDyrJd2EuU<;xn)DkZ(9D^G9#yDPS2b^IYV;B=1k6+ zmNPf!@|@b7SkCI4c+R$*_i_?BdvdxKcTGHy)R`;}eywxkM zK5X?}t5EB%t!K4PYcsRWt8GqeyQtlt+YLSBwL`u?(xgAdKFtWp}4!3mJ*+GYbp^>3^q1!@lhQ10No;Nh_ zk9p7Ky`ML|W1{2X`Tg^&^H=BpIse3h%L_IZwCfb<^lGQiI-PiU_2KUyp4R!?&ht92 z>-@LQtGc|{<(n>jx=!eNU)Ptr{?fJo5o?dgKeFV=Cvc=csf<#pHsp(XNDCm%LeuaL zzI4?Ff4FdnYNk5i4U&0yXJki}qmEGR)sZS!6{I(3Gs5g z2{DSdAXeh-hgYbxbQRuySdF(IF2b7+uf&@Vufm%Tm#9)*qlW8i)j9e)HBw)%M(LaI zCd8ZZ2E<$NK7?D<1^PC;;qZ36;qVSMRo{s>94?hN8{Un-?Omp3>zJCS>(oNMTwSK` z$KUv_RF!&_x!;Nc{fxR%KZ}o($MN2@dUdPbp#Gr$q?YNIRh@oC z-J@SsEA(sXe*L;ysozi!=xyp@{ia%@-%^k2x7CaK9kofnt6tUbs}J>d^{M_q?b08r zFLgrwpc~XLdI#RQvQwp-PgGO$nQCcvt5#-@>SDf7UCo!O(0rqgGT*8b%y;TU^SwIN z{HRXHAh~58eI4l!GtD5So?n~>?by0GbZ>`N&_9ej1X@@gg6e6cy{;~Rwk@GNnsW}V zJPP*hV^4y1zA_9ws}-&L@lE}pmv^9?J^KxYUYbWG)D{ni_GWwe@N;3i+CRVfJlLsi zaJ2`=T!i#@LZr3l%z_>kqH zH!XuEil|ktMpwcO*HHXRV%+iMqn0ej9> zKSCdx>7Ct}-}T#_yw>uO)WXOl(yMN3f;>C!YPLV;M|V(q?M1DSa@K_Q&|>cSi7EYm z%P`6_l=rD?PwNSk;#v}&k%zTPhjoU!cHVU_^~R{Hx*?_8RXw1tcDHWBa_Ym5+@9`( ziV!_*{F%_o0hInh5sd-Y&#wHo6KD?(C<;T}DEcUe@_4*2Mh&O&^HLc_&p4lS_yv?d zK9Tge^C;^2%JoKWpAytnTRaRJ;xYLGm-g8#s=Z6+=I5Osa%)b+__eQB#*Ke$me zcMzrg{!!$Pn$)r6`o!tKrE8+Ky%+%4CI!X^V8awmR zcgB6Re|wE2y>%7!z_?p4L~Ad&h4k24DP`aw+DGr#T#S^%&%G2HzIZ-#4VUl|kDqyw zN~EN2uiHnxE2xCjG2`YI7oCw3eP%r6JZl2&FISEmU2a6VQQd*ZcJ~!mAhIsoRyFq6`<(M*XlkCu=x&aF`!A#J4CRhx&F87qv)J>Cf5KV^ zo~PXT%bl%UYu!1^o!uJi)q|=18PI>#s^%PR|1YDdGw1V*^ZsR?*Kh93B^(3Im_@Uk zYl*A<`Nbz9z1vm24zg}vUUv}Gtu=+`-uN)u*DDs5BHd|W$+@t<VDBaJsVw|`Pg zcDJ$!qAsO1M-QCa-Td%gAIkqqDa{yltk3ZrGIIF@l;CEJ1J~U>e+r_%oI~q6`@lSX zN6$u{)vFdjn~kFKuUSUABtmPwby?;9^skp(1$zt6T6>|ggI zp0y@UyAdfa`e29K_D5Zc8?gr)tA#h;h5SDrMm_u<&qyB~M(ym-n^L|VSBL1teq`rV z+zKjb`gCVH&TF0yBZIsX^1Q%ChfH++kf)H%V;5^he& zy7nhTPoA%bG@k2&Hw0l<@|DtnqK8pt>QznZT#1?E*wqPW5aFq7c8TXwB`ztFcAZ%@^NSjhybxphGA zDUUm^xo9=d9&Y467`q-hH&)!@^6yty@?(AOM2b82xignL$GNjxYQ1jcxV0M3iF8-u z&TDSuxbuiR-?3dJ{j@C-r2%7cBf%7>nUX9q_0Qk{{0D%7ac zR9D!iLk*q}90|J!YSbBcs-RVGs8N0Kbit@I)v?fi_-chwBh?9rj)LOLWO&Y?@f4y5 z>@j%Wpw(EYQRksHji(Z)z>c6cyg3tU)HKwl)x}VwrlU4|Q3h)8CfnZ71*#8pA!^g= zGN@6P<9UTvQ7GP%g69?*Kk66&8&3{kS3`|jgl8BUKc+Yv_EmU}q4B=3A+Q(YSq8p$ zi{~Up{Xva@E<>xeib0L4L#vIt2kkX#Ia+Ge3bYYlhf?Lx`_u&J{dfvu@HVl@&{cQ} zV({!_D)d2Yhf%As1x7uDf7>(aVRb2Vjhc<}AA#a4VrnkzKSGUq49{i^ejcz8`Z%@; zUzNkw7(5fIfUFzRWv-QZcwV(12Zl>^^!#SH$V-kiAs+D*R*Jxad>Jz8&q9)o8u zMjeZ%FGd}wUxyyAw?ez)IgG)Rr8l7`;u(y=_cz{!o`h#Gc=HaPz+klF84N}{p1@$V z;~5OzSEWCOo~A#Ap00O6!+JN`Qv}6m*Pp}g4K;Yr{}-_PKr!<5SFq27V&v;@VE2a_ zJh%E5_5i5C^Q-TngY=Kkv-M9%9}G2kmi062p-`iS>0e=&LJgj4;Xgdt(%PsI+Jik3 zYVeH9!af&j@Qe#D$;UT6njmE&)ZmF%2JA^tycbVr!M+e`)D+zeb_En~%G1qZUj)Tb zrdz_k7>c7zwn9 zApH%f!50L2!hREq@6hX0V80E;m&x?0u-}Cm^`1T*_WMwyw(BC;A3%-ztL_c^L#R;+ z-3N99)Tod2nXq?2G1_&1*dIeN+Vud~pF%O(bqVZUP>gncHtgL{qxR?_us??y^>;lC z_7_m2@(uPLzM3-}b|*6e_Tf-`bJUE2-34m!TyHe&BcK@JW-RPNC`Py$2m2@}Mz|@1 zeGC-i*_6XR0gCZ#Ccy3i#dtOs!0rjfcs7$^p8~~rHdA1q3dMLfQ(>PD#dtQ;U>8A+ z>TRY&i_HwA^nqd|n@gc*n%PL{2gUdE%v{)KK{1BSeCQyv5GiLvjT&q&hYm57NEr&n z7&cX~OQ9IUW)bXjpcupED%c~TI2V}3(9z}^=ooV?bga1^dY-uvI?mh-jhI`YW#%^M z`Q{F2xw#WM-rNP9V3t8AnL6lXvmAP%xfgnoxgWJmgBpBYXcg?~P@^s}55k@S#Tmpr z1p88`QM1e%*t4NV%`uO{o(nZo7eS4>(mW6QDyUJ{n0nYXP@}Fj8(?1t#c^a_gna|ls2j~ouy2CmXfm5% z-w8GN?!&9F?}8e2w|NcrGAPbX=5^TjKyk#Gt*}=>am1N7VBZJD5og|ny%LI}%)AYI zH5BI~^DgX%p*SCz_hCN*#rep50Q-+noP*4Vu%Ce99Ap|`KLy1($n1dq4AiJ~=406F zp+-GxK85`p6knAyyI{wmM%A0$uwQ`UoMk?Ty%B2Ei{=a1e}dwiWxj&_G8E@5^9}4* zphmrFzJ=}!guMldxx)Me`!7(Oxy;Y7w?U11)BFniEhuIQqw(*e z??N$47!UUQP|Om>!u|k?S;7Qie+b1aVVb~hfMS*~8L)RiF-w>%*dIeNGni(ucR?{T znC7r|LoqX$maspEVrDR{V1EI{`O&n2{T0-xuT4AH-$0GpYudy97K-zuITZHyP<-d! zbb$RM6yKCJd9Z(i;=GA}ht%p9s8PR~POz2N3AX2Th8=+7YSZfq+lLwz^p1p`2E}_$ zy>776p}2^RjmW?DkMxH+nr_9||?9gVz&w2x?TG zcM9x|P|SYbsjv&6nDM;RVRwOI#`B6`9|6VL-0Kay8x&`AuMg~_p*Wj+XTm-finF=b zANKK3%zoYg*e5_S`*|g>dq6S!d1u4!3B`=(4S{_s6f>ST4EE_zgRh4Thg}548QdEI zyEhc`o;M11A1LNMZ#3*Pp*VwkV`2A);tcMMgFOI>+0QG3JqU_3xK|E)Fch<&Hv#rg zC}uqG0@&w3G2?lYVUL7j#`C7Y9u38e=S_t@7K$0qn+AIv6tkQ+9d)- z>E5NVCqXgSd9z_(2*o+wn+vV*<|Ab)6f>T;5cYH^W<2k5*fXH`cB5AbdluBF*q2kcs?QMY+_!oD4fD+li`=u&SPH0ISo z@AZ~LS9|v&&qGjLKYRDXUIR7ww%jV{OWuRf*S&|JTf8;Ut=^;1_q@lD^L;3;V7IUMc@nQ z)WBEJivr(37Y4pX`IkYle*@n`qk$ixivvF)eF@a4y8=JMz8i`=pun%NV^GYB0qq&J zBjDlpBs-zF&$SlX%LbuSZ4>B4HUm1%W}#MHT{aK)wNQ*Gn-9Ioc7on%J45fXT@k$- ziuT(hVaK3G-DA5!m)oPEE9|jIzZZ&oH+wwn`=PkEvM0cP8fw%twg>EWP>eC#6ZW%E zqn@*;K%cj#A|(#RKf(H^!`4vriC+ZUgBq3L_l7q0`#_udXF{|6{)je*V%GHsz-|e} ztm~J+ZUx1R>Yokm=nsMB`@^7J{Nadpg<^#GBVZp1#R&07!R`jd{OON|eKZvJLH=0i zasD{y@qQV!yI&4H!Jhy<(Z2xN!=DU2$)5u4=}(28>`#N9;!lV6@@GI#^)H2<=Ff(n z?$3pW{rS)$e{0Gq<=l^v!S?>^lyYc1d3}&|7O^wP|T?QEwIml;(3C98|+a~%&7hyut!5NqxyHk z9t*{c>fZ%>92D1({xaBQP|U7=9qe)_W>j1Bxq5|1sE?LUD!ZKMs2~6vu-9B<#6R zTw(f8!=4Yt6{f!q_ChGGF#Ts?Uk=5%^`D2m9Ex%4*TcRSigD|2fPFs{&m8<0VXuPX znS=il><6KkGyP4lAA(}e^k0R&25QtJ{%f!wh2m+0|2pioP+aNxTVX!|#j)VO0sCnv zjs^cs*z2G;7W}tiKMTdN;J*v|d8kow|9#l?P&}9LKY+afisuskhp=CS;)>31fc**- zS9Jak*qfoaqVqq7{bwlVaQ{=-TcDW3{avvC0>u@bzZ>>8D6Z)I&tbm>HR^5u3)t^K zG28oJ!G0f#D?0xh*dIVKclqDK{t${QI{$mv4NzRs`9H$m0mT)a{}b$wp}3;+e}=sa ziYq$*SJ=CuxT5nlel7Po6jyY<2m1>s&Lh5s{S_4F5kCm~8z`P{_)VZc_!-b2{VeEz z_|2d{`OTsG{Fcz4{Z`2T3lvvzejC^-*ao%^wu5b;xS|WThX#X(LeqjBpiP2#(DYzF z@?=19#tC+Uodq?jd9X9=7Eq&F2D`$}fg05&cqHt$P@~!fyTLvLisvoCqhaSljXE@V zEbPOen2UnP!wx}lwhEpAyCW3yQm_Z?0x0fngFRs%4#kyT@D$ixpg5xiPlbI16!*5l z(_t4vac>(ef_)Se_qM^_u#bUa)(ZB4eH;|CR`5*N-JzJZg8gBi2*s=w902Sw5bE9RmAjl?(e9br|elR0#I3 zsw3=QRRL_J4~MOE7uZ@K0bA=r*a3Ya?0`NAw$&%Ywz?PWpgse3P#42a(|uv5>3*=A z=(Auq(F0+p>p`&7^p94EnkA$72&xM_($G~o?&x74mM_@P8=fiHM z$HUIn6JclTNwAyi3t>0c6|h_Ai(t3V7sJNyz+ku3GhyRPX0UVg9N4Y&JlL)D0@$tf zWw2Z8DC{=+3fOIQHSD(fO4x1n)vyoI*TFtS-vGP4z6o}FT?@OTei(K~{Rr%Q{YTjO zdM#{xl?Qf#ehPLc{S53*dOhsJ^>eTf*KydL^$V~&>y5Cx=s&^kqF;u6qV}`%plR9p zs)tU8-9zJdk9daI6!u9v8+K3K0(MWG1N&s%8urP$E$mbDA+S%;xv)>uU0|Q4kAQu; zE`)u$J_>eN9|JqAkAvM?p9Z_P4#O_iXTUDj#jyM6zOeh~ez5!Mvtakt17V-32f;p5 z4~E@O4~5-Nm%{F^&w<@vkAz*KFN9s9D_{@O7r`E+FNS@#z6AE!dM50_dKT=#dJgO% zdLHZ{dI9XA`ZCxpVD1!nX=YYF|#2yiU+a%bjBy4Gm!aDOCZ<7DoPCc$f*;1{rQg4c3_vvPvHBxVyF zGtXkS=Ea66yD6UPb!-nZHJQEb}JPW0~(EUCO+L zbSd*sNRMZJfb@9gUy!~Jj@mNZo4T(=JhTPra;6RGN~QzpN@f<))yy2EtC=pOYnk~- z*D_h8SKw^rFyj3u5yPLtuE8^i$o~=I<<}zO`L4`cnT1U^Hr?Iyfu^aZk2Zax>9b8M zo7Xr0yXK#1{zUU%Ns4Nt(Uak*t)It8?7(3zTWy~Yiry4 z+sbYAwvV-artMeTzSj25wp-c{xBtiXUuyrm_NIiBBM3mt#l@mC$+?O4*etaGgMMCXg0-Lu{^>&{uzvpzoSsaao{_13Hvvu~L_ zGP^wcle0fFd&8XKoWGpYG&ehU+uYrA56!L3eQ542T|2r4y5857@A{LjpPBcI^S(Ln z&*%O9yvgp*bbq<~PrBQ)mt=dh*Jgh!+q~f83%;`8_ZR%_f~59FFLpAJBz+_(Tf-T`9*6k-hA<{iwhTzUi@EB-Z|6N+@IoUJO)3kKf(gjN|zwFw}UbyU=m;Lw4{_3*VFZ=Fg zU%33&FaPb!-?;p(%Wq#cx~#gazU;we4=-!FV(}IISM0yy$F6wzieI|ohgY;+Ip@j+ zSN`*r%~#F2>hG`m{#8v^fAZ?jT>Z;ecU^PQHJ4v==$eshj$iY|YrcHV^Vi&X?aj-# zEkCflviyPNQ_DZH{Gk<(toYQ5W!J5^ZtZm+xNh>gk6iZ;*ZuIij_X?{5SGCy-g&q% zw+H3x4}ChoUZDH0c>Rwr;!_lMb3O^X2`4>+;GeKd_|Mp#`vI;W;`$d{|B5TfT#fnQ z>Yxc%b7lqRgX=I4TpzS$R$>lV3ERICHh(2-{Yu#Qm9XtAVbfQ_mal{jUkTg23O0Kc zZ1pPG=vA=It6-B?!4|KB4PFP^yDnIgSr5Cr9`<%U_GdN(OEVjT%QCkFmuEHyy_wsB zWtn%w{@xC|dpqpy?Xa`A!@k}Q&F_Of?F&}mx(?U%xK`r2A+rTLIa`Apajnkmz#h&{ z?BHPM5GR4x;}q})oB+NFr+sh6N#BjQHsQJj*Sm0S&U^%WH6MXZeF(PnVc5`zu}AYU z?9luyZ0OIzcK$4ECeHff+L?J2w((Ke#7D6s^C;0MMu^01A?8N*H_F?{xb_n+8d$2p-gT474?9BIIU%m&s@;%s- z8>uwtt0j-|cX8%h_wx4=^V?&7N1HVNfhNtLX!<8;8BSj|ef*RBEw=0LbL|TM%#4_AR?{F8dx_r*KW<`UI|D#PvF^6-}QCjx|*fxve1T`b9(*zlM0!*MeVZt^{Ak z^?%{|16+UJ{D+8{{0-t1m0(ND_Yp~`1Rrnt*Wf?n_scDpW;V7i%j{{rHglwP1+EHK z?G>!kzZiVG^=rZ0whGp&U&LDUYglVmuuiOCrB{K6UV*1wf!|ySTH7n|X)EweEASkT zWj@^gwP0~aA@~5UM{xZjt}k_bDYLZ`WpI5TSL>|5$Xqh35?nLuYr)!C|BzWbYi`pk zvo3DR&aMO>p1r^6H)emZ>9#qQU_Y*V=1ez@-q*%LZIev>%N6W7v9b1k>yI)v*Rxc>CgF9xq(`v11f@A=1;bv?P3%{{HH zAI9|wq@Tm}&7MnJdzN0>dfn1o%bumzwvH{mvGqS7{d-H_-MS^nwcL0a%HSHq^+8;p z#`W8{7F?cdS%YgYuH(2K!u0~KKf1gU{O#qH)*ZdMmZP}t!}Zg>A8h?CTrVR1S}&qV z%W^IK%POs(S@z}DtyetPI()?+w*LMVxt2e^;>)dzJ8~_TT=|{WTd#z?@OuWozm03r zRk@ZMa2>_<8C+k!>N~Boug!gbfxE7~5$^+lxr{OU8aJFeNH zKYz`Nwr^aMYx&1(j<(-?ZKZWHuKsJm8?GmC{Ti;nz;*BPT+7emI(&deFX}yR5Ca@Yjkmow#P>;~(+*6vjsO<%f?Isv#=D2gfS4p~`T%IOK@0 z2Yg>`XtY>4+E?9Es#N!m4HsDJO{;^Q<@{K+FtWciusRs14G*LCJ^A~K$7{z0wE4D8 zWG)8^Tg!!fwXk)xSQx8%wHzo^YNOTLhAi4`!@1nHVr6_Ze`@P!zEaV`B(qk?^rO1+ zSbp?irBL2lC|8Szi^HIMXMVIelCPrWTl1r%LueRDYLPfep%VwLSwkihPyw z4OGj;u_MB+K(tkR?yFV@3gr`pveYU$!ZHi38m^WUo?64YH0Xv@Xex01dLaNFC2?22 zXnGXw*Q}UCL;N)xSTfQkfh2^G3SE~9U7reFa}#SKYkS9xUV%FSCMvr*O&;r0p=&l0 zcWY^EtT5~vy;h(Jx|@g#%^HrQOGX@BfeQ4V?hR=fNFLmL=4*+R6bhB zj~yJ>X41y21<+W#xVb{kVEGh#=RJkOc;6@tqLI0g3W{$4lI?-&?m}LTS7`EXTH{%; zHAxGG(#G^4Wqaj9O^+#zVTM#}m@#i7%t}&ynNyP-(YvvcxUJu?`d;8fq_+l;9ksDx z{0!zR$F`P^k7F)?dJL3m<>3OryNhGT3M0FVmFgX(5d!Y0jgIDrMw#s2K2|$kD4QoJ z(c$8eTDdSnQhg^eXid&Oz{J?1j7V^QtxzL@Eu*F3V=#;M86<{lCLiK2AWJ|3$I#MX3?Di8NyemI8GAfU>y+$+0tH5lFV0ckr zSH5y|pipJ~9J0dGw!(d6Ue%g8<#HaXbmTZ_9yZ^0b1rwXoF7M0>yMAd zP_Ndk#R$kBF1R5rv$TQUQNpx^>5WsN8M6grVW{!IvMOumcfg>1>yQJDj|>M-)k&SR zIxcjE$|Ra?$Zo$sKU^I>#c4d`_@=eqNLZU32_P;K8%bKY+ctpdVDm_5TL({#7Yy*Y z8o|nrQh6YM!a{51qRFpR;T9Y>57pxFLaA0AEFCM18PKpVBxs8PA1>Zs7}-_GLn91i zsCM{p_%N=Hjp~Cz7%QCY8_ADDK@0#DSKuySI8+RzK+WnaAFx2}6RWP6mRZ~Uj@Zn1M5Y}fbvdTVRs~!dKGCCs}Wp%F< z%e2RkEz*H+jw*Nt&UBq?lRq6;3{(lCD{o92$ge9W7M~eWRm>SLlh; zd**W}`h(65OMlz}5u*#U6unrn5-G~=2(OLcn?V`(sW$*gZG}Zhj-Rl3H?0fy>>nH) zD^youyd2M0(Lt;31chcd@0gMa-94d{R z+FcksQax&mRz~5(nn4Fr=xw@BW^4g)9R7F_UW^VD0IH?&;_!~*s2MtdjLK|c#s!`e zY7Ll<+`9@x1EDShS}q(fRSVl;rAp90!xHsro$3=%tSTTGs)FZbgwk5GKH0IM%8U$> z=@54V=T9~mO840frww!Rz)aXu`O|3n@3GidqY1vmO z7faG#faVhpB!z^G6C7kFUGe)6d2z!@P_)xX*;zk4q1){s#}l>0&}L@YXf1Kf5R8@MX;l5VaVkftCz3}097o8 zoS(sQ8ZJ*E3E)DC#!>VU+05{H&CQ;fO3Eq3TMIll?TBGR6eG-Dk8IPLwQLO@liZVp z`mJF(fZ`(#pu5U&ghQM)8?`TGZB-lJdNdD<@2Xyl>^Kd=R8ak6&}F!jAvdc2A@TJa zgCm7%?%?1K6!8Xjhybu_w-1%&jWvjCH>IKx9M&8bUPq{}IRr%6^*D($4BXpD08?m4 z5zk%;A55W@6UqntJ*AP_XyLYC=hk50RHa%tzN&w3a96R47+JW^L=4P;Y}m{~JQtiG ziqOT)0=RqrBNfiemEQH9WoF3b0R!4PkV7zUUZU=AfiybkF;O;NJ8 z)h;gz(f&}uDUL86MWSLwA-S>c`>d1V`M=Wf??Nb*N1Sg zD>TPChtASP;GS{wmB^oSgCD^gHys)_G~pq~*iE)v5&Q{0&?TcNl4q@S(hPJf#gq!? zQu6H2zfN%4k*0mJvM_#(l8~t;8psRw!T6q+Z!2eElbRp%u7dd5B8V?S0;hKopFNq4GY)`;-!TVv-ud-ksg&n7`X9P21R8?x>;x$6@d6s zBAe2m2-iTNuzsu7oUF{06&)>O*!GX8V`Lxb8*SBXf<5`M{1I$8_*uJ4M@$J#4vLXcMM@DjxzZvtUgF%IHyc31gER`ayU|+=*Q2##;Rkt<{g=-rJVZe+R zhOya?x@98cmJ`yftiQ5-j9XMz5cWy)bbQ!6`y>Xrx;2k25Edk=iS}S#-jOd_Y6;*L zE}pf3Dw`L_K7hq}5u0S5UZ&-;GS>^@h?pW_*BBrMMCoMzVa(yu#l2qwHRW&pYx6NaM*Ar|Tf*3LryUB6lIaeR36B$o6u% zRNjj{Xjx144VCC!2Uvg0co`qpXPsmtpaHB0F}rCvNgR|)B>yh#O%CVFGhpm5MN9a! zTxUdaY>$YN>iU-&23s7qRTVg%cSp%5zx{rhn?=XX?tsiPs&i3DZb-Ke41&5+doa>{ z@gGnff&@6Dl*$OWA=_9*t5?VsZ!wTX=^gpwh5j)FDvDvJg^w;!9fDNtbry5d>92$c z65Jmx=0k`vl)7zV(e5am+*w17n_aNvwqv;*Pd{*!7Yn1v^JYa8%1GkamG_0<#)1n; zVhkQ6p(3Uv*w)-28!93*YqFqBnn|$jrescZYE0(GC&na3V%AHdm~KjD_|sQ1SBIoG zog`7hNgyrDSp8&H+`K0-RA4D)JOwpozLOZvSSRzeBHxZCaUz2?nH^P6JvWiW3Kt<} z-zhO7_Tkvw$x?YFSyb%-#(x2aJ8%XtQB=>HB;jy$%wBt1UbR-1efYFIo(|+5eKK!b zEkBANY)THIL1p-p$s)#$NoMq8%akrhxX+M88AL?To-az~Iv**ShuLAYVa-V|I!VB& z{|UGy^mCF3$@!_TF>=~uH3Paol{i~mnV|%YeUe9>ni@;Zk>er>RdRkzdOq9%gu1H@ zGTq70Bqxa>okYPvt?5C&l$IpBOiv3W$*7}Zq6f)rOpw^pO|)D`SvX9S2wUW=i)?fy z3Y)1;=gxGL!TgaVP1P|ml$aZn`Gc5fs=AdA4~km{;!X8c?#h?>lq{iR-W-@s@aeoc zPRCf=B?+kX%n~A*ZB8{LD2IC+jSvQTPNGrfK^#p=ko3&I34y^?2oD-3(7^!?IsAx) zwwxM=-Q7F3yEL31O|o!DsX<1lCwod`MHoI=9l_H|lAs+zP%nR~F^Vx$+wUJQmS;dS zah~&`?Z$zs6h8LDa2KoC?xvy_hYJnRe8Y30MJl71(W|B5QcAV`*rQ7dCA#iS=8NOi zM_1E~tRxC{i;81O@U{~7*phG^X-T-{{7y#GaMCTIRz~W{4ER3u@i7V;qA-*<)-bof zGIRdcqlMvPo<1KaoPd_fnV|%i)?@7-J1l3IQk!DdF+U0}#Dlr-_>5%XMHX=0%sV8K z6qYQlo%Kl~Y{L>>&qF2J#;}Mi|B|KDSou2J2q%pFHK3$+Gg*2Nrz0!X{PFQ*mLAz2 znF&LEQ^eRBQ`wEv(RY-_LW81nh#4T~D|o@km{^ky@Iv~@Om2EWC_L+#=n-ADB;h(m zCgCwR4}+SK$27wJV!t64+`iP(+X{ynwP=*>{HP>{z6#BR7hfGGDfJ;NegrP9UGv$c zc@k4GOwB`360Wax(Uc+@#SYc@y!d8wwlO`cn~gD|+qMnyoX?2U!FocxQDZL%)dY?j zl1h4lcC<7sGV{KB!(yKCbsk7#Y>`*v>{97ikw#LMJSjaa2M|)=q8H{QXksX;LY^nr z9&5Fy-x5@K;sTuERVp4gO=PQYoP@{XKk}Xe-nvSZcZT1HF%8KKEeScpqe`J7^7U0n zTq-?GokTx~T?W3Lf*7K4ux3P0YSoPBIvfpQ+4h?eJz`(%&VO1X!vQYy)QmKplay?{ zPG@?|KG7X8$7bzcNtVQnk63NBi1Yc0g5LW?srlBkI3J!ju2O2jk@C{XgJacljWO4m zad(X7@!~)lql2RDePFhGlKmr6=? zTlgZO*oQj`RRj)?-FXwXDa)z24KofDYB)F8s92(khM1VLaS9-*l#KA@-Fs0<1T!YBhE+ zBrCEGOLEe|9$qbt<;JH*8Wdp5FPyw(NIRkt6Qnsa#y;%kC7Y{J7QWq=%)>_H@!FVq zdzb4Zyo;8^G9&iFknbo-z$Hm#`|O=ip6lQ_nN6FOrf!Ir|2B7y--6>&qz>plE6Zck{;u!XmSLp$gn8wW=m! zFA>YuqBjt*TY(BtUcMX)yA=w`})Myd7(^WopnE2KUfN z_CWq*Sd4K%?!N@a1H-o%f^8*kIHSwy`l0ENCyE3bDNlpMd*pl_o4TiFqm zVQ>FCl2J{0)j7yjw8otUydzw}QST9Lq;o@sFYi%~=ExE57%*wGtZniT%~}PociWdu zyiAgA1P|ToAPmb$&@i?H!p>O@L?McB|=}fTjQl1l*3P zC_P+94>B4aITKv&Tv%c}^yEJ~Wu#pE95yC7hNU$rVAq_KOiH=YiP`{1a%woGpE#Co ztX@inJsqAb!ipL?SUjaVp05rcO(A&_B1!?1UJ5v$teKsM12b04$Kg>TG8(|IIKWqj zFl>*H;}jG^;78@zzNxGxY1PbeE#q4ZmP)(xWe^+8A1h!II)OL+rGqsr8}2DfAH`v? zHRgD>!!vKn$Z0{l<1GYd*bx`vGv%|QneuhsOB@MvTv73$h>0U%4#Oz%3>ai$W*WlA z%qV2U7%~mwgub2IzgKa1(QX%X_K-v-=R;D#oDa*`MmUMaD^eHY;8;HFLH9uteough zA9?P9Ge_E|N%+!374ABZ0%*)L*jbQ+0eqRkK>90pmUvDMWGEGSYJuI(=0=tP#x>$} zN*;(tr;gs52q}E1S*XZ&_-FwLh+7u8W(dqSp=qUnq{6~UxIZ$C_-1g>FQ=`!S}p9! z4<99H0Iw$a&v4OPrqCz>iwU+=Sdv8ej=dSX0z`PTCK3s3gh;@{GKz~hj3bXE<_xHS zXfbq5$1+AD-}kU07UPY^R?8)G>|Cgf!>`jmFj5w%eD}ef+mN=fEEaQ;&tc&|Q|tU^ zQLqRACf|R?n|zL1l~OYAX5v&{0lpz#dmP7!#X`U%zSt-Xw&IH*{Ee@D`p3}QIFFBQ zQ~cgpC=cNPuGnAx#=c(>+#mg(g|^EDYox2Z;Em)b4hhHsc1-={Q!-Y4{9JXk;y>>! zRQ*TxqIQ`N<#d>Y4(nEm$6RjMdmt(A@QZNnKOgYl?S%Ns{HR-yJHk6PN5`^O>p4l0 z9VNb4lv*J4x$Ndm3MM=lzUgQ7Hc}8wlVf{I5yT5X@!R3XL3+JP?tEBE5d)luj?>sr zPSbX|k%ny;438X!+ZmCTDwZr|^{8l?pW=n~Qwk^9YJ{(HFh(f85s^YUGBdfIh!B&y zCOa}-%t(tbYEcn%kmB^ zv~|Q~Z7U4bjvV0(<6xH1V6hqn6zY{i2P_nEZ9kzJ@xQ=Sc3{ifG~IY`z2LzOj!;v zjf~XrnZ2;!KD;A+T*6llW|75N96RMQ%oHu~YH_H@13+Fb>^y^E0p3Z+D+{B#08-Ep z;W^`uidF@=asM+)W|WjQk4lqNSv{bqbCoXdG+^2gGbc{H_r|B#?8tdOv5ip(E0>8^ zun~XI2fS>uv%ur6p`_lJ*Z0; z?g+{wj=V@Zwq&x?9fFVHXJpidu5wc+GmQ_U7MuV#*YsmwKtA^t;H4V}wm=z3DfCSQ zi87s(tkupe@y18j(n$P$Ik ziS;l_%DZ;S9M@GT#dLfy!;FjK2l!xgk4bi#C0-gcCupT{NvQaNp`T!JhZB%~9EL({ zA;5RXaEHwTj}mPN%#_ae1+jwPRXlQ37>JzDmCB!OH>$sAHx5A73T$nF8M<7pNRq)+;TF3b!U2DyA|a%PO9QC* z^daM@8hmGh66LQf*zBQS?E&XF!??%3KdikmBZiT}`OXRprNnX}rA9XELh!_ayO3`v z2biql&C20;vV34!1%gw_#}Kf@VI7VneY(F0!(bk;<{C3#BFX3qvD{Ox;)M+=f&dRs zUgMxrRSXCt%_y#-jI#EDLg5%TNbZ7Y(ef=_z^Z)uwo;X zZv<-|*RTkInc2z$(_9aS&v*3YD-u} z2oKDryE`ZnS|Qud7!Rd!_rP}uvG=q6KAgjrp%A(ZY`x&2--U@VCw918xN4Y5y+&Xv zde~fwB%xH4Bvce51&sD5p(hhnkpW}0qG!~FiS!&YlAa^XG{^!&={eS8jnz-i%w~No zM?EOn#*gKYv-C2;S%WNamY!2l*Ed!Pj33;8#6$Q-bf`h*D33VKgTwaIVe%NR$t;d+ zMc9WyYywCm>8N~cEXXlxjIWM~R>`iabcLoUl++Xcf|H)Zp^%;!iOeWi-Q;foX!voalogK6@}-@EYTSN>Yx zW5i3_*dN3AnAgHbk&$~@LgdUNK<4EMu?j8}<>#>Ec5Fi*hVO%qh+6Aoo^oS)0?0g~ zph@i%XNd*&U;%=!p=fE?c%d@L(`cd_l3?dZLR2ViKQ5N*{AF_pNAim#s?IYe2^0Do z7%d)$_s-+wGJMLMNd$;f-smwn_Si4vmw*Mx_8OCJ)(Il47>M*@AR!)yL1|;4vQ8J4 zHmh@|DJ_)pNJ3d@5-RnkfKhc4S`A;MwpB6o9^kBjybvOC+EPMXBR>|D#&bK-S(wBJ zF_r^Hwg<+MP?qt@=3s`+d>DZEHh#cUI4HHJIHmzr9%&P5Fd|5?(VBwoFgf~8jbxeR zh`ePZ#dI-Zx`zvzz^q4te}@Bu-s0aJ`ZJ#t52G#t1N;~QJal@>LD@b#FwDwD>WIUr zgXS9o@hrNK`c8@2^1x!NFY}^cW+ak8o z%oox+oAx%CaS(NGg7U+EB zM|+@z(MK~C+V!ctJOqoq$~%DpW6TwRtSw?-vKRwNyBfYMrLAn7jh&Deg&3pDgWm;P|A2j}$TS($kXC`$`qWo$-M0b76{ut+fDbJ!{TRI57O= zkU4h_eJYpnFH+|;)i}1(?QpJaGoo)^OnOV`GaGH`|;5wtd(7-81Ka| zk3S?5o*i@q@Mje8M@4Ww9NW zw)W*axB7l2I#NOxp#Y-=p@D8I#AUIo`k{|y2P#G%_4_g|TRIT7)_mMT&S>Hryte=J zD^u=SHOM_%Avs8*#dNbqAVi14p6wgs$I?nC9kdWu%2sF~4km|x%1gGBWn83y9d_tL z$MItsETK&nnkFfX%k1ha3k4J8M#89#K`x8L5SHK{(~>=*GLIziAO{8(|Blwc(OMOA z?vZV!lVb?Q9UJ4Xac#Mn@m;mS63(_7kyF1JzvNuVrN&SJFT^8BrddWFeymU~1p}i9 z{Ro^QuJFZLX^(qi8MSWi+N$14gXpEe;+^{_MZ>CO)}bhV~QqJm^sPPIGWni^a~Afb5AP$@P0@IzphRmy0cjaM7<6 zIKMfSM#n$<5fX{TPeVAxVLSHVyiEpQLrK;Skq za&M#8wg^I{W+dB^o{}5T&O+5@!b#!>NzGrivCtu9g-WPv?(n@<`#!y}*(i_erbc

%Y`YjZ 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⪙W^k07#wt47YU^>^=bw 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

>wk9Qmb*Xr!(8w4fBE~JUw`&LfA`tfe*53g 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 literal 0 HcmV?d00001 diff --git a/Common/00MesWorkMqtt/Common/dll/MesWorkMqtt.pdb b/Common/00MesWorkMqtt/Common/dll/MesWorkMqtt.pdb new file mode 100644 index 0000000000000000000000000000000000000000..fb106249579e14adc3849508ef626c6ad94d5243 GIT binary patch literal 24064 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 ZUJk_HSUB-t=-^CY@tJmX`lW>i{tKdD00aO4 literal 0 HcmV?d00001 diff --git a/Common/00MesWorkMqtt/DataBaseAccess/04DataBaseAccess.csproj b/Common/00MesWorkMqtt/DataBaseAccess/04DataBaseAccess.csproj new file mode 100644 index 0000000..0a63414 --- /dev/null +++ b/Common/00MesWorkMqtt/DataBaseAccess/04DataBaseAccess.csproj @@ -0,0 +1,52 @@ + + + + + Debug + AnyCPU + {01CBA6DC-8B15-4D51-B073-004E2DB6F440} + Library + Properties + DataBaseAccess + DataBaseAccess + v4.6.1 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Common/00MesWorkMqtt/DataBaseAccess/DataAccess.cs b/Common/00MesWorkMqtt/DataBaseAccess/DataAccess.cs new file mode 100644 index 0000000..a5b7b7b --- /dev/null +++ b/Common/00MesWorkMqtt/DataBaseAccess/DataAccess.cs @@ -0,0 +1,527 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DataLinkMesWork +{ + public class DataAccess + { + public static string ConnectionString_MES = ConfigurationManager.AppSettings["ConnectionString_MES"]; + + + ///

+ /// 增 删 改 + /// + /// + /// + /// + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlCommand cmd = new SqlCommand(procedureName, conn)) + { + cmd.CommandTimeout = 0; + cmd.CommandType = CommandType.StoredProcedure; + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + cmd.Parameters.Add(sqlParameters[i]); + } + } + cmd.ExecuteNonQuery(); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters,out DataTable dt) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + //ds = new DataSet(); + dt = new DataTable(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(procedureName, conn); + dsCommand.SelectCommand.CommandType = CommandType.StoredProcedure; + dsCommand.SelectCommand.CommandTimeout = 0; + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + dsCommand.SelectCommand.Parameters.Add(sqlParameters[i]); + } + } + + dsCommand.Fill(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters, out DataSet ds) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + ds = new DataSet(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(procedureName, conn); + dsCommand.SelectCommand.CommandType = CommandType.StoredProcedure; + dsCommand.SelectCommand.CommandTimeout = 0; + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + dsCommand.SelectCommand.Parameters.Add(sqlParameters[i]); + } + } + + dsCommand.Fill(ds); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + public static bool ExecuteDataset(string sql, out DataSet ds) + { + string errorMessage; + string connectionString = ConnectionString_MES; + bool result = false; + errorMessage = ""; + ds = new DataSet(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(sql, conn); + dsCommand.Fill(ds); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + public static bool ExecuteDataTable(string sql, out DataTable dt) + { + //public static bool ExecuteDataTable(string sql, string connectionString, out DataTable dt, out string errorMessage) + string errorMessage; + string connectionString = ConnectionString_MES; + bool result = false; + errorMessage = ""; + dt = new DataTable(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(sql, conn); + dsCommand.Fill(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + public static DataTable ExecuteSQL(string sql, ref SqlParameter[] sqlParameters) + { + string connectionString = ConnectionString_MES; + string err; + bool result = false; + err = ""; + DataTable dt = new DataTable(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter(sql, conn)) + { + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + dsCommand.SelectCommand.Parameters.Add(sqlParameters[i]); + } + } + dsCommand.Fill(dt); + } + result = true; + } + catch (Exception e) + { + err = e.ToString(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteSelectMesWork\r\n" + sql + "\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return dt; + } + + public static bool ExecuteSQL(string sql) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + cmd.ExecuteNonQuery(); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + /// + /// 提供通用的调用存储过程的方法(增加数据的数据表的到数据库的调用) + /// + /// 存储过程名称 + /// 存储过程参数数组 + /// 增加数据的数据表 + /// + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters, DataTable dt) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + // if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.InsertCommand = new SqlCommand(procedureName, conn); + dsCommand.InsertCommand.CommandType = CommandType.StoredProcedure; + for (int i = 0; i < sqlParameters.Length; i++) + { + dsCommand.InsertCommand.Parameters.Add(sqlParameters[i]); + } + if (dt == null) return false; + dt.AcceptChanges(); + for (int i = 0; i < dt.Rows.Count; i++) + { + dt.Rows[i].SetAdded(); + } + dsCommand.Update(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + /// + /// 提供通用的调用存储过程的方法(增加数据的数据表的到数据库的调用) + /// + /// + /// + /// + public static bool ExecuteStoredProcedure(string procedureName, out DataTable dt) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + dt = new DataTable(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(procedureName, conn); + dsCommand.SelectCommand.CommandType = CommandType.StoredProcedure; + + dsCommand.Fill(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + /// + /// + /// + /// + /// + /// + /// + public static bool ExecuteSQL(string sql, ref SqlParameter[] sqlParameters, DataTable dt) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + + + try + { + // if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.InsertCommand = new SqlCommand(sql, conn); + + for (int i = 0; i < sqlParameters.Length; i++) + { + sqlParameters[i].IsNullable = true; + dsCommand.InsertCommand.Parameters.Add(sqlParameters[i]); + } + if (dt == null) return false; + dt.AcceptChanges(); + for (int i = 0; i < dt.Rows.Count; i++) + { + dt.Rows[i].SetAdded(); + } + dsCommand.Update(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + //ApplicationConfig.ConnectionStringPIS_NEW_Value = "0"; + //TestConnection(); + //errorMessage = e.ToString(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteSQL\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + public static bool ExecuteNonQuery_newID(string sql, out long newID) + { + sql += ";select @@identity"; + string connectionString; + connectionString = ConnectionString_MES; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + conn.Open(); + newID = Convert.ToInt64(cmd.ExecuteScalar()); + } + return true; + } + catch (Exception e) + { + newID = 0; + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\n ExecuteNonQuery_newID\r\n�洢���̣�\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + return false; + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + } + + public static bool ExecuteOutNum(string sql, out int count) + { + string connectionString; + connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + count = 0; + try + { + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + count = Convert.ToInt32(cmd.ExecuteScalar().ToString()); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + } + + +} diff --git a/Common/00MesWorkMqtt/DataBaseAccess/JsonHelper.cs b/Common/00MesWorkMqtt/DataBaseAccess/JsonHelper.cs new file mode 100644 index 0000000..1e07081 --- /dev/null +++ b/Common/00MesWorkMqtt/DataBaseAccess/JsonHelper.cs @@ -0,0 +1,334 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Data; +//using System.Runtime.Serialization.Json; +using System.Web.Script.Serialization; +using System.Runtime.Serialization.Json; + +public class JsonHelper +{ + #region 序列化和反序列化 + // 序列化 + public static string JsonSerializer(T t) + { + // 使用 DataContractJsonSerializer 将 T 对象序列化为内存流。 + DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(T)); + MemoryStream ms = new MemoryStream(); + // 使用 WriteObject 方法将 JSON 数据写入到流中。 + jsonSerializer.WriteObject(ms, t); + // 流转字符串 + string jsonString = Encoding.UTF8.GetString(ms.ToArray()); + ms.Close(); + //替换Json的Date字符串 + string p = @"\\/Date\((\d+)\+\d+\)\\/"; + MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString); + Regex reg = new Regex(p); + jsonString = reg.Replace(jsonString, matchEvaluator); + return jsonString; + } + public static T JsonDeserialize(string jsonString) + { + //将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式 + string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}"; + MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate); + Regex reg = new Regex(p); + jsonString = reg.Replace(jsonString, matchEvaluator); + DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(T)); + // 字符串转流 + MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); + // 通过使用 DataContractJsonSerializer 的 ReadObject 方法,将 JSON 编码数据反序列化为T + T obj = (T)jsonSerializer.ReadObject(ms); + return obj; + } + public static string ConvertJsonDateToDateString(Match match) + { + string result = string.Empty; + DateTime dateTime = new DateTime(1970, 1, 1); + dateTime = dateTime.AddMilliseconds(long.Parse(match.Groups[1].Value)); + dateTime = dateTime.ToLocalTime(); + result = dateTime.ToString("yyyy-MM-dd HH:mm:ss"); + return result; + } + private static string ConvertDateStringToJsonDate(Match m) + { + string result = string.Empty; + DateTime dt = DateTime.Parse(m.Groups[0].Value); + dt = dt.ToUniversalTime(); + TimeSpan ts = dt - DateTime.Parse("1970-01-01"); + result = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds); + return result; + } + #endregion + + // 对象转换为Json + public static string ObjectToJson(object obj) + { + JavaScriptSerializer js = new JavaScriptSerializer(); + js.MaxJsonLength = Int32.MaxValue; // 定义JavaScriptSerializer接受字符串的最大长度 hdk 20180524 + try + { + return js.Serialize(obj); + } + catch (Exception exception) + { + + throw new Exception(exception.Message); + } + } + // 数据表转化为集合 + public static List> DataTableToList(DataTable dt) + { + List> list = new List>(); + foreach (DataRow dataRow in dt.Rows) + { + Dictionary dic = new Dictionary(); + + + foreach (DataColumn dc in dt.Columns) + { + if (dataRow[dc.ColumnName].GetType() == typeof(DateTime)) + { + string str = Convert.ToDateTime(dataRow[dc.ColumnName]).ToString("yyyy-MM-dd HH:mm:ss"); + dic.Add(dc.ColumnName, str); + } + else if + (dataRow[dc.ColumnName].GetType() == typeof(byte[])) + { + string str = Convert.ToBase64String((byte[])dataRow[dc.ColumnName]); + dic.Add(dc.ColumnName, str); + } + else + { + dic.Add(dc.ColumnName, dataRow[dc.ColumnName]); + } + + //Type type1 = dt.Rows[0]["产品图片"].GetType(); + //Type type2 = typeof(byte[]); + + } + list.Add(dic); + } + return list; + } + /// + /// 表转换为Json + /// + /// + /// + public static string DataTableToJson(DataTable dt) + { + return ObjectToJson(DataTableToList(dt)); + } + /// + /// 将DataTable中的数据转换成JSON格式 + /// + /// 数据源DataTable + /// 是否输出数据总条数 + /// JSON中显示的数据总条数 + /// + public static string CreateJsonParameters(DataTable dt, bool displayCount, int totalcount) + { + StringBuilder JsonString = new StringBuilder(); + //Exception Handling + + if (dt != null) + { + JsonString.Append("{ "); + JsonString.Append("\"rows\":[ "); + for (int i = 0; i < dt.Rows.Count; i++) + { + JsonString.Append("{ "); + for (int j = 0; j < dt.Columns.Count; j++) + { + if (j < dt.Columns.Count - 1) + { + //if (dt.Rows[i][j] == DBNull.Value) continue; + if (dt.Columns[j].DataType == typeof(bool)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + dt.Rows[i][j].ToString().ToLower() + ","); + } + else if (dt.Columns[j].DataType == typeof(string)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + ObjectToJson(dt.Rows[i][j]).ToString() + ","); + //JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + // dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\","); + } + else + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\","); + } + } + else if (j == dt.Columns.Count - 1) + { + //if (dt.Rows[i][j] == DBNull.Value) continue; + if (dt.Columns[j].DataType == typeof(bool)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + dt.Rows[i][j].ToString().ToLower()); + } + else if (dt.Columns[j].DataType == typeof(string)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + ObjectToJson(dt.Rows[i][j]).ToString()); + //JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + // dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\""); + } + else + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\""); + } + } + } + /*end Of String*/ + if (i == dt.Rows.Count - 1) + { + JsonString.Append("} "); + } + else + { + JsonString.Append("}, "); + } + } + JsonString.Append("]"); + + if (displayCount) + { + JsonString.Append(","); + + JsonString.Append("\"total\":"); + JsonString.Append(totalcount); + } + + JsonString.Append("}"); + return JsonString.ToString().Replace("\n", ""); + } + else + { + return null; + } + } + public static string CreateJsonParameters(DataTable dt) + { + StringBuilder JsonString = new StringBuilder(); + //Exception Handling + + if (dt != null) + { + JsonString.Append("{ "); + JsonString.Append("\"rows\":[ "); + for (int i = 0; i < dt.Rows.Count; i++) + { + JsonString.Append("{ "); + for (int j = 0; j < dt.Columns.Count; j++) + { + if (j < dt.Columns.Count - 1) + { + //if (dt.Rows[i][j] == DBNull.Value) continue; + if (dt.Columns[j].DataType == typeof(bool)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + dt.Rows[i][j].ToString().ToLower() + ","); + } + else if (dt.Columns[j].DataType == typeof(string)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + ObjectToJson(dt.Rows[i][j]).ToString() + ","); + //JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + // dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\","); + } + else + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\","); + } + } + else if (j == dt.Columns.Count - 1) + { + //if (dt.Rows[i][j] == DBNull.Value) continue; + if (dt.Columns[j].DataType == typeof(bool)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + dt.Rows[i][j].ToString().ToLower()); + } + else if (dt.Columns[j].DataType == typeof(string)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + ObjectToJson(dt.Rows[i][j]).ToString()); + //JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + // dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\""); + } + else + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\""); + } + } + } + /*end Of String*/ + if (i == dt.Rows.Count - 1) + { + JsonString.Append("} "); + } + else + { + JsonString.Append("}, "); + } + } + JsonString.Append("]"); + + JsonString.Append("}"); + return JsonString.ToString().Replace("\n", ""); + } + else + { + return null; + } + } + StringBuilder result = new StringBuilder(); + StringBuilder sb = new StringBuilder(); + /// + /// 根据DataTable生成EasyUI Tree Json树结构 + /// + /// 数据源 + /// ID列 + /// Text列 + /// 节点Url + /// 关系字段 + /// 父ID + public string GetTreeJsonByTable(DataTable tabel, string idCol, string txtCol, string url, string rela, object pId) + { + result.Append(sb.ToString()); + sb.Clear(); + if (tabel.Rows.Count > 0) + { + sb.Append("["); + string filer = string.Format("{0}='{1}'", rela, pId); + DataRow[] rows = tabel.Select(filer); + if (rows.Length > 0) + { + foreach (DataRow row in rows) + { + sb.Append("{\"id\":\"" + row[idCol] + "\",\"text\":\"" + row[txtCol] + "\",\"attributes\":\"" + row[url] + "\",\"state\":\"open\""); + if (tabel.Select(string.Format("{0}='{1}'", rela, row[idCol])).Length > 0) + { + sb.Append(",\"children\":"); + GetTreeJsonByTable(tabel, idCol, txtCol, url, rela, row[idCol]); + result.Append(sb.ToString()); + sb.Clear(); + } + result.Append(sb.ToString()); + sb.Clear(); + sb.Append("},"); + } + sb = sb.Remove(sb.Length - 1, 1); + } + sb.Append("]"); + result.Append(sb.ToString()); + sb.Clear(); + } + return result.ToString(); + } +} \ No newline at end of file diff --git a/Common/00MesWorkMqtt/DataBaseAccess/Properties/AssemblyInfo.cs b/Common/00MesWorkMqtt/DataBaseAccess/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..e031332 --- /dev/null +++ b/Common/00MesWorkMqtt/DataBaseAccess/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("DataBaseAccess")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DataBaseAccess")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("01cba6dc-8b15-4d51-b073-004e2db6f440")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Common/00MesWorkMqtt/MesWorkMqtt.sln b/Common/00MesWorkMqtt/MesWorkMqtt.sln new file mode 100644 index 0000000..7e4859b --- /dev/null +++ b/Common/00MesWorkMqtt/MesWorkMqtt.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32901.82 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "00MesWorkMqtt", "MesWorkMqtt\00MesWorkMqtt.csproj", "{F55DA1A0-A982-4479-8C47-0D9A5AAF3E18}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F55DA1A0-A982-4479-8C47-0D9A5AAF3E18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F55DA1A0-A982-4479-8C47-0D9A5AAF3E18}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F55DA1A0-A982-4479-8C47-0D9A5AAF3E18}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F55DA1A0-A982-4479-8C47-0D9A5AAF3E18}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C16A8637-B440-4EA0-99D9-A76AD9126EA9} + EndGlobalSection +EndGlobal diff --git a/Common/00MesWorkMqtt/MesWorkMqtt/00MesWorkMqtt.csproj b/Common/00MesWorkMqtt/MesWorkMqtt/00MesWorkMqtt.csproj new file mode 100644 index 0000000..5ea62aa --- /dev/null +++ b/Common/00MesWorkMqtt/MesWorkMqtt/00MesWorkMqtt.csproj @@ -0,0 +1,56 @@ + + + + + Debug + AnyCPU + {F55DA1A0-A982-4479-8C47-0D9A5AAF3E18} + Library + Properties + MesWorkMqtt + 00MesWorkMqtt + v4.8 + 512 + true + + + + true + full + false + ..\..\dll\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\dll\MQTTnet.dll + + + ..\..\dll\MQTTnet.Extensions.ManagedClient.dll + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Common/00MesWorkMqtt/MesWorkMqtt/Mqtt.cs b/Common/00MesWorkMqtt/MesWorkMqtt/Mqtt.cs new file mode 100644 index 0000000..b0bca3a --- /dev/null +++ b/Common/00MesWorkMqtt/MesWorkMqtt/Mqtt.cs @@ -0,0 +1,281 @@ + +using MQTTnet; +using MQTTnet.Client; +using MQTTnet.Client.Connecting; +using MQTTnet.Client.Disconnecting; +using MQTTnet.Client.Options; +using MQTTnet.Client.Receiving; +using MQTTnet.Extensions.ManagedClient; +using MQTTnet.Formatter; + +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesWorkMqtt +{ + public class Mqtt + { + /// + /// + /// + public static IManagedMqttClient mqttClient = null; + public static string MqttUrl = ConfigurationManager.AppSettings["MqttUrl"]; + /// + /// + /// + public static string topic = ""; + + + /// + /// + /// + /// + /// + public static async Task StartAsync() + { + string uri = MqttUrl; + //127.0.0.1:18083,123 + var array = uri.Split(new char[] { ':', ',' }); + string mqttUser = "MisDataFun"; + string mqttPassword = ""; + var options = new MqttClientOptions + { + ClientId = "MisDataFun-200170511", + ProtocolVersion = MqttProtocolVersion.V311, + ChannelOptions = new MqttClientTcpOptions { Server = array[0], Port = Convert.ToInt32(array[1]) }, + CleanSession = false, + SessionExpiryInterval = 300, + KeepAlivePeriod = TimeSpan.FromSeconds(20), + Credentials = new MqttClientCredentials + { + Username = mqttUser, + Password = Encoding.UTF8.GetBytes(mqttPassword) + } + }; + mqttClient = new MqttFactory().CreateManagedMqttClient(); + + //mqttClient.ConnectedHandler = new MqttClientConnectedHandlerDelegate(OnSubscriberConnected); + //mqttClient.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(OnSubscriberDisconnected); + //mqttClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(OnSubscriberMessageReceived); + await mqttClient.StartAsync(new ManagedMqttClientOptions { ClientOptions = options }); + topic = array[2]; + await mqttClient.SubscribeAsync(new MqttTopicFilter { Topic = topic }); + + } + + + /// + /// + /// + /// + /// + /// + public static async Task Publish(string publish_topic, string publish_msg) + { + if (mqttClient != null) + { + try + { + await mqttClient.PublishAsync(new MqttApplicationMessageBuilder().WithTopic(publish_topic).WithPayload(publish_msg).WithExactlyOnceQoS().Build()); + + } + catch (Exception err) + { + + } + } + } + /// + /// + /// + /// + /// + /// + public static async Task PublishQos0(string publish_topic, string publish_msg) + { + if (mqttClient != null) + { + await mqttClient.PublishAsync(new MqttApplicationMessageBuilder().WithTopic(publish_topic).WithPayload(publish_msg).WithAtLeastOnceQoS().Build()); + } + } + /// + /// + /// + /// + public static async Task StopAsync() + { + if (mqttClient != null) + { + await mqttClient.UnsubscribeAsync(new string[] { topic }); + await mqttClient.StopAsync(); + } + } + ///// + ///// + ///// + ///// + //private static void OnSubscriberConnected(MqttClientConnectedEventArgs x) + //{ + // var rec = x.AuthenticateResult.ResultCode.ToString(); + // // label_State.Text = rec; + //} + ///// + ///// + ///// + ///// + //private static void OnSubscriberDisconnected(MqttClientDisconnectedEventArgs x) + //{ + // //var rec = x.AuthenticateResult.ResultCode.ToString(); + // //label_State.Text = rec; + //} + ///// + ///// + ///// + ///// + //private static void OnSubscriberMessageReceived(MqttApplicationMessageReceivedEventArgs x) + //{ + // var rec = x.ApplicationMessage.ConvertPayloadToString(); + // // txt_Rec.Text = txt_Rec.Text + rec + System.Environment.NewLine; + + //} + + + + } + + public class Mqtt2 + { + /// + /// + /// + public IManagedMqttClient mqttClient = null; + public string MqttUrl; + /// + /// + /// + public string topic = ""; + + public Mqtt2() + { + mqttClient = new MqttFactory().CreateManagedMqttClient(); + } + /// + /// + /// + /// + /// + public async Task StartAsync() + { + string uri = MqttUrl; + //127.0.0.1:18083,123 + var array = uri.Split(new char[] { ':', ',' }); + string mqttUser = ""; + string mqttPassword = ""; + var options = new MqttClientOptions + { + ClientId = Guid.NewGuid().ToString(), + ProtocolVersion = MqttProtocolVersion.V311, + ChannelOptions = new MqttClientTcpOptions { Server = array[0], Port = Convert.ToInt32(array[1]) }, + CleanSession = true, + KeepAlivePeriod = TimeSpan.FromSeconds(100), + Credentials = new MqttClientCredentials + { + Username = mqttUser, + Password = Encoding.UTF8.GetBytes(mqttPassword) + } + }; + //mqttClient.ConnectedHandler = new MqttClientConnectedHandlerDelegate(OnSubscriberConnected); + //mqttClient.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(OnSubscriberDisconnected); + //mqttClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(OnSubscriberMessageReceived); + await mqttClient.StartAsync(new ManagedMqttClientOptions { ClientOptions = options }); + //topic = array[2]; + await mqttClient.SubscribeAsync(new MqttTopicFilter { Topic = topic }); + + } + + + /// + /// + /// + /// + /// + /// + public async Task Publish(string publish_topic, string publish_msg) + { + if (mqttClient != null) + { + try + { + await mqttClient.PublishAsync(new MqttApplicationMessageBuilder().WithTopic(publish_topic).WithPayload(publish_msg).WithExactlyOnceQoS().Build()); + + } + catch (Exception err) + { + + } + } + } + //static public async Task Publish(IManagedMqttClient mqttClient_1, string publish_topic, string publish_msg) + //{ + // if (mqttClient_1 != null) + // { + // try + // { + // await mqttClient_1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic(publish_topic).WithPayload(publish_msg).WithExactlyOnceQoS().Build()); + + // } + // catch (Exception err) + // { + + // } + // } + //} + /// + /// + /// + /// + public async Task StopAsync() + { + if (mqttClient != null) + { + await mqttClient.UnsubscribeAsync(new string[] { topic }); + await mqttClient.StopAsync(); + } + } + ///// + ///// + ///// + ///// + //private static void OnSubscriberConnected(MqttClientConnectedEventArgs x) + //{ + // var rec = x.AuthenticateResult.ResultCode.ToString(); + // // label_State.Text = rec; + //} + ///// + ///// + ///// + ///// + //private static void OnSubscriberDisconnected(MqttClientDisconnectedEventArgs x) + //{ + // //var rec = x.AuthenticateResult.ResultCode.ToString(); + // //label_State.Text = rec; + //} + ///// + ///// + ///// + ///// + //private static void OnSubscriberMessageReceived(MqttApplicationMessageReceivedEventArgs x) + //{ + // var rec = x.ApplicationMessage.ConvertPayloadToString(); + // // txt_Rec.Text = txt_Rec.Text + rec + System.Environment.NewLine; + + //} + + + + } +} diff --git a/Common/00MesWorkMqtt/MesWorkMqtt/Properties/AssemblyInfo.cs b/Common/00MesWorkMqtt/MesWorkMqtt/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..b28e8c7 --- /dev/null +++ b/Common/00MesWorkMqtt/MesWorkMqtt/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("MesWorkMqtt")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MesWorkMqtt")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("f55da1a0-a982-4479-8c47-0d9a5aaf3e18")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Common/01DoWhatPlc/01_01DoWhatPlc.csproj b/Common/01DoWhatPlc/01_01DoWhatPlc.csproj new file mode 100644 index 0000000..b93fbd9 --- /dev/null +++ b/Common/01DoWhatPlc/01_01DoWhatPlc.csproj @@ -0,0 +1,60 @@ + + + + + Debug + AnyCPU + {0D1AF432-439A-4920-8692-43AE139F5530} + Library + Properties + DoWhatPlc + DoWhatPlc + v4.8 + 512 + true + + + + true + full + false + ..\WebApiDll\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + ..\WebApiDll\Newtonsoft.Json.dll + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Common/01DoWhatPlc/01_01DoWhatPlc.sln b/Common/01DoWhatPlc/01_01DoWhatPlc.sln new file mode 100644 index 0000000..0ff0522 --- /dev/null +++ b/Common/01DoWhatPlc/01_01DoWhatPlc.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32901.82 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "01_01DoWhatPlc", "01_01DoWhatPlc.csproj", "{0D1AF432-439A-4920-8692-43AE139F5530}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0D1AF432-439A-4920-8692-43AE139F5530}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0D1AF432-439A-4920-8692-43AE139F5530}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D1AF432-439A-4920-8692-43AE139F5530}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0D1AF432-439A-4920-8692-43AE139F5530}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {7D43C0BB-C1DA-4B44-BB33-44E7909A8DE2} + EndGlobalSection +EndGlobal diff --git a/Common/01DoWhatPlc/DoWhat.cs b/Common/01DoWhatPlc/DoWhat.cs new file mode 100644 index 0000000..2c89006 --- /dev/null +++ b/Common/01DoWhatPlc/DoWhat.cs @@ -0,0 +1,1408 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + + +namespace DoWhatPlc +{ + + public class MessageText + { + /// + /// Source|Cmd|OpName|TagValue + /// + /// + /// + public static List GetCmdStringList(string cmd) + { + List list = new List(); + string item; + int index; + try + { + index = cmd.IndexOf('|'); + item = cmd.Substring(0, index); + list.Add(item); + + cmd = cmd.Substring(index + 1); + index = cmd.IndexOf('|'); + item = cmd.Substring(0, index); + list.Add(item); + + cmd = cmd.Substring(index + 1); + index = cmd.IndexOf('|'); + item = cmd.Substring(0, index); + list.Add(item); + + item = cmd.Substring(index + 1); + + list.Add(item); + + } + catch { } + + + return list; + } + public string CmdType + { + get; + set; + } + public string Command + { + get; + set; + } + public string OpName + { + get; + set; + } + public string Value + { + get; + set; + } + } + public class ReturnResult + { + public bool success + { + get; + set; + } + public ReturnResult(bool success, string ResponseMessage) + { + this.success = success; + this.ResponseMessage = ResponseMessage; + } + public string ResponseMessage + { + get; + set; + } + } + public class EngineValue + { + public string OpName { set; get; } + public string EngineID { set; get; } + public string EngineType { set; get; } + public int EngineTypeID { set; get; } + public int PalletCode { set; get; } + public int ProcessCode { set; get; } + public int PartPalletCode { set; get; } + public string PalletInfo { set; get; } + /// + /// 显示返修标志 + /// + public int RepairPartStatusPLC { set; get; } + /// + /// 1 合格;2 不合格 + /// + public int QualityMask { set; get; } + + public string OrderForm { set; get; } + } + public class DoWhat + { + public const string ReadPLC_TagID = "ReadPLC_TagID"; + public const string WritePLC_TagID = "WritePLC_TagID"; + public const string ReadPLC_TagTypeCodeID = "ReadPLC_TagTypeCodeID"; + public const string WritePLC_TagTypeCodeID = "WritePLC_TagTypeCodeID"; + public const string ReadPLC_Cmd = "ReadPLC_Cmd"; + public const string WritePLC_Cmd = "WritePLC_Cmd"; + public const string ReadPLC_GroupData = "ReadPLC_GroupData"; + public const string ReadPLC_GroupMonitor = "ReadPLC_GroupMonitor"; + public const string ReadPLC_IpTag = "ReadPLC_IpTag"; + public const string ReadPLC_IpMonitorTag = "ReadPLC_IpMonitorTag"; + public const string ReadQualityDataList = "ReadQualityDataList"; + public const string ReadByteData_Op = "ReadByteData_Op"; + public const string ReadByteData_Ip = "ReadByteData_Ip"; + public const string WritePLC_Bytes_Op = "WritePLC_Bytes_Op"; + public const string WritePLC_Bytes_Ip = "WritePLC_Bytes_Ip"; + public const string IpAllTag = "IpAllTag"; + public const string IpMonitorTag = "IpMonitorTag"; + public const string RegionRead = "RegionRead"; + public const string ReadBytes = "ReadBytes"; + public const string WriteBytes = "WriteBytes"; + } + /// + /// object 类型数据转换成字符串变量表达 + /// + public class ReturnValueString + { + public string TagID { set; get; } + public string TagValue { set; get; } + public string ValueType { set; get; } + public string OpName { set; get; } + public string TimeStamp { set; get; } + public string TagTypeCodeID { set; get; } + public string TagTypeID { set; get; } + /// + /// 测量项目 TEXT1 报警的 工步内容 + /// + public string ItemName { set; get; } + /// + /// 测量位置 TEXT2 报警的 工步号 + /// + public string ShaftID { set; get; } + /// + /// 列位置 工步 工位工步分类 + /// + public string TagOrderBy { set; get; } + + + public string TagValueBefore { get; set; } + public string TimeStampBefore { get; set; } + public string TagName { get; set; } + + + /// + /// 变量变化的持续时间,单位 毫秒 + /// + public string TagKeepTime; + public string FunName; + public string FunCmd; + public string MesServerCode; + public string CmdPlcReadWrite; + public ReturnValueString() + { + + } + public ReturnValueString(string tagID, object tagValue, string opName = "", string tagTypeCodeID = "", string tagTypeID = "", string tagKeepTime = "", + string funName = "", string funCmd = "", string mesServerCode = "", string timeStamp = "", + string timeStampBefore = "", string tagValueBefore = "", string tagName = "",string itemName="", + string shaftID = "", string tagOrderBy = "") + { + TagTypeCodeID = tagTypeCodeID; + TagTypeID = tagTypeID; + TagValue = tagValue.ToString(); + ValueType = tagValue.GetType().Name; + TagID = tagID; + OpName = opName; + TagKeepTime = tagKeepTime; + FunName = funName; + FunCmd = funCmd; + MesServerCode = mesServerCode; + TimeStamp = timeStamp; + TimeStampBefore = timeStampBefore; + TagName = tagName; + TagValueBefore = tagValueBefore; + ItemName = itemName; + ShaftID = shaftID; + TagOrderBy = tagOrderBy; + } + public ReturnValueObject ReturnValueToObject() + { + ReturnValueObject ro = new ReturnValueObject(TagID, TagValue, OpName, TagTypeCodeID, ValueType, TimeStamp, TimeStampBefore, TagKeepTime, TagValueBefore, TagName, ItemName, ShaftID); + + return ro; + } + + + } + /// + /// 字符串变量转变成object类型变量 + /// + public class ReturnValueObject + { + public string TagID { set; get; } + public object TagValue { set; get; } + public string ValueType { set; get; } + public string OpName { set; get; } + public DateTime TimeStamp { set; get; } + public string TagTypeCodeID { set; get; } + /// + /// 变量变化的持续时间,单位 毫秒 + /// + public int TagKeepTime; + + public object TagValueBefore { get; set; } + public DateTime TimeStampBefore { get; set; } + /// + /// + /// + public string TagName { get; set; } + /// + /// 测量项目 TEXT2 报警的 工步内容 + /// + public string ItemName { set; get; } + /// + /// + /// + public string ShaftID { set; get; } + public string TagOrderBy { set; get; } + public ReturnValueObject(string tagID, string tagValue, string opName = "", string tagTypeCodeID = "", string valueType = "", + string timeStamp = "", string timeStampBefore = "", string tagKeepTime="", string tagValueBefore = "", + string tagName = "", string itemName = "", string shaftID = "", string tagOrderBy = "") + { + TagValue = GetTypeValue(valueType, tagValue); + if (tagValueBefore != null) + { + TagValueBefore = GetTypeValue(valueType, tagValueBefore); + } + ValueType = valueType; + TagID = tagID; + OpName = opName; + try + { + TimeStamp = Convert.ToDateTime(timeStamp); + } + catch + { + TimeStamp = DateTime.Now; + + } + try + { + TimeStampBefore = Convert.ToDateTime(timeStampBefore); + } + catch + { + TimeStampBefore = DateTime.Now; + + } + TagTypeCodeID = tagTypeCodeID; + TagName = tagName; + ItemName = itemName; + ShaftID = shaftID; + TagOrderBy = tagOrderBy; + TagKeepTime = Convert.ToInt32( tagKeepTime); + + } + + + public ReturnValueString ReturnValueToString() + { + ReturnValueString rs = new ReturnValueString(TagID, TagValue, OpName, TagTypeCodeID); + return rs; + } + public static object GetTypeValue(string type, string tagValue) + { + object tagV = "-1"; + if (type == null) + { + tagV = tagValue; + } + switch (type.ToLower()) + { + case "bool": + case "boolean": + tagV = false; + switch (tagValue.ToLower()) + { + case "1": + case "true": + tagV = true; + break; + case "0": + case "false": + tagV = false; + break; + } + return tagV; + //return Type.GetType(" System.Boolean ", true, true); + case "byte ": + return Convert.ToByte(tagValue); + case "sbyte": + return Convert.ToSByte(tagValue); + case "char": + return Convert.ToChar(tagValue); + case "decimal": + return Convert.ToDecimal(tagValue); + case "double": + return Convert.ToDouble(tagValue); + case "float": + return Convert.ToSingle(tagValue); + case "int": + return Convert.ToInt32(tagValue); + case "int16": + return Convert.ToInt32(tagValue); + case "uint": + return Convert.ToUInt32(tagValue); + case "long": + return Convert.ToInt64(tagValue); + case "ulong": + return Convert.ToUInt64(tagValue); + case "object": + return tagValue; + case "short": + return Convert.ToInt16(tagValue); + case "ushort": + return Convert.ToUInt16(tagValue); + case "string": + return tagValue; + case "date": + case "datetime": + return Convert.ToDateTime(tagValue); + case "guid": + return tagValue; + default: + return tagValue; + } + } + + + } + + public class TagIDTagFormat + { + public string TagID; + public TagFormat TF; + + public TagIDTagFormat(string tagID, TagFormat tF) + { + TagID = tagID; + TF = tF; + } + } + + + public class QualityDataSaveList + { + public Hashtable valuList; + public DataTable BasicDataTagValue; + public DataTable BasicDataTagValueUpDown; + public Hashtable hashtable_EngineTypeID; + public Hashtable hashtable_tagTable_OpName_SaveData; + } + + + + public struct ControlData + { + public int TagType; + public string opName; + public Control btn; public ControlData(Control Ctrl, string OpName) + { + string[] Array_NameSplit; + Array_NameSplit = Ctrl.Name.Split('_'); + TagType = Convert.ToInt32(Array_NameSplit[2]); + opName = OpName; + btn = Ctrl; + + } + } + + public struct ControlChangeByTagType + { + public ControlChangeByTagType(int tagType, string value) + { + TagType = tagType; + Value = value; + } + + public int TagType; + public string Value; + } + /// + /// tag格式化结构 + /// + public struct TagFormat + { + /// + /// TagID + /// + public string TagID; + /// + /// TagID + /// + public string TagName; + /// + /// 工位号 + /// + public string OpName; + /// + /// 数据来源 + /// + public string DataSources; + /// + /// IP + /// + public string IP; + /// + /// OPC的URL + /// + public string OpcIpPort; + /// + /// 组 + /// + public string Group; + /// + /// 监控时间间隔 + /// + public string MonitorInterval; + /// + /// DB号加起始地址,DB1001.30 + /// + public string TagDbAndStartAdr; + /// + /// DB号加起始地址,DB1001.30.1,为了bool写入专用 + /// + public string TagDbAndStartAdrWrite; + /// + /// OPC协议地址 + /// 例如:S7:[192.168.1.211|VFD1|S7ONLINE|01.00,192.168.1.211,02.02,1]DB1001,DINT154 + /// + public string TagOPCAdrStr; + /// + /// DB地址位置 + /// 变量起始地址,例如 0,1,2,56,80... + /// + public int Index; + /// + /// 变量字节长度 + /// 变量字节长度,l例如 1,2,4... + /// + public int Length; + /// + /// X 0,1,2,3,4,5,6,7 + /// 例如 X 0,1,2,3,4,5,6,7 + /// + public int BitIndex; + /// + /// 以连续Byte数组方式读取的DB地址实际位置 + /// 变量起始地址,例如 0,1,2,56,80... + /// + public int IndexBytes; + /// + /// 绝对地址差分,应用区域读取的拆分20200101_LLX + /// + public int AbsAddrDiff; + + + + /// + /// 点类型代码 + /// 比如bool是11,String是8 + /// + public int TagTypeID; + /// + /// 点类型 + /// 比如Bool,INT,STRING等 + /// + public string TagType; + /// + /// 变量类型代码 + /// 比如:允许保存是19 + /// + public int TagTypeCodeID; + /// + /// Value + /// + public object TagValue; + /// + /// 是否监控 + /// + public int IsMonitor; + + + + + + /// + /// 时间戳 + /// + public DateTime TimeStamp; + /// + /// 标签质量 192 , -1 + /// + public string TagQuality; + /// + /// 测量位置 + /// + public string ShaftID; + /// + /// 测量项目 + /// + public string ItemName; + /// + /// 测量单位 + /// + public string Unit; + /// + /// 上限值 + /// + public string TagValueUp; + /// + /// 下限值 + /// + public string TagValueDown; + /// + /// 理论值 + /// + public string TagValeNormal; + /// + /// 合格标志 + /// + public string IsGoodBad; + /// + /// 列位置 + /// + public string TagOrderBy; + /// + /// 变量排序 + /// + public string TagItemOrderBy; + /// + /// 是保存到数据库 + /// + public int IsSaveToSql; + /// + /// 是发送到WebSocket + /// + public int IsWebSocket; + /// + /// 是程序启动时候的值 + /// + public int IsFirstValue; + /// + /// 变量特点 + /// + public int TagProperty; + /// + /// 变量变化的持续时间,单位 毫秒 + /// + public int TagKeepTime; + /// + /// 变量变化前的值 + /// + public object TagValueBefore; + + } + + public class CustomeEvetnArgs : EventArgs + { + public int TagKeepTime { get; set; } + public object TagProperty { get; set; } + public object TagItemOrderBy { get; set; } + public object TagOrderBy { get; set; } + public object IsGoodBad { get; set; } + public object TagValeNormal { get; set; } + public object TagValueDown { get; set; } + public object TagValueUp { get; set; } + public object Unit { get; set; } + public object ItemName { get; set; } + public object ShaftID { get; set; } + public object IsMonitor { get; set; } + public object TagTypeActual { get; set; } + public object TagValueBefore { get; set; } + public object IsFirstValue { get; set; } + public object IsSaveToSql { get; set; } + public object DataDources { get; set; } + public object TagTypeID { get; set; } + public object TagTypeCodeID { get; set; } + public object TagID { get; set; } + public string TimeStamp { get; set; } + public object TagQuality { get; set; } + public object OpName { get; set; } + public object TagValue { get; set; } + public object TagValueType { get; set; } + public object TagType { get; set; } + public object TagName { get; set; } + public object TagKey { get; set; } + public object IsWebSocket { get; set; } + public string TimeStampBefore { get; set; } + } + + public class QualityDataType + { + public int tagValueType; + public int tagTypeID; + public string opName; + public string tagID; + public object tagValue; + public int tagQuality; + public int tagOrderBy; + public int tagItemOrderBy; + public int tagProperty; + public int isGoodBad; + } + + public class HashtableList + { + /// + /// MesServerCode + /// + static public Hashtable hashtable_MesServerCode_Temp; + /// + /// MesDll + /// + static public Hashtable hashtable_MesDll_Temp; + static public NameValueCollection hashtable_TagTypeDataType_Temp; + static public NameValueCollection hashtable_TagType_Temp; + static public Hashtable hashtable_TagTypeTagName_Temp; + + static public Hashtable hashtable_EngineGetOver_EngineTypeID_Temp; + static public Hashtable hashtable_EngineGetOver_EngineType_Temp; + static public Hashtable hashtable_EngineGetOver_EngineID_Temp; + static public Hashtable hashtable_EngineGetOver_OrderForm_Temp; + + static public Hashtable hashtable_OpNameRepair_Temp; + + static public Hashtable hashtable_WorkGroupIndex_Temp; + static public Hashtable hashtable_workStepProperty_Temp; + static public Hashtable hashtable_QualityMesRead_Temp; + static public Hashtable hashtable_IsAllowWork_Temp; + /// + /// 工位号与工位上下线类型 + /// (0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + /// 5 分线上线(总线) 6 分线上线(分线) + /// + static public Hashtable hashtableOpName_OpType_Temp; + + static public Hashtable hashtable_tagTable_OpName_SaveData_Temp; + + + public Hashtable hashtable_tagTable_OpName_SaveData; + + + ///
+ /// + /// 工位号与工位上下线类型 + /// (0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + /// 5 分线上线(总线) 6 分线上线(分线) + /// + public Hashtable hashtableOpName_OpType; + public Hashtable hashtable_IsAllowWork; + public Hashtable hashtable_QualityMesRead; + public Hashtable hashtable_workStepProperty; + public Hashtable hashtable_OpNameRepair; + /// + /// MesServerCode + /// + public Hashtable hashtable_MesServerCode; + public Hashtable hashtable_TagTypeTagName; + + /// + /// MesDll + /// + public Hashtable hashtable_MesDll; + public NameValueCollection hashtable_TagTypeDataType; + public NameValueCollection hashtable_TagType; + + + public Hashtable hashtable_EngineGetOver_EngineTypeID; + public Hashtable hashtable_EngineGetOver_EngineType; + public Hashtable hashtable_EngineGetOver_EngineID; + public Hashtable hashtable_EngineGetOver_OrderForm; + + public Hashtable hashtable_WorkGroupIndex; + + public DataTable BasicDataTagValue; + public DataTable BasicDataTagValueUpDown; + public Hashtable hashtable_EngineTypeID; + } + + public struct QualityDataQueryStruct + { + + public QualityDataQueryStruct(string opName, Control ctrl) + { + OpName = opName; + Ctrl = ctrl; + tagType = 0; + tagValue = ""; + tagID = ""; + tagTypeID = 0; + tempForm = null; + tagValue2 = null; + + } + + public QualityDataQueryStruct(string opName, int TagType) + { + + OpName = opName; + Ctrl = null; + tagType = TagType; + tagValue = ""; + tagID = ""; + tagTypeID = 0; + tempForm = null; + tagValue2 = null; + } + + public QualityDataQueryStruct(string opName, int TagType, Control ctrl) + { + + OpName = opName; + Ctrl = ctrl; + tagType = TagType; + tagValue = ""; + tagID = ""; + tagTypeID = 0; + tempForm = null; + tagValue2 = null; + } + public QualityDataQueryStruct(string opName, int TagType, object TagValue) + { + + OpName = opName; + Ctrl = null; + tagType = TagType; + tagValue = TagValue; + tagID = ""; + tagTypeID = 0; + tempForm = null; + tagValue2 = null; + } + public QualityDataQueryStruct(string TagID, int TagTypeID, object TagValue, object TagValue2, Form TempForm) + { + + OpName = ""; + Ctrl = null; + tagType = 0; + tagValue = TagValue; + tagID = TagID; + tagTypeID = TagTypeID; + tempForm = TempForm; + tagValue2 = TagValue2; + } + + + public string OpName; + public Control Ctrl; + public int tagType; + public object tagValue; + public object tagValue2; + public string tagID; + public int tagTypeID; + public Form tempForm; + + + } +} + + + +namespace DoWhatPlc1 +{ + public class EngineValue + { + public string OpName { set; get; } + public string EngineID { set; get; } + public string EngineType { set; get; } + public int EngineTypeID { set; get; } + public int PalletCode { set; get; } + public int ProcessCode { set; get; } + public int PartPalletCode { set; get; } + public string PalletInfo { set; get; } + /// + /// 显示返修标志 + /// + public int RepairPartStatusPLC { set; get; } + /// + /// 1 合格;2 不合格 + /// + public int QualityMask { set; get; } + + public string OrderForm { set; get; } + } + public class DoWhat + { + public const string ReadPLC_TagID = "ReadPLC_TagID"; + public const string WritePLC_TagID = "WritePLC_TagID"; + public const string ReadPLC_TagTypeCodeID = "ReadPLC_TagTypeCodeID"; + public const string WritePLC_TagTypeCodeID = "WritePLC_TagTypeCodeID"; + public const string ReadPLC_Cmd = "ReadPLC_Cmd"; + public const string WritePLC_Cmd = "WritePLC_Cmd"; + public const string ReadPLC_GroupData = "ReadPLC_GroupData"; + public const string ReadPLC_GroupMonitor = "ReadPLC_GroupMonitor"; + public const string ReadPLC_IpTag = "ReadPLC_IpTag"; + public const string ReadPLC_IpMonitorTag = "ReadPLC_IpMonitorTag"; + public const string ReadQualityDataList = "ReadQualityDataList"; + public const string ReadByteData_Op = "ReadByteData_Op"; + public const string ReadByteData_Ip = "ReadByteData_Ip"; + public const string WritePLC_Bytes_Op = "WritePLC_Bytes_Op"; + public const string WritePLC_Bytes_Ip = "WritePLC_Bytes_Ip"; + public const string IpAllTag = "IpAllTag"; + public const string IpMonitorTag = "IpMonitorTag"; + public const string RegionRead = "RegionRead"; + public const string ReadBytes = "ReadBytes"; + public const string WriteBytes = "WriteBytes"; + } + /// + /// object 类型数据转换成字符串变量表达 + /// + public class ReturnValueString + { + public string TagID { set; get; } + public string TagValue { set; get; } + public string ValueType { set; get; } + public string OpName { set; get; } + public string TimeStamp { set; get; } + public string TagTypeCodeID { set; get; } + public string TagTypeID { set; get; } + /// + /// 变量变化的持续时间,单位 毫秒 + /// + public string TagKeepTime; + public string FunName; + public string FunCmd; + public string MesServerCode; + public string CmdPlcReadWrite; + public ReturnValueString() + { + + } + public ReturnValueString(string tagID, object tagValue, string opName = "", string tagTypeCodeID = "", string tagTypeID = "", string tagKeepTime = "", string funName = "", string funCmd = "", string mesServerCode = "") + { + TagTypeCodeID = tagTypeCodeID; + TagTypeID = tagTypeID; + TagValue = tagValue.ToString(); + ValueType = tagValue.GetType().Name; + TagID = tagID; + OpName = opName; + TagKeepTime = tagKeepTime; + FunName = funName; + FunCmd = funCmd; + MesServerCode = mesServerCode; + TimeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"); + } + + public ReturnValueObject ReturnValueToObject() + { + ReturnValueObject ro = new ReturnValueObject(TagID, TagValue, OpName, TagTypeCodeID, ValueType, TimeStamp); + + return ro; + } + + } + /// + /// 字符串变量转变成object类型变量 + /// + public class ReturnValueObject + { + public string TagID { set; get; } + public object TagValue { set; get; } + public string ValueType { set; get; } + public string OpName { set; get; } + public DateTime TimeStamp { set; get; } + public string TagTypeCodeID { set; get; } + /// + /// 变量变化的持续时间,单位 毫秒 + /// + public int TagKeepTime; + + public ReturnValueObject(string tagID, string tagValue, string opName = "", string tagTypeCodeID = "", string valueType = "", string timeStamp = "") + { + TagValue = GetTypeValue(valueType, tagValue); + ValueType = valueType; + TagID = tagID; + OpName = opName; + try + { + TimeStamp = Convert.ToDateTime(timeStamp); + } + catch + { + TimeStamp = DateTime.Now; + + } + TagTypeCodeID = tagTypeCodeID; + + } + + public ReturnValueString ReturnValueToString() + { + ReturnValueString rs = new ReturnValueString(TagID, TagValue, OpName, TagTypeCodeID); + return rs; + } + public static object GetTypeValue(string type, string tagValue) + { + object tagV = "-1"; + if (type == null) + { + tagV = tagValue; + } + switch (type.ToLower()) + { + case "bool": + case "boolean": + tagV = false; + switch (tagValue.ToLower()) + { + case "1": + case "true": + tagV = true; + break; + case "0": + case "false": + tagV = false; + break; + } + return tagV; + //return Type.GetType(" System.Boolean ", true, true); + case "byte ": + return Convert.ToByte(tagValue); + case "sbyte": + return Convert.ToSByte(tagValue); + case "char": + return Convert.ToChar(tagValue); + case "decimal": + return Convert.ToDecimal(tagValue); + case "double": + return Convert.ToDouble(tagValue); + case "float": + return Convert.ToSingle(tagValue); + case "int": + return Convert.ToInt32(tagValue); + case "int16": + return Convert.ToInt32(tagValue); + case "uint": + return Convert.ToUInt32(tagValue); + case "long": + return Convert.ToInt64(tagValue); + case "ulong": + return Convert.ToUInt64(tagValue); + case "object": + return tagValue; + case "short": + return Convert.ToInt16(tagValue); + case "ushort": + return Convert.ToUInt16(tagValue); + case "string": + return tagValue; + case "date": + case "datetime": + return Convert.ToDateTime(tagValue); + case "guid": + return tagValue; + default: + return tagValue; + } + } + + + } + + public class TagIDTagFormat + { + public string TagID; + public TagFormat TF; + + public TagIDTagFormat(string tagID, TagFormat tF) + { + TagID = tagID; + TF = tF; + } + } + + + public class QualityDataSaveList + { + public Hashtable valuList; + public DataTable BasicDataTagValue; + public DataTable BasicDataTagValueUpDown; + public Hashtable hashtable_EngineTypeID; + public Hashtable hashtable_tagTable_OpName_SaveData; + } + + + + public struct ControlData + { + public int TagType; + public string opName; + public Control btn; public ControlData(Control Ctrl, string OpName) + { + string[] Array_NameSplit; + Array_NameSplit = Ctrl.Name.Split('_'); + TagType = Convert.ToInt32(Array_NameSplit[2]); + opName = OpName; + btn = Ctrl; + + } + } + public struct ControlChangeByTagType + { + public ControlChangeByTagType(int tagType, string value) + { + TagType = tagType; + Value = value; + } + + public int TagType; + public string Value; + } + /// + /// tag格式化结构 + /// + public struct TagFormat + { + /// + /// TagID + /// + public string TagID; + /// + /// TagID + /// + public string TagName; + /// + /// 工位号 + /// + public string OpName; + /// + /// 数据来源 + /// + public string DataSources; + /// + /// IP + /// + public string IP; + /// + /// OPC的URL + /// + public string OpcIpPort; + /// + /// 组 + /// + public string Group; + /// + /// 监控时间间隔 + /// + public string MonitorInterval; + /// + /// DB号加起始地址,DB1001.30 + /// + public string TagDbAndStartAdr; + /// + /// DB号加起始地址,DB1001.30.1,为了bool写入专用 + /// + public string TagDbAndStartAdrWrite; + /// + /// OPC协议地址 + /// 例如:S7:[192.168.1.211|VFD1|S7ONLINE|01.00,192.168.1.211,02.02,1]DB1001,DINT154 + /// + public string TagOPCAdrStr; + /// + /// DB地址位置 + /// 变量起始地址,例如 0,1,2,56,80... + /// + public int Index; + /// + /// 变量字节长度 + /// 变量字节长度,l例如 1,2,4... + /// + public int Length; + /// + /// X 0,1,2,3,4,5,6,7 + /// 例如 X 0,1,2,3,4,5,6,7 + /// + public int BitIndex; + /// + /// 以连续Byte数组方式读取的DB地址实际位置 + /// 变量起始地址,例如 0,1,2,56,80... + /// + public int IndexBytes; + /// + /// 绝对地址差分,应用区域读取的拆分20200101_LLX + /// + public int AbsAddrDiff; + + + + /// + /// 点类型代码 + /// 比如bool是11,String是8 + /// + public int TagTypeID; + /// + /// 点类型 + /// 比如Bool,INT,STRING等 + /// + public string TagType; + /// + /// 变量类型代码 + /// 比如:允许保存是19 + /// + public int TagTypeCodeID; + /// + /// Value + /// + public object TagValue; + /// + /// 是否监控 + /// + public int IsMonitor; + + + + + + /// + /// 时间戳 + /// + public DateTime TimeStamp; + /// + /// 标签质量 192 , -1 + /// + public string TagQuality; + /// + /// 测量位置 + /// + public string ShaftID; + /// + /// 测量项目 + /// + public string ItemName; + /// + /// 测量单位 + /// + public string Unit; + /// + /// 上限值 + /// + public string TagValueUp; + /// + /// 下限值 + /// + public string TagValueDown; + /// + /// 理论值 + /// + public string TagValeNormal; + /// + /// 合格标志 + /// + public string IsGoodBad; + /// + /// 列位置 + /// + public string TagOrderBy; + /// + /// 变量排序 + /// + public string TagItemOrderBy; + /// + /// 是保存到数据库 + /// + public int IsSaveToSql; + /// + /// 是发送到WebSocket + /// + public int IsWebSocket; + /// + /// 是程序启动时候的值 + /// + public int IsFirstValue; + /// + /// 变量特点 + /// + public int TagProperty; + /// + /// 变量变化的持续时间,单位 毫秒 + /// + public int TagKeepTime; + /// + /// 变量变化前的值 + /// + public object TagValueBefore; + + } + + public class CustomeEvetnArgs : EventArgs + { + public int TagKeepTime { get; set; } + public object TagProperty { get; set; } + public object TagItemOrderBy { get; set; } + public object TagOrderBy { get; set; } + public object IsGoodBad { get; set; } + public object TagValeNormal { get; set; } + public object TagValueDown { get; set; } + public object TagValueUp { get; set; } + public object Unit { get; set; } + public object ItemName { get; set; } + public object ShaftID { get; set; } + public object IsMonitor { get; set; } + public object TagTypeActual { get; set; } + public object TagValueBefore { get; set; } + public object IsFirstValue { get; set; } + public object IsSaveToSql { get; set; } + public object DataDources { get; set; } + public object TagTypeID { get; set; } + public object TagTypeCodeID { get; set; } + public object TagID { get; set; } + public string TimeStamp { get; set; } + public object TagQuality { get; set; } + public object OpName { get; set; } + public object TagValue { get; set; } + public object TagValueType { get; set; } + public object TagType { get; set; } + public object TagName { get; set; } + public object TagKey { get; set; } + public object IsWebSocket { get; set; } + public string TimeStampBefore { get; set; } + } + + public class QualityDataType + { + public int tagValueType; + public int tagTypeID; + public string opName; + public string tagID; + public object tagValue; + public int tagQuality; + public int tagOrderBy; + public int tagItemOrderBy; + public int tagProperty; + public int isGoodBad; + } + + public class HashtableList + { + /// + /// MesServerCode + /// + static public Hashtable hashtable_MesServerCode_Temp; + /// + /// MesDll + /// + static public Hashtable hashtable_MesDll_Temp; + static public Hashtable hashtable_TagTypeDataType_Temp; + static public Hashtable hashtable_TagType_Temp; + + static public Hashtable hashtable_EngineGetOver_EngineTypeID_Temp; + static public Hashtable hashtable_EngineGetOver_EngineType_Temp; + static public Hashtable hashtable_EngineGetOver_EngineID_Temp; + static public Hashtable hashtable_EngineGetOver_OrderForm_Temp; + + static public Hashtable hashtable_OpNameRepair_Temp; + + static public Hashtable hashtable_WorkGroupIndex_Temp; + static public Hashtable hashtable_workStepProperty_Temp; + static public Hashtable hashtable_QualityMesRead_Temp; + static public Hashtable hashtable_IsAllowWork_Temp; + /// + /// 工位号与工位上下线类型 + /// (0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + /// 5 分线上线(总线) 6 分线上线(分线) + /// + static public Hashtable hashtableOpName_OpType_Temp; + + /// + /// + /// 工位号与工位上下线类型 + /// (0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + /// 5 分线上线(总线) 6 分线上线(分线) + /// + public Hashtable hashtableOpName_OpType; + public Hashtable hashtable_IsAllowWork; + public Hashtable hashtable_QualityMesRead; + public Hashtable hashtable_workStepProperty; + public Hashtable hashtable_OpNameRepair; + /// + /// MesServerCode + /// + public Hashtable hashtable_MesServerCode; + /// + /// MesDll + /// + public Hashtable hashtable_MesDll; + public Hashtable hashtable_TagTypeDataType; + public Hashtable hashtable_TagType; + + + public Hashtable hashtable_EngineGetOver_EngineTypeID; + public Hashtable hashtable_EngineGetOver_EngineType; + public Hashtable hashtable_EngineGetOver_EngineID; + public Hashtable hashtable_EngineGetOver_OrderForm; + + public Hashtable hashtable_WorkGroupIndex; + + + public DataTable BasicDataTagValue; + public DataTable BasicDataTagValueUpDown; + public Hashtable hashtable_EngineTypeID; + } + + public struct QualityDataQueryStruct + { + + public QualityDataQueryStruct(string opName, Control ctrl) + { + OpName = opName; + Ctrl = ctrl; + tagType = 0; + tagValue = ""; + tagID = ""; + tagTypeID = 0; + tempForm = null; + tagValue2 = null; + + } + + public QualityDataQueryStruct(string opName, int TagType) + { + + OpName = opName; + Ctrl = null; + tagType = TagType; + tagValue = ""; + tagID = ""; + tagTypeID = 0; + tempForm = null; + tagValue2 = null; + } + + public QualityDataQueryStruct(string opName, int TagType, Control ctrl) + { + + OpName = opName; + Ctrl = ctrl; + tagType = TagType; + tagValue = ""; + tagID = ""; + tagTypeID = 0; + tempForm = null; + tagValue2 = null; + } + public QualityDataQueryStruct(string opName, int TagType, object TagValue) + { + + OpName = opName; + Ctrl = null; + tagType = TagType; + tagValue = TagValue; + tagID = ""; + tagTypeID = 0; + tempForm = null; + tagValue2 = null; + } + public QualityDataQueryStruct(string TagID, int TagTypeID, object TagValue, object TagValue2, Form TempForm) + { + + OpName = ""; + Ctrl = null; + tagType = 0; + tagValue = TagValue; + tagID = TagID; + tagTypeID = TagTypeID; + tempForm = TempForm; + tagValue2 = TagValue2; + } + + + public string OpName; + public Control Ctrl; + public int tagType; + public object tagValue; + public object tagValue2; + public string tagID; + public int tagTypeID; + public Form tempForm; + + + } +} + + diff --git a/Common/01DoWhatPlc/Properties/AssemblyInfo.cs b/Common/01DoWhatPlc/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d89ceef --- /dev/null +++ b/Common/01DoWhatPlc/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("DoWhatPlc")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DoWhatPlc")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("0d1af432-439a-4920-8692-43ae139f5530")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Common/01DoWhatPlc/TagTypeCodeID.cs b/Common/01DoWhatPlc/TagTypeCodeID.cs new file mode 100644 index 0000000..2dd1a78 --- /dev/null +++ b/Common/01DoWhatPlc/TagTypeCodeID.cs @@ -0,0 +1,462 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +///1 X WorkStart 2 工件到位(PLC) 工件到位。托盘到达工位,并且托盘上有工件。 +///2 X RepairPartStatusPLC 3 RepairPartStatusPLC 备用 +///3 STRING RepairPathString 4 RepairPathString "工位返修字符串(121211112222111),前2位是西门子字符串格式,第一位是总长度,第二位是实际长度" +///4 X EngineTypeGetOverMES 5 传递机型(MES) MES传递总成信息给PLC(上线工位) +///5 X PartPalletGoOver 6 PartPalletGoOver 上线工位。0:正常工作;1:空托盘放行,PLC读取到此标志不走申请上线逻辑。 +///6 X MaterialVerifyOver 7 MaterialVerifyOver MES保存完质量数据,物料数据等与PLC信号交互完成后通知PLC,所以工步都完成,才可以放行工件,正常工作时工件放行的必要条件。 +///7 X FalseGo 8 FalseGo 按MES界面[不合格放行]按钮,MES发送此信号。操作者判断工件不合格,通知设备,按不合格方式放行工件,工件流转到返修下线工位后,返修下线。MES工作完成MES0.3=1,MES合格放行MES0.5=0,MES0.4=1 +///8 INT EngineTypeID 9 EngineTypeID MES发动机机型标志(必须PLC) +///9 STRING EngineID 10 EngineID MES发动机编号(必须PLC) +///10 STRING EngineType 11 机型(MES) MES发动机机型(必须PLC) +///11 X PartPalletStatus 13 PartPalletStatus MES激发变量托盘到位离开(必须PLC) +///12 X HeartBeatPLC 14 HeartBeatPLC 心跳处理:PLC收到MES心跳信号后,PLC延时5秒后,数值取反再写回PLC,写回PLC开始计时,如果5秒钟MES无反馈报通讯故障。 +///13 X HeartBeatMIS 15 HeartBeatMIS 间隔时间5S,心跳处理。收到PLC心跳信号后,MES按原值回写。PLC收到MES信号后延时5秒,取反写入,以此循环。 +///14 X TargetTimeRead 16 TargetTimeRead MES允许可读工位运行时间 +///15 Int MachineTargetTime 17 MachineTargetTime 目标运行时间 +///16 Int MachineActualTime 18 MachineActualTime 实际运行时间 +///17 X MesRead 19 允许保存(PLC) 质量数据可以读数据 +///18 X MesReadOver 20 保存完成(MES) MES保存完数据(必须MIS) +///19 INT QualityMask 21 合格标志(PLC) 质量数据工位合格标志0:没有工作;1:合格 ;2 :不合格(必须PLC) +///20 B PalletInfo 22 PalletInfo 0空托盘,1合格件,2不合格件 +///21 INT RepairStatusPLC 23 RepairStatusPLC 0正常件,1返修件 +///22 INT OrderNo 24 订单号(MES) 订单号(MES) +///23 X StorageNo 25 库位号(MES) 库位号(MES) +///24 X AllowPass 26 允许放行(MES) 允许放行 +///25 X PartLoadFinish 27 PartLoadFinish PartLoadFinish +///26 X Reserved_7 28 Reserved_7 备用 +///27 X Reserved_8 29 Reserved_8 备用 +///28 X Reserved_9 30 Reserved_9 备用 +///29 X Reserved_10 31 Reserved_10 备用 +///30 X Reserved_11 32 Reserved_11 备用 +///31 X Reserved_12 33 Reserved_12 备用 +///32 X Reserved_13 34 Reserved_13 备用 +///33 X Reserved_14 35 Reserved_14 备用 +///34 Int PLCSPareint1 36 PLCSPareint1 备用 +///35 Int PLCSPareint2 37 PLCSPareint2 备用 +///36 Int PLCSPareint3 38 PLCSPareint3 备用 +///37 STRING PLCSarestring1 39 PLCSarestring1 备用 +///38 STRING PLCSarestring2 40 PLCSarestring2 备用 +///39 STRING MarkID 42 MarkID 机体打标号(MES)前2位是西门子字符串格式,第一位是总长度,第二位是实际长度 +///40 X PartLoad 43 PartLoad 上线工位,PLC向MES申请总成编号。收到该信号后,MES将机型标志(DBB22 ~23)、总成号(DBB24 ~63)、总成机型DBB64 ~103写入PLC。之后MES通过信号“传递机型(DBX0.1)”通知PLC。 +///41 X EngineTypeGetOverPLC 44 传递机型(PLC) PLC将机型标志(DBB50…51)、工件编号(DBB52…101)、产品型号(DBB102…187)、托盘编号(DBB188…189)准备完毕后,通知MES。 +///42 X PartLoadOK 48 PartLoadOK 备用 +///43 X Reserved_18 49 Reserved_18 备用 +///44 X PalletDown 50 PalletDown 暂时保留,项目未使用 +///45 X ConfirmOkGo 51 ConfirmOkGo 按MES界面[合格放行]按钮,MES发送此信号。操作者判断工件合格,通知设备,工件按合格方式放行工件。MES工作完成MES0.3=1,MES合格放行MES0.5=1,MES0.4=0 +///46 X ResetDevice 52 ResetDevice 针对手动工位,无HMI,需要复位设备在MES页面操作。 +///47 X UnloadCompleted 53 UnloadCompleted 暂时保留,项目未使用 +///48 X MachineTime_ReadOver 54 MachineTime_ReadOver 备用 +///49 X Reserved_19 58 Reserved_19 备用 +///50 X FixOK 59 FixOK 手动拧紧工位,单工步螺栓拧紧完成,通知PC读取数据。 +///51 X Reserved_21 61 Reserved_21 备用 +///52 X Reserved_22 62 Reserved_22 备用 +///53 X Reserved_23 63 Reserved_23 备用 +///54 X Reserved_24 64 Reserved_24 备用 +///55 X Reserved_25 65 Reserved_25 备用 +///56 X FixAllow 66 FixAllow "设备工作的必须信号,对于有物料验证的工位,MES验证完成给出此信号,对于无物料验证工位,MES直接给出此信号。" +///57 X FixOver 67 FixOver 用于手动拧紧且有质量数据工位。通知设备当前工步拧紧螺钉工作结束。 +///58 X MatchingCompleted 68 MatchingCompleted 分线上总线,匹配成功是1;不成功是0。 +///59 X Match 69 Match 分线上总线,匹配成功是1;不成功是0。 +///60 X Reserved_2 70 Reserved_2 备用 +///61 X IsAutoGetEngineID 71 IsAutoGetEngineID 自动手动申请工件编号。0是自动方式;1:手动方式。暂时保留,生成流水号方式是在数据库中实现的 +///62 X RepairUplineMES 72 RepairUplineMES 上线清空MOBY(针对上线工位):通知PLC从新开始申请上线流程 +///63 INT EngineTypeID_MES 73 机型代码(MES) MES发动机机型标志(必须MES) +///64 STRING EngineID_MES 74 工件编号(MES) MES发动机编号(必须MES) +///65 STRING EngineType_MES 75 EngineType_MES MES发动机机型(必须MES) +///66 X Reserved_20 76 Reserved_20 备用 +///67 INT ProcessCode 77 ProcessCode 手动拧紧工位:由MES通知PLC拧紧序号 +///68 B OnLineState 79 OnLineState 通过线体工位PC实现下达工位工作状态:工位有三种状态:在线、离线、屏蔽。在线:0正常状态,实现正常功能。1离线:设备脱离MES工作,进入不交互模式。 +///69 INT PartPalletCode 80 托盘号(MES) 托盘编号(B5A) +///70 INT BoltCode 88 BoltCode 手动拧紧工位:指导PLC所用套筒 +///71 INT RepairStatus 93 RepairStatus "0正常件,1返修件。对于上线工位MES给出是正常上线还是返修上线,返修路径" +///72 DInt Reserved_15 110 Reserved_15 备用 +///73 DInt Reserved_16 111 Reserved_16 备用 +///74 B Reserved_17 112 Reserved_17 备用 +///75 INT SPareint1 113 SPareint1 备用int1 +///76 INT SPareint2 114 SPareint2 备用int2 +///77 INT SPareint3 115 SPareint3 备用int3 +///78 STRING Sparestring1 116 Sparestring1 备用字符串1 +///79 STRING Sparestring2 117 Sparestring2 备用字符串2 +///80 X MachineStatusPutOn 1000 机床上电(PLC) 机床上电(必须PLC) +///81 X MachineStatusWorkOn 1001 循环开始(PLC) 循环开始(必须PLC) +///82 X MachineStatusAlarm 1002 设备报警(PLC) 机床故障(必须PLC) +///83 X MachineStatusNoPart 1003 MachineStatusNoPart 上料无件(必须PLC) +///84 X MachineStatusBlock 1004 MachineStatusBlock 下料堵塞(必须PLC) + + +namespace MesWork +{ + /// + /// 这是变量类型代码的配置,几乎是不变的 + /// 请不要随意修改,为了保证变量版本同一,并且方便维护,请联系发行人修改! + /// 请注意,此修改为全局修改! + /// + public enum EnumTagTypeCodeID + { + /// + /// 工件到位(PLC) + /// 变量类型:Bool + /// 解释:托盘到达工位,并且托盘上有工件。 + /// + WorkStart = 2, + /// + /// + /// + RepairPartStatusPLC = 3, + /// + /// 工位返修字符串 + /// 变量类型:String + /// 解释:工位返修字符串 + /// + RepairPathString = 4, + /// + /// 传递机型(MES) + /// 变量类型:Bool + /// 解释:MES传递总成信息给PLC(上线工位) + /// + EngineTypeGetOverMES = 5, + /// + /// + /// + PartPalletGoOver = 6, + /// + /// + /// + MaterialVerifyOver = 7, + /// + /// + /// + FalseGo = 8, + /// + /// + /// + EngineTypeID = 9, + /// + /// + /// + EngineID = 10, + /// + /// 机型(MES) + /// 变量类型:String + /// + EngineType = 11, + /// + /// + /// + PartPalletStatus = 13, + /// + /// + /// + HeartBeatPLC = 14, + /// + /// + /// + HeartBeatMIS = 15, + /// + /// + /// + TargetTimeRead = 16, + /// + /// + /// + MachineTargetTime = 17, + /// + /// + /// + MachineActualTime = 18, + /// + /// 允许保存(PLC) + /// 变量类型:Bool + /// + MesRead = 19, + /// + /// 保存完成(MES) + /// 变量类型:Bool + /// + MesReadOver = 20, + /// + /// 合格标志(PLC) + /// 变量类型:Int + /// + QualityMask = 21, + /// + /// + /// + PalletInfo = 22, + /// + /// + /// + RepairStatusPLC = 23, + /// + /// 订单号(MES) + /// 变量类型:Int + /// + OrderNo = 24, + /// + /// 库位号(MES) + /// 变量类型:Bool + /// + StorageNo = 25, + /// + /// 允许放行(MES) + /// 变量类型:Bool + /// + AllowPass = 26, + /// + /// + /// + PartLoadFinish = 27, + /// + /// + /// + Reserved_7 = 28, + /// + /// + /// + Reserved_8 = 29, + /// + /// + /// + Reserved_9 = 30, + /// + /// + /// + Reserved_10 = 31, + /// + /// + /// + Reserved_11 = 32, + /// + /// + /// + Reserved_12 = 33, + /// + /// + /// + Reserved_13 = 34, + /// + /// + /// + Reserved_14 = 35, + /// + /// + /// + PLCSPareint1 = 36, + /// + /// + /// + PLCSPareint2 = 37, + /// + /// + /// + PLCSPareint3 = 38, + /// + /// 订单号(PLC) + /// + OrderFormPLC = 39, + /// + /// + /// + PLCSarestring2 = 40, + /// + /// + /// + MarkID = 42, + /// + /// + /// + PartLoad = 43, + /// + /// 传递机型(PLC) + /// 变量类型:Bool + /// + EngineTypeGetOverPLC = 44, + /// + /// + /// + PartLoadOK = 48, + /// + /// + /// + Reserved_18 = 49, + /// + /// + /// + PalletDown = 50, + /// + /// + /// + ConfirmOkGo = 51, + /// + /// + /// + ResetDevice = 52, + /// + /// + /// + UnloadCompleted = 53, + /// + /// + /// + MachineTime_ReadOver = 54, + /// + /// + /// + Reserved_19 = 58, + /// + /// + /// + FixOK = 59, + /// + /// + /// + Reserved_21 = 61, + /// + /// + /// + Reserved_22 = 62, + /// + /// + /// + Reserved_23 = 63, + /// + /// + /// + Reserved_24 = 64, + /// + /// + /// + Reserved_25 = 65, + /// + /// + /// + FixAllow = 66, + /// + /// + /// + FixOver = 67, + /// + /// + /// + MatchingCompleted = 68, + /// + /// + /// + Match = 69, + /// + /// + /// + Reserved_2 = 70, + /// + /// + /// + IsAutoGetEngineID = 71, + /// + /// + /// + RepairUplineMES = 72, + /// + /// 机型代码(MES) + /// 变量类型:Int + /// + EngineTypeID_MES = 73, + /// + /// 工件编号(MES) + /// 变量类型:String + /// + EngineID_MES = 74, + /// + /// + /// + EngineType_MES = 75, + /// + /// + /// + Reserved_20 = 76, + /// + /// + /// + ProcessCode = 77, + /// + /// + /// + OnLineState = 79, + /// + /// 托盘号(MES) + /// 变量类型:Int + /// + PartPalletCode = 80, + /// + /// + /// + BoltCode = 88, + /// + /// + /// + RepairStatus = 93, + /// + /// + /// + Reserved_15 = 110, + /// + /// + /// + Reserved_16 = 111, + /// + /// + /// + Reserved_17 = 112, + /// + /// + /// + SPareint1 = 113, + /// + /// + /// + SPareint2 = 114, + /// + /// + /// + /// + /// MES订单号 + /// + OrdeFormMES = 116, + /// + /// + /// + Sparestring2 = 117, + /// + /// 机床上电(PLC) + /// 变量类型:Bool + /// + MachineStatusPutOn = 1000, + /// + /// 循环开始(PLC) + /// 变量类型:Bool + /// + MachineStatusWorkOn = 1001, + /// + /// 设备报警(PLC) + /// 变量类型:Bool + /// + MachineStatusAlarm = 1002, + /// + /// 上料无件(PLC) + /// 变量类型:Bool + /// + MachineStatusNoPart = 1003, + /// + /// 下料堵塞(PLC) + /// 变量类型:Bool + /// + MachineStatusBlock = 1004, + + + } +} diff --git a/Common/01DoWhatPlc/TagTypeID.cs b/Common/01DoWhatPlc/TagTypeID.cs new file mode 100644 index 0000000..b8800ac --- /dev/null +++ b/Common/01DoWhatPlc/TagTypeID.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesWork +{ + /// + /// 这是信号点类型代码的配置 + /// 这里是不变的,请不要随意修改!!! + /// 请注意,此修改为全局修改! + /// + public enum EnumTagTypeID + { + Int16 = 2, + Int32 = 3, + Float = 4, + UInt64 = 7, + String = 8, + Bool = 11, + Byte = 17, + UInt16 = 18, + Double = 19, + Bytes = 21, + + } +} diff --git a/Common/01DoWhatPlc/Utils.cs b/Common/01DoWhatPlc/Utils.cs new file mode 100644 index 0000000..594de2a --- /dev/null +++ b/Common/01DoWhatPlc/Utils.cs @@ -0,0 +1,82 @@ +using System.Text; + +public static class Utils + { + public static string UrlEncode(this string str) + { + var encoding = UTF8Encoding.UTF8; + byte[] bytes = encoding.GetBytes(str); + int IsSafe = 0; + int NoSafe = 0; + for (int i = 0; i < bytes.Length; i++) + { + char ch = (char)bytes[i]; + if (ch == ' ') + { + IsSafe++; + } + else if (!IsSafeChar(ch)) + { + NoSafe ++; + } + } + if (IsSafe== 0 && NoSafe == 0) + { + return str; + } + byte[] buffer = new byte[bytes.Length + (NoSafe * 2)]; + int num1 = 0; + for (int j = 0; j < bytes.Length; j++) + { + byte num2 = bytes[j]; + char ch2 = (char)num2; + if (IsSafeChar(ch2)) + { + buffer[num1++] = num2; + } + else if (ch2 == ' ') + { + buffer[num1++] = 0x2B; + } + else + { + buffer[num1++] = 0x25; + buffer[num1++] = (byte)IntToHex((num2 >> 4) & 15); + buffer[num1++] = (byte)IntToHex(num2 & 15); + } + } + return encoding.GetString(buffer); + } + + private static bool IsSafeChar(char ch) + { + if ((((ch < 'a') || (ch > 'z')) && ((ch < 'A') || (ch > 'Z'))) && ((ch < '0') || (ch > '9'))) + { + + switch (ch) + { + case '-': + case '.': + break; //安全字符 + case '+': + case ',': + return false; //非安全字符 + default: //非安全字符 + if (ch != '_') + { + return false; + } + break; + } + } + return true; + } + private static char IntToHex(int n) + { + if (n <= 9) + { + return (char)(n + 0x30); + } + return (char)((n - 10) + 0x41); + } + } diff --git a/Common/01DoWhatPlc/packages.config b/Common/01DoWhatPlc/packages.config new file mode 100644 index 0000000..376abb5 --- /dev/null +++ b/Common/01DoWhatPlc/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Common/02WebApiCall/02_02WebApiCallPLC.csproj b/Common/02WebApiCall/02_02WebApiCallPLC.csproj new file mode 100644 index 0000000..e2ceb49 --- /dev/null +++ b/Common/02WebApiCall/02_02WebApiCallPLC.csproj @@ -0,0 +1,110 @@ + + + + + Debug + AnyCPU + {3E6D1DD5-01C9-435F-9941-61F906CE35BB} + Library + WebApiCall + 02WebApiCall + v4.8 + 512 + true + true + + + + AnyCPU + true + full + false + ..\dll\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + + + Form1.cs + + + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + {1a10fdb2-1a6a-44a8-ab4d-33387563247e} + 00-0Json8.3.1 + + + {0d1af432-439a-4920-8692-43ae139f5530} + 01_01DoWhatPlc + + + + \ No newline at end of file diff --git a/Common/02WebApiCall/02_02WebApiCallPLC.sln b/Common/02WebApiCall/02_02WebApiCallPLC.sln new file mode 100644 index 0000000..aa4443a --- /dev/null +++ b/Common/02WebApiCall/02_02WebApiCallPLC.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32901.82 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "02_02WebApiCallPLC", "02_02WebApiCallPLC.csproj", "{3E6D1DD5-01C9-435F-9941-61F906CE35BB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3E6D1DD5-01C9-435F-9941-61F906CE35BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3E6D1DD5-01C9-435F-9941-61F906CE35BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3E6D1DD5-01C9-435F-9941-61F906CE35BB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3E6D1DD5-01C9-435F-9941-61F906CE35BB}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C034F50A-F3DF-47DC-ADB2-3724C1B74818} + EndGlobalSection +EndGlobal diff --git a/Common/02WebApiCall/App.config b/Common/02WebApiCall/App.config new file mode 100644 index 0000000..b740b86 --- /dev/null +++ b/Common/02WebApiCall/App.config @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Common/02WebApiCall/Form1.Designer.cs b/Common/02WebApiCall/Form1.Designer.cs new file mode 100644 index 0000000..6cec970 --- /dev/null +++ b/Common/02WebApiCall/Form1.Designer.cs @@ -0,0 +1,48 @@ + +namespace WebApiCall +{ + partial class Form1 + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 525); + this.Name = "Form1"; + this.Text = "Form1"; + this.ResumeLayout(false); + + } + + #endregion + } +} + diff --git a/Common/02WebApiCall/Form1.cs b/Common/02WebApiCall/Form1.cs new file mode 100644 index 0000000..7118c17 --- /dev/null +++ b/Common/02WebApiCall/Form1.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace WebApiCall +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + } +} diff --git a/Common/02WebApiCall/Form1.resx b/Common/02WebApiCall/Form1.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Common/02WebApiCall/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Common/02WebApiCall/Program.cs b/Common/02WebApiCall/Program.cs new file mode 100644 index 0000000..c6cff80 --- /dev/null +++ b/Common/02WebApiCall/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace WebApiCall +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} diff --git a/Common/02WebApiCall/Properties/AssemblyInfo.cs b/Common/02WebApiCall/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..7ca56e7 --- /dev/null +++ b/Common/02WebApiCall/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("WebApiCall")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("WebApiCall")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("3e6d1dd5-01c9-435f-9941-61f906ce35bb")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Common/02WebApiCall/Properties/Resources.Designer.cs b/Common/02WebApiCall/Properties/Resources.Designer.cs new file mode 100644 index 0000000..ab59e5c --- /dev/null +++ b/Common/02WebApiCall/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace WebApiCall.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WebApiCall.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Common/02WebApiCall/Properties/Resources.resx b/Common/02WebApiCall/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Common/02WebApiCall/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Common/02WebApiCall/Properties/Settings.Designer.cs b/Common/02WebApiCall/Properties/Settings.Designer.cs new file mode 100644 index 0000000..3cb3577 --- /dev/null +++ b/Common/02WebApiCall/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace WebApiCall.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.0.3.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Common/02WebApiCall/Properties/Settings.settings b/Common/02WebApiCall/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Common/02WebApiCall/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Common/02WebApiCall/WebApiCall/CallWebApi.SQLCommon.cs b/Common/02WebApiCall/WebApiCall/CallWebApi.SQLCommon.cs new file mode 100644 index 0000000..7fc62ac --- /dev/null +++ b/Common/02WebApiCall/WebApiCall/CallWebApi.SQLCommon.cs @@ -0,0 +1,132 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Data; +using System.Data.SqlClient; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +namespace DtWebApi +{ + public class DataAccess + { + + public static bool ExecuteNonQuery(StringCollection sql, string connectionString, out string errorMessage) + { + errorMessage = ""; + + string api = ""; + string type = "POST"; + string controlStr = "SQLCommon"; + string actionStr = "ExecuteNonQuery1"; + Dictionary dic = new Dictionary(); + dic.Add("sql", JsonConvert.SerializeObject(sql)); + + return new CallWebApi().InvokeWebapiBool(controlStr, actionStr, api, type, dic); + } + public static bool ExecuteNonQuery(string sql, string connectionString, out string errorMessage) + { + errorMessage = ""; + + string api = ""; + string type = "POST"; + string controlStr = "SQLCommon"; + string actionStr = "ExecuteNonQuery"; + Dictionary dic = new Dictionary(); + dic.Add("sql", sql); + + return new CallWebApi().InvokeWebapiBool(controlStr, actionStr, api, type, dic); + } + + + public static bool ExecuteOutNum(string sql, string connectionString, out int count, out string errorMessage) + { + errorMessage = ""; + + string api = ""; + string type = "POST"; + string controlStr = "SQLCommon"; + string actionStr = "ExecuteOutNum"; + Dictionary dic = new Dictionary(); + dic.Add("sql", sql); + + count = new CallWebApi().InvokeWebapiInt(controlStr, actionStr, api, type, dic); + return true; + } + + public static bool ExecuteDataset(string sql, string connectionString, out DataSet ds, out string errorMessage) + { + errorMessage = ""; + + string api = ""; + string type = "GET"; + string controlStr = "SQLCommon"; + string actionStr = "ExecuteDataset"; + Dictionary dic = new Dictionary(); + dic.Add("sql", sql); + ds = new CallWebApi().InvokeWebapiDataSet(controlStr, actionStr, api, type, dic); + return true; + } + + public static bool ExecuteDataTable(string sql, string connectionString, out DataTable dt, out string errorMessage) + { + errorMessage = ""; + + string api = ""; + string type = "GET"; + string controlStr = "SQLCommon"; + string actionStr = "ExecuteDataTable"; + Dictionary dic = new Dictionary(); + dic.Add("sql", sql); + dt = new CallWebApi().InvokeWebapiDataTable(controlStr, actionStr, api, type, dic); + return true; + } + + + public static bool ExecuteDataReader(string sql, string connectionString, out SqlDataReader dr, out string errorMessage) + { + errorMessage = ""; + + string api = ""; + string type = "GET"; + string controlStr = "SQLCommon"; + string actionStr = "ExecuteDataReader"; + Dictionary dic = new Dictionary(); + dic.Add("sql", sql); + dr = new CallWebApi().InvokeWebapiSqlDataReader(controlStr, actionStr, api, type, dic); + return true; + } + + public static bool ExecuteSql(string sql, string connectionString, out string errorMessage) + { + errorMessage = ""; + + string api = ""; + string type = "GET"; + string controlStr = "SQLCommon"; + string actionStr = "ExecuteSql"; + Dictionary dic = new Dictionary(); + dic.Add("sql", sql); + new CallWebApi().InvokeWebapiString(controlStr, actionStr, api, type, dic); + return true; + } + public static bool ExecuteSql(string sql, string connectionString, out DataTable dt, out string errorMessage) + { + errorMessage = ""; + + string api = ""; + string type = "GET"; + string controlStr = "SQLCommon"; + string actionStr = "ExecuteSqlDataTable"; + Dictionary dic = new Dictionary(); + dic.Add("sql", sql); + dt = new CallWebApi().InvokeWebapiDataTable(controlStr, actionStr, api, type, dic); + return true; + } + } +} diff --git a/Common/02WebApiCall/WebApiCall/CallWebApi.cs b/Common/02WebApiCall/WebApiCall/CallWebApi.cs new file mode 100644 index 0000000..f87b749 --- /dev/null +++ b/Common/02WebApiCall/WebApiCall/CallWebApi.cs @@ -0,0 +1,448 @@ +using DoWhatPlc; +using Newtonsoft.Json; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +namespace DtWebApi +{ + public class OutGUID + { + /// + /// 2021.10.25.LLX + /// + /// + public static string Get_CS_GUID() + { + return Guid.NewGuid().ToString().ToUpper(); + } + + } + public partial class CallWebApi + { + public string InvokeWebapiString(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + string result = task.Result; + return result; + } + public DataTable InvokeWebapiDataTable(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + var result = task.Result; + //反序列化Json + DataTable dt = new DataTable(); + dt = JsonConvert.DeserializeObject(task.Result); + return dt; + } + public DataSet InvokeWebapiDataSet(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + DataSet ds = new DataSet(); + try + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + var result = task.Result; + //反序列化Json + ds = JsonConvert.DeserializeObject(task.Result); + } + catch + { + + } + return ds; + + + } + + public SqlDataReader InvokeWebapiSqlDataReader(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + var result = task.Result; + //反序列化Json + SqlDataReader dr; + dr = JsonConvert.DeserializeObject(task.Result); + return dr; + } + + public bool InvokeWebapiBool(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + string result = task.Result; + return Convert.ToBoolean(result); + } + public int InvokeWebapiInt(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + string result = task.Result; + return Convert.ToInt32(result); + } + #region WinFrom调用webapi接口通用方法 + public EngineValue InvokeWebapiEngineValue(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + //反序列化Json + var rt = JsonConvert.DeserializeObject(task.Result); + return rt; + } + public ReturnValueObject InvokeWebapiReturnValueObject(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + //反序列化Json + var rs = JsonConvert.DeserializeObject(task.Result); + if (rs == null) return null; + var ro = rs.ReturnValueToObject(); + return ro; + } + public List InvokeWebapiReturnValueObjectList(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + //反序列化Json + var rsList = JsonConvert.DeserializeObject< List < ReturnValueString > >(task.Result); + List roList = new List(); + foreach(var rs in rsList) + { + var ro = rs.ReturnValueToObject(); + roList.Add(ro); + } + + return roList; + } + public void InvokeWebapiWritePLC(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + + } + //public List InvokeWebapiReturnValueObjectList(string controlStr, string actionStr, string api, string type, Dictionary dics) + //{ + // string url = GetUrlWebApi(controlStr, actionStr, dics); + // Task task = InvokeWebapi(url, api, type, dics); + // //反序列化Json + // var rtList = JsonConvert.DeserializeObject>(task.Result); + + // List roList = new List(); + // foreach(var rt in rtList) + // { + // var ro = rt.ReturnValueToObject(); + // roList.Add(ro); + // } + // return roList; + //} + + public HashtableList InvokeWebapiHashtableList(string controlStr, string actionStr, string api, string type, Dictionary dics = null) + { + try + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + //反序列化Json + var rtList = JsonConvert.DeserializeObject(task.Result); + + return rtList; + } + catch + { + return new HashtableList(); + } + + } + public List InvokeWebapiListTagFormat(string controlStr, string actionStr, string api, string type, Dictionary dics=null) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + //反序列化Json + var rtList = JsonConvert.DeserializeObject>(task.Result); + + return rtList; + } + public QualityDataSaveList InvokeWebapiQualityDataSaveList(string controlStr, string actionStr, string api, string type, Dictionary dics = null) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + //反序列化Json + var rtList = JsonConvert.DeserializeObject(task.Result); + + return rtList; + } + public List InvokeWebapiListString(string controlStr, string actionStr, string api, string type, Dictionary dics = null) + { + try + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + //反序列化Json + var rtList = JsonConvert.DeserializeObject>(task.Result); + + return rtList; + } + catch(Exception err) + { + return new List(); + + } + + } + + public ConcurrentDictionary InvokeWebapiConcurrentDictionaryTagFormat(string controlStr, string actionStr, string api, string type, Dictionary dics = null) + { + + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + //反序列化Json + var rtList = JsonConvert.DeserializeObject>(task.Result); + + return rtList; + } + + private async Task InvokeWebapi(string url, string api, string type, Dictionary dics) + { + string result = string.Empty; + HttpClient client = new HttpClient(); + client.DefaultRequestHeaders.Add("authorization", "Basic YWRtaW46cGFzc3dvcmRAcmljZW50LmNvbQ==");//basic编码后授权码 + client.BaseAddress = new Uri(url); + + client.Timeout = TimeSpan.FromSeconds(510); + + if (type.ToLower() == "put") + { + HttpResponseMessage response; + //包含复杂类型 + if (dics.Keys.Contains("input")) + { + if (dics != null) + { + foreach (var item in dics.Keys) + { + api = api.Replace(item, dics[item]).Replace("{", "").Replace("}", ""); + } + } + var contents = new StringContent(dics["input"], Encoding.UTF8, "application/json"); + response = client.PutAsync(api, contents).Result; + if (response.IsSuccessStatusCode) + { + result = await response.Content.ReadAsStringAsync(); + return result; + } + return result; + } + + var content = new FormUrlEncodedContent(dics); + response = client.PutAsync(api, content).Result; + if (response.IsSuccessStatusCode) + { + result = await response.Content.ReadAsStringAsync(); + return result; + } + } + else if (type.ToLower() == "post") + { + var content = new FormUrlEncodedContent(dics); + + HttpResponseMessage response = client.PostAsync(api, content).Result; + if (response.IsSuccessStatusCode) + { + result = await response.Content.ReadAsStringAsync(); + return result; + } + } + else if (type.ToLower() == "get") + { + HttpResponseMessage response = client.GetAsync(api).Result; + + if (response.IsSuccessStatusCode) + { + result = await response.Content.ReadAsStringAsync(); + return result; + } + } + else + { + return result; + } + return result; + } + #endregion + public static string Url_WebApi = System.Configuration.ConfigurationManager.AppSettings["Url_WebApi"]; + private string GetUrlWebApi(string controlStr,string actionStr,Dictionary dic=null) + { + string url = Url_WebApi + "//api//" + controlStr + "//"+actionStr; + //string url = Url_WebApi + "//api//" + controlStr+"1" + "//"+actionStr; + StringBuilder builder = new StringBuilder(); + int i = 0; + if(dic!=null) + { + foreach (var item in dic) + { + string item_Value = Utils.UrlEncode(item.Value); + + if (i > 0) + builder.Append("&"); + builder.AppendFormat("{0}={1}", item.Key, item_Value); + i++; + } + if (i > 0) + { + url = url + "//?" + builder.ToString(); + } + } + + return url; + } + private string GetUrlWebApi(string controlStr, string actionStr) + { + string url = Url_WebApi + "//api//" + controlStr + "//" + actionStr; + + return url; + } + + + #region 获取APP升级版本信息 + //public List GetVersList() + //{ + // string api = ""; + // List list = new List(); + // string url = "http://域名/api/Config/GetVersionList?ClientType=android"; + // Dictionary dics = new Dictionary(); + // Task task = InvokeWebapi(url, api, "GET", dics); + // string result = task.Result; + // #region 解析结果集 + // if (result != null) + // { + // JObject jsonObj = null; + // jsonObj = JObject.Parse(result); + // DataInfo info = new DataInfo(); + // info.statusCode = Convert.ToInt32(jsonObj["statusCode"]); + // info.message = jsonObj["message"].ToString(); + // if (info.statusCode == 1) + // { + // JArray jlist = JArray.Parse(jsonObj["data"].ToString()); + // for (int i = 0; i < jlist.Count; ++i) //遍历JArray + // { + // Versions ver = new Versions(); + // JObject tempo = JObject.Parse(jlist[i].ToString()); + // ver.VersionId = Convert.ToInt32(tempo["versionId"]); + // ver.VersionNumber = tempo["versionNumber"].ToString(); + // ver.Description = tempo["description"].ToString(); + // ver.FilePath = tempo["filePath"].ToString(); + // ver.ClientType = tempo["clientType"].ToString(); + // ver.IsForce = Convert.ToInt32(tempo["isForce"]); + // list.Add(ver); + // } + // } + // } + // #endregion + // return list; + //} + + #endregion + } + + public class Post + { + public static string Postring(string url, Dictionary dic) + { + string result = ""; + //url = "http://172.16.22.15:8000/" + url; + HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); + req.Method = "POST"; + req.ContentType = "application/x-www-form-urlencoded"; + req.Proxy = null; + + req.KeepAlive = false; + + #region 添加Post 参数 + StringBuilder builder = new StringBuilder(); + int i = 0; + foreach (var item in dic) + { + if (i > 0) + builder.Append("&"); + builder.AppendFormat("{0}={1}", item.Key, item.Value); + i++; + } + byte[] data = Encoding.UTF8.GetBytes(builder.ToString()); + req.ContentLength = data.Length; + using (Stream reqStream = req.GetRequestStream()) + { + reqStream.Write(data, 0, data.Length); + reqStream.Close(); + } + #endregion + HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); + Stream stream = resp.GetResponseStream(); + + //获取响应内容 + using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) + { + result = reader.ReadToEnd(); + } + return result; + } + + public static string Postring1(string url, string token, Dictionary dic) + { + string results = ""; + //url = "http://172.16.22.15:8000/" + url; + + HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); + req.Method = "POST"; + req.ContentType = "application/x-www-form-urlencoded"; + req.Headers.Add("Authorization", "Bearer " + token); + #region 添加Post 参数 + StringBuilder builder = new StringBuilder(); + int i = 0; + foreach (var item in dic) + { + if (i > 0) + builder.Append("&"); + builder.AppendFormat("{0}={1}", item.Key, item.Value); + i++; + } + byte[] data = Encoding.UTF8.GetBytes(builder.ToString()); + req.ContentLength = data.Length; + try + { + using (Stream reqStream = req.GetRequestStream()) + { + reqStream.Write(data, 0, data.Length); + reqStream.Close(); + } + #endregion + HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); + Stream stream = resp.GetResponseStream(); + //获取响应内容 + using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) + { + results = reader.ReadToEnd(); + } + return results; + } + catch (Exception e) + { + Console.WriteLine(e.Message); + return e.Message; + throw; + } + + } + + } + +} diff --git a/Common/02WebApiCall/WebApiCall/CallWebApiDT.SQLCommon.cs b/Common/02WebApiCall/WebApiCall/CallWebApiDT.SQLCommon.cs new file mode 100644 index 0000000..e30c227 --- /dev/null +++ b/Common/02WebApiCall/WebApiCall/CallWebApiDT.SQLCommon.cs @@ -0,0 +1,188 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Data; +using System.Data.SqlClient; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +namespace DtWebApiDT +{ + public class PLC + { + public static void WritePLC(string tagID, string tagValue) + { + + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "WritePLC"; + Dictionary dic = new Dictionary(); + dic.Add("tagID", tagID); + dic.Add("tagValue", tagValue); + string str = new CallWebApi().InvokeWebapiString(controlStr, actionStr, api, type, dic); + + } + public static string ReadPLC(string tagID) + { + string tagValue; + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "ReadPLC"; + Dictionary dic = new Dictionary(); + dic.Add("tagID", tagID); + + tagValue = new CallWebApi().InvokeWebapiString(controlStr, actionStr, api, type, dic); + return tagValue; + } + } + public class DataAccess + { + + + public static void GetProjectCodeAndProjectName(out string ProjectCode,out string ProjectName) + { + ProjectCode = ""; + ProjectName = ""; + //return PP.ProjectCode + "|" + PP.ProjectName; + string api = ""; + string type = "GET"; + string controlStr = "SQLCommon"; + string actionStr = "GetProjectCodeAndProjectName"; + Dictionary dic = new Dictionary(); + + string str = new CallWebApi().InvokeWebapiString(controlStr, actionStr, api, type, dic); + string[] strList = str.Split('|'); + try + { + ProjectCode = strList[0]; + ProjectName = strList[1]; + } + catch + { + + } + + } + public static bool ExecuteNonQuery(StringCollection sql, string connectionString, out string errorMessage) + { + errorMessage = ""; + + string api = ""; + string type = "GET"; + string controlStr = "SQLCommon"; + string actionStr = "ExecuteNonQuery1"; + Dictionary dic = new Dictionary(); + dic.Add("sql", JsonConvert.SerializeObject(sql)); + + return new CallWebApi().InvokeWebapiBool(controlStr, actionStr, api, type, dic); + } + public static bool ExecuteNonQuery(string sql, string connectionString, out string errorMessage) + { + errorMessage = ""; + + string api = ""; + string type = "GET"; + string controlStr = "SQLCommon"; + string actionStr = "ExecuteNonQuery"; + Dictionary dic = new Dictionary(); + dic.Add("sql", sql); + + return new CallWebApi().InvokeWebapiBool(controlStr, actionStr, api, type, dic); + } + + + public static bool ExecuteOutNum(string sql, string connectionString, out int count, out string errorMessage) + { + errorMessage = ""; + + string api = ""; + string type = "GET"; + string controlStr = "SQLCommon"; + string actionStr = "ExecuteOutNum"; + Dictionary dic = new Dictionary(); + dic.Add("sql", sql); + + count = new CallWebApi().InvokeWebapiInt(controlStr, actionStr, api, type, dic); + return true; + } + + public static bool ExecuteDataset(string sql, string connectionString, out DataSet ds, out string errorMessage) + { + errorMessage = ""; + + string api = ""; + string type = "GET"; + string controlStr = "SQLCommon"; + string actionStr = "ExecuteDataset"; + Dictionary dic = new Dictionary(); + + + dic.Add("sql", sql); + ds = new CallWebApi().InvokeWebapiDataSet(controlStr, actionStr, api, type, dic); + return true; + } + + public static bool ExecuteDataTable(string sql, string connectionString, out DataTable dt, out string errorMessage) + { + errorMessage = ""; + + string api = ""; + string type = "GET"; + string controlStr = "SQLCommon"; + string actionStr = "ExecuteDataTable"; + Dictionary dic = new Dictionary(); + dic.Add("sql", sql); + dt = new CallWebApi().InvokeWebapiDataTable(controlStr, actionStr, api, type, dic); + return true; + } + + + public static bool ExecuteDataReader(string sql, string connectionString, out SqlDataReader dr, out string errorMessage) + { + errorMessage = ""; + + string api = ""; + string type = "GET"; + string controlStr = "SQLCommon"; + string actionStr = "ExecuteDataReader"; + Dictionary dic = new Dictionary(); + dic.Add("sql", sql); + dr = new CallWebApi().InvokeWebapiSqlDataReader(controlStr, actionStr, api, type, dic); + return true; + } + + public static bool ExecuteSql(string sql, string connectionString, out string errorMessage) + { + errorMessage = ""; + + string api = ""; + string type = "GET"; + string controlStr = "SQLCommon"; + string actionStr = "ExecuteSql"; + Dictionary dic = new Dictionary(); + dic.Add("sql", sql); + new CallWebApi().InvokeWebapiString(controlStr, actionStr, api, type, dic); + return true; + } + public static bool ExecuteSql(string sql, string connectionString, out DataTable dt, out string errorMessage) + { + errorMessage = ""; + + string api = ""; + string type = "GET"; + string controlStr = "SQLCommon"; + string actionStr = "ExecuteSqlDataTable"; + Dictionary dic = new Dictionary(); + dic.Add("sql", sql); + dt = new CallWebApi().InvokeWebapiDataTable(controlStr, actionStr, api, type, dic); + return true; + } + } +} diff --git a/Common/02WebApiCall/WebApiCall/CallWebApiDT.cs b/Common/02WebApiCall/WebApiCall/CallWebApiDT.cs new file mode 100644 index 0000000..e1a810e --- /dev/null +++ b/Common/02WebApiCall/WebApiCall/CallWebApiDT.cs @@ -0,0 +1,407 @@ +using DoWhatPlc; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +namespace DtWebApiDT +{ + public class OutGUID + { + /// + /// 2021.10.25.LLX + /// + /// + public static string Get_CS_GUID() + { + return Guid.NewGuid().ToString().ToUpper(); + } + + } + public class CallWebApi + { + + #region WinFrom调用webapi接口通用方法 + + public ReturnResult InvokeWebapiReturnResult(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + var result = task.Result; + //反序列化Json + return JsonConvert.DeserializeObject(task.Result); + } + + public DataTable InvokeWebapiDataTable(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + var result = task.Result; + //反序列化Json + DataTable dt = new DataTable(); + dt = JsonConvert.DeserializeObject(task.Result); + return dt; + } + public DataSet InvokeWebapiDataSet(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + DataSet ds = new DataSet(); + try + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + var result = task.Result; + //反序列化Json + ds = JsonConvert.DeserializeObject(task.Result); + } + catch + { + + } + + return ds; + } + + public SqlDataReader InvokeWebapiSqlDataReader(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + var result = task.Result; + //反序列化Json + SqlDataReader dr; + dr = JsonConvert.DeserializeObject(task.Result); + return dr; + } + + public Dictionary InvokeWebapiDictionary(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + var result = task.Result; + //反序列化Json + var dc = JsonConvert.DeserializeObject>(task.Result); + return dc; + } + public List InvokeWebapiList(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + var result = task.Result; + //反序列化Json + var dc = JsonConvert.DeserializeObject>(task.Result); + return dc; + } + /// + /// + /// + /// + /// + /// + /// + /// + /// List + public List InvokeWebapiListDoubleArray(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + var result = task.Result; + //反序列化Json + var dc = JsonConvert.DeserializeObject>(task.Result); + return dc; + } + /// + /// + /// + /// + /// + /// + /// + /// + /// List> + public List> InvokeWebapiListListDouble(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + var result = task.Result; + //反序列化Json + var dc = JsonConvert.DeserializeObject>>(task.Result); + return dc; + } + public double[] InvokeWebapiDoubleArray(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + var result = task.Result; + //反序列化Json + var dc = JsonConvert.DeserializeObject(task.Result); + return dc; + } + public string InvokeWebapiString(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + string result = ""; + try + { + result = task.Result; + + } + catch + { + + } + return result; + } + public bool InvokeWebapiBool(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + string result = task.Result; + return Convert.ToBoolean(result); + } + public int InvokeWebapiInt(string controlStr, string actionStr, string api, string type, Dictionary dics) + { + string url = GetUrlWebApi(controlStr, actionStr, dics); + Task task = InvokeWebapi(url, api, type, dics); + string result = task.Result; + return Convert.ToInt32(result); + } + + + private async Task InvokeWebapi(string url, string api, string type, Dictionary dics) + { + string result = string.Empty; + HttpClient client = new HttpClient(); + client.DefaultRequestHeaders.Add("authorization", "Basic YWRtaW46cGFzc3dvcmRAcmljZW50LmNvbQ==");//basic编码后授权码 + client.BaseAddress = new Uri(url); + + client.Timeout = TimeSpan.FromSeconds(510); + + if (type.ToLower() == "put") + { + HttpResponseMessage response; + //包含复杂类型 + if (dics.Keys.Contains("input")) + { + if (dics != null) + { + foreach (var item in dics.Keys) + { + api = api.Replace(item, dics[item]).Replace("{", "").Replace("}", ""); + } + } + var contents = new StringContent(dics["input"], Encoding.UTF8, "application/json"); + response = client.PutAsync(api, contents).Result; + if (response.IsSuccessStatusCode) + { + result = await response.Content.ReadAsStringAsync(); + return result; + } + return result; + } + + var content = new FormUrlEncodedContent(dics); + response = client.PutAsync(api, content).Result; + if (response.IsSuccessStatusCode) + { + result = await response.Content.ReadAsStringAsync(); + return result; + } + } + else if (type.ToLower() == "post") + { + var content = new FormUrlEncodedContent(dics); + + HttpResponseMessage response = client.PostAsync(api, content).Result; + if (response.IsSuccessStatusCode) + { + result = await response.Content.ReadAsStringAsync(); + return result; + } + } + else if (type.ToLower() == "get") + { + HttpResponseMessage response = client.GetAsync(api).Result; + + if (response.IsSuccessStatusCode) + { + result = await response.Content.ReadAsStringAsync(); + return result; + } + } + else + { + return result; + } + return result; + } + #endregion + public static string Url_WebApi = System.Configuration.ConfigurationManager.AppSettings["Url_WebApiDT"]; + private string GetUrlWebApi(string controlStr, string actionStr, Dictionary dic) + { + string url = Url_WebApi + "//api//" + controlStr + "//" + actionStr; + StringBuilder builder = new StringBuilder(); + int i = 0; + //sql = Utils.UrlEncode(sql); + + foreach (var item in dic) + { + + string item_Value = Utils.UrlEncode(item.Value); + if (i > 0) + builder.Append("&"); + builder.AppendFormat("{0}={1}", item.Key, item_Value); + i++; + } + if (i > 0) + { + url = url + "//?" + builder.ToString(); + } + return url; + } + private string GetUrlWebApi(string controlStr, string actionStr) + { + string url = Url_WebApi + "//api//" + controlStr + "//" + actionStr; + + return url; + } + #region 获取APP升级版本信息 + //public List GetVersList() + //{ + // string api = ""; + // List list = new List(); + // string url = "http://域名/api/Config/GetVersionList?ClientType=android"; + // Dictionary dics = new Dictionary(); + // Task task = InvokeWebapi(url, api, "GET", dics); + // string result = task.Result; + // #region 解析结果集 + // if (result != null) + // { + // JObject jsonObj = null; + // jsonObj = JObject.Parse(result); + // DataInfo info = new DataInfo(); + // info.statusCode = Convert.ToInt32(jsonObj["statusCode"]); + // info.message = jsonObj["message"].ToString(); + // if (info.statusCode == 1) + // { + // JArray jlist = JArray.Parse(jsonObj["data"].ToString()); + // for (int i = 0; i < jlist.Count; ++i) //遍历JArray + // { + // Versions ver = new Versions(); + // JObject tempo = JObject.Parse(jlist[i].ToString()); + // ver.VersionId = Convert.ToInt32(tempo["versionId"]); + // ver.VersionNumber = tempo["versionNumber"].ToString(); + // ver.Description = tempo["description"].ToString(); + // ver.FilePath = tempo["filePath"].ToString(); + // ver.ClientType = tempo["clientType"].ToString(); + // ver.IsForce = Convert.ToInt32(tempo["isForce"]); + // list.Add(ver); + // } + // } + // } + // #endregion + // return list; + //} + + #endregion + } + + public class Post + { + public static string Postring(string url, Dictionary dic) + { + string result = ""; + //url = "http://172.16.22.15:8000/" + url; + HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); + req.Method = "POST"; + req.ContentType = "application/x-www-form-urlencoded"; + req.Proxy = null; + + req.KeepAlive = false; + + #region 添加Post 参数 + StringBuilder builder = new StringBuilder(); + int i = 0; + foreach (var item in dic) + { + if (i > 0) + builder.Append("&"); + builder.AppendFormat("{0}={1}", item.Key, item.Value); + i++; + } + byte[] data = Encoding.UTF8.GetBytes(builder.ToString()); + req.ContentLength = data.Length; + using (Stream reqStream = req.GetRequestStream()) + { + reqStream.Write(data, 0, data.Length); + reqStream.Close(); + } + #endregion + HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); + Stream stream = resp.GetResponseStream(); + + //获取响应内容 + using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) + { + result = reader.ReadToEnd(); + } + return result; + } + + public static string Postring1(string url, string token, Dictionary dic) + { + string results = ""; + //url = "http://172.16.22.15:8000/" + url; + + HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); + req.Method = "POST"; + req.ContentType = "application/x-www-form-urlencoded"; + req.Headers.Add("Authorization", "Bearer " + token); + #region 添加Post 参数 + StringBuilder builder = new StringBuilder(); + int i = 0; + foreach (var item in dic) + { + if (i > 0) + builder.Append("&"); + builder.AppendFormat("{0}={1}", item.Key, item.Value); + i++; + } + byte[] data = Encoding.UTF8.GetBytes(builder.ToString()); + req.ContentLength = data.Length; + try + { + using (Stream reqStream = req.GetRequestStream()) + { + reqStream.Write(data, 0, data.Length); + reqStream.Close(); + } + #endregion + HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); + Stream stream = resp.GetResponseStream(); + //获取响应内容 + using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) + { + results = reader.ReadToEnd(); + } + return results; + } + catch (Exception e) + { + Console.WriteLine(e.Message); + return e.Message; + throw; + } + + } + + } + +} diff --git a/Common/02WebApiCall/WebApiCall/Opc.Demo.cs b/Common/02WebApiCall/WebApiCall/Opc.Demo.cs new file mode 100644 index 0000000..ef238e9 --- /dev/null +++ b/Common/02WebApiCall/WebApiCall/Opc.Demo.cs @@ -0,0 +1,123 @@ +using DoWhatPlc; +using DtWebApi; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DtWebApi +{ + public class OpcDemo + { + public static HashtableList GetHashtableList() + { + try + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "GetHashtableList"; + Dictionary dic = new Dictionary(); + var rc = new CallWebApi().InvokeWebapiHashtableList(controlStr, actionStr, api, type, dic); + return rc; + + } + catch (Exception err) + { + return new HashtableList(); + + } + } + public static List ReadPLC_GroupMonitor(string opName) + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "ReadPLC_GroupMonitor"; + Dictionary dic = new Dictionary(); + dic.Add("opName", opName); + var rc = new CallWebApi().InvokeWebapiListTagFormat(controlStr, actionStr, api, type, dic); + return rc; + } + public static List ReadPLC_GroupData_Qd(string opName) + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "ReadPLC_GroupData_Qd"; + Dictionary dic = new Dictionary(); + dic.Add("opName", opName); + var rc = new CallWebApi().InvokeWebapiListTagFormat(controlStr, actionStr, api, type, dic); + return rc; + } + + public static List ReadPLC_GroupData(string opName) + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "ReadPLC_GroupData"; + Dictionary dic = new Dictionary(); + dic.Add("opName", opName); + var rc = new CallWebApi().InvokeWebapiListTagFormat(controlStr, actionStr, api, type, dic); + return rc; + } + + + + public static List Get_opNameList() + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "Get_opNameList"; + Dictionary dic = new Dictionary(); + + var rc = new CallWebApi().InvokeWebapiListString(controlStr, actionStr, api, type, dic); + return rc; + } + public static List Get_ipList() + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "Get_ipList"; + Dictionary dic = new Dictionary(); + + var rc = new CallWebApi().InvokeWebapiListString(controlStr, actionStr, api, type, dic); + return rc; + } + + public static ConcurrentDictionary Get_TagAdrListTagFormat(string ip, string group) + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "Get_TagAdrListTagFormat"; + Dictionary dic = new Dictionary(); + dic.Add("ip", ip); + dic.Add("group", group); + + var rc = new CallWebApi().InvokeWebapiConcurrentDictionaryTagFormat(controlStr, actionStr, api, type, dic); + return rc; + } + + public static ConcurrentDictionary ReadTagValue_tagAdrListTagFormat(string readWhat, string opOrIp) + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "ReadTagValue_tagAdrListTagFormat"; + Dictionary dic = new Dictionary(); + dic.Add("readWhat", readWhat); + dic.Add("opOrIp", opOrIp); + + var rc = new CallWebApi().InvokeWebapiConcurrentDictionaryTagFormat(controlStr, actionStr, api, type, dic); + return rc; + } + } + + +} diff --git a/Common/02WebApiCall/WebApiCall/Opc.SaveData.cs b/Common/02WebApiCall/WebApiCall/Opc.SaveData.cs new file mode 100644 index 0000000..71b314b --- /dev/null +++ b/Common/02WebApiCall/WebApiCall/Opc.SaveData.cs @@ -0,0 +1,44 @@ +using DoWhatPlc; +using DtWebApi; +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DtWebApi +{ + public class SaveData + { + + public static QualityDataSaveList ReadPLC_Sync_DataList_MesRead(string opName) + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "ReadPLC_Sync_DataList_MesRead"; + Dictionary dic = new Dictionary(); + dic.Add("opName", opName); + var rc = new CallWebApi().InvokeWebapiQualityDataSaveList(controlStr, actionStr, api, type, dic); + return rc; + } + + public static object SaveQualityData_ByOnlyDataGroup(string opName, string tagID) + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "SaveQualityData_ByOnlyDataGroup"; + Dictionary dic = new Dictionary(); + dic.Add("opName", opName); + dic.Add("tagID", tagID); + var rc = new CallWebApi().InvokeWebapiBool(controlStr, actionStr, api, type, dic); + return rc; + } + //SaveQualityData_ByOnlyDataGroup(string opName, string tagID) + } + + +} diff --git a/Common/02WebApiCall/WebApiCall/ReadPLC.cs b/Common/02WebApiCall/WebApiCall/ReadPLC.cs new file mode 100644 index 0000000..79649d4 --- /dev/null +++ b/Common/02WebApiCall/WebApiCall/ReadPLC.cs @@ -0,0 +1,190 @@ +using DoWhatPlc; +using Newtonsoft.Json; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +namespace DtWebApi +{ + public partial class ReadWritePLC + { + public static DataTable GetServerStatus() + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "GetServerStatus"; + Dictionary dic = new Dictionary(); + return new CallWebApi().InvokeWebapiDataTable(controlStr, actionStr, api, type, dic); + } + //http://localhost:41186//api//PLC1//Write_TagValueByTagTypeName//?cmd=ConfirmOkGo&opName=OP020&tagValue=True + //http://localhost:41186//api//PLC1//Read_TagValueByTagTypeName//?cmd=PalletInfo&opName=OP020 + public static object Read_TagValueByTagTypeName(string cmd, string opName) + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "Read_TagValueByTagTypeName"; + Dictionary dic = new Dictionary(); + dic.Add("cmd", cmd); + dic.Add("opName", opName); + + var rc = new CallWebApi().InvokeWebapiReturnValueObject(controlStr, actionStr, api, type, dic); + if(rc.ValueType=="bool" || rc.ValueType == "boolean") + { + return Convert.ToInt32(rc.TagValue); + } + return rc.TagValue; + } + + public static object ReadPLC(string tagID) + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "ReadPLC"; + Dictionary dic = new Dictionary(); + dic.Add("tagID", tagID); + + var rc = new CallWebApi().InvokeWebapiReturnValueObject(controlStr, actionStr, api, type, dic); + return rc.TagValue; + } + public static object ReadPLC(string tagTypeCodeID, string opName) + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "ReadPLC_TagTypeCodeID"; + Dictionary dic = new Dictionary(); + dic.Add("tagTypeCodeID", tagTypeCodeID); + dic.Add("opName", opName); + + var rc = new CallWebApi().InvokeWebapiReturnValueObject(controlStr, actionStr, api, type, dic); + return rc.TagValue; + } + public static byte[] ReadByteData_Op(string OpName, string Adr, ushort Length) + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "ReadByteData_Op"; + Dictionary dic = new Dictionary(); + dic.Add("OpName", OpName); + dic.Add("Adr", Adr); + dic.Add("Length", Length.ToString()); + + var rc = new CallWebApi().InvokeWebapiReturnValueObject(controlStr, actionStr, api, type, dic); + + return JsonToByte(rc.TagValue.ToString()); + } + + public static byte[] ReadByteData_Ip(string Ip, string Adr, ushort Length) + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "ReadByteData_Ip"; + Dictionary dic = new Dictionary(); + dic.Add("Ip", Ip); + dic.Add("Adr", Adr); + dic.Add("Length", Length.ToString()); + + var rc = new CallWebApi().InvokeWebapiReturnValueObject(controlStr, actionStr, api, type, dic); + + return JsonToByte(rc.TagValue.ToString()); + } + + public static object WritePLC_Bytes_Op(string OpName, string Adr, byte[] bytes) + { + string bytesStr = ByteToJson(bytes); + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "WritePLC_Bytes_Op"; + Dictionary dic = new Dictionary(); + dic.Add("OpName", OpName); + dic.Add("Adr", Adr); + dic.Add("bytes", bytesStr); + + var rc = new CallWebApi().InvokeWebapiReturnValueObject(controlStr, actionStr, api, type, dic); + + return rc.TagValue; + } + + public static object WritePLC_Bytes_Ip(string Ip, string Adr, byte[] bytes) + { + string bytesStr = ByteToJson(bytes); + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "WritePLC_Bytes_Ip"; + Dictionary dic = new Dictionary(); + dic.Add("OpName", Ip); + dic.Add("Adr", Adr); + dic.Add("bytes", bytesStr); + + var rc = new CallWebApi().InvokeWebapiReturnValueObject(controlStr, actionStr, api, type, dic); + + return rc.TagValue; + } + static public string ByteToJson(byte[] bytes) + { + string convertJson = System.Text.Encoding.UTF8.GetString(bytes); + return convertJson; + } + + static public byte[] JsonToByte(string strjson) + { + byte[] bytes = System.Text.Encoding.UTF8.GetBytes(strjson); + + return bytes; + } + + + public static List ReadPLC(List tagTypeCodeIDList, List opNameList) + { + string tagTypeCodeID = JsonConvert.SerializeObject(tagTypeCodeIDList); + string opName = JsonConvert.SerializeObject(opNameList); + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "ReadPLC_TagTypeCodeIDList"; + Dictionary dic = new Dictionary(); + dic.Add("tagTypeCodeID", tagTypeCodeID); + dic.Add("opName", opName); + + var rc = new CallWebApi().InvokeWebapiReturnValueObjectList(controlStr, actionStr, api, type, dic); + return rc; + } + + public static List ReadPLC_GroupData(string opName) + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "ReadPLC_GroupData"; + Dictionary dic = new Dictionary(); + dic.Add("opName", opName); + + return new CallWebApi().InvokeWebapiReturnValueObjectList(controlStr, actionStr, api, type, dic); + } + public static ConcurrentDictionary ReadPLC_OpName(string opName) + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "ReadPLC_OpName"; + Dictionary dic = new Dictionary(); + dic.Add("opName", opName); + + return new CallWebApi().InvokeWebapiConcurrentDictionaryTagFormat(controlStr, actionStr, api, type, dic); + } + } +} diff --git a/Common/02WebApiCall/WebApiCall/ReadWritePLCMesRead.cs b/Common/02WebApiCall/WebApiCall/ReadWritePLCMesRead.cs new file mode 100644 index 0000000..fc7c4d8 --- /dev/null +++ b/Common/02WebApiCall/WebApiCall/ReadWritePLCMesRead.cs @@ -0,0 +1,67 @@ +using DoWhatPlc; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +namespace DtWebApi +{ + public partial class ReadWritePLC + { + /// + /// + /// + /// + /// + /// + /// + /// + /// 9 + /// 11 + /// 10 + /// 80 + public static void GetEngineTypeFromPLC(string opName, out int EngineTypeID, out string EngineType, out string EngineID, out int PartPallet_Code) + { + EngineTypeID = 0; + EngineID = "-2"; + EngineType = "-2"; + PartPallet_Code = 0; + + List tagTypeCodeIDList = new List(); + List opNameList = new List(); + tagTypeCodeIDList.Add("9"); + opNameList.Add(opName); + tagTypeCodeIDList.Add("10"); + opNameList.Add(opName); + tagTypeCodeIDList.Add("11"); + opNameList.Add(opName); + tagTypeCodeIDList.Add("80"); + opNameList.Add(opName); + List roList = ReadPLC(tagTypeCodeIDList, opNameList); + foreach(var item in roList) + { + switch(item.TagTypeCodeID) + { + case "9": + EngineTypeID = Convert.ToInt32( item.TagValue); + break; + case "10": + EngineID = item.TagValue.ToString(); + break; + case "11": + EngineType = item.TagValue.ToString(); + break; + case "80": + PartPallet_Code = Convert.ToInt32(item.TagValue); + break; + } + } + } + } +} diff --git a/Common/02WebApiCall/WebApiCall/Utils.cs b/Common/02WebApiCall/WebApiCall/Utils.cs new file mode 100644 index 0000000..594de2a --- /dev/null +++ b/Common/02WebApiCall/WebApiCall/Utils.cs @@ -0,0 +1,82 @@ +using System.Text; + +public static class Utils + { + public static string UrlEncode(this string str) + { + var encoding = UTF8Encoding.UTF8; + byte[] bytes = encoding.GetBytes(str); + int IsSafe = 0; + int NoSafe = 0; + for (int i = 0; i < bytes.Length; i++) + { + char ch = (char)bytes[i]; + if (ch == ' ') + { + IsSafe++; + } + else if (!IsSafeChar(ch)) + { + NoSafe ++; + } + } + if (IsSafe== 0 && NoSafe == 0) + { + return str; + } + byte[] buffer = new byte[bytes.Length + (NoSafe * 2)]; + int num1 = 0; + for (int j = 0; j < bytes.Length; j++) + { + byte num2 = bytes[j]; + char ch2 = (char)num2; + if (IsSafeChar(ch2)) + { + buffer[num1++] = num2; + } + else if (ch2 == ' ') + { + buffer[num1++] = 0x2B; + } + else + { + buffer[num1++] = 0x25; + buffer[num1++] = (byte)IntToHex((num2 >> 4) & 15); + buffer[num1++] = (byte)IntToHex(num2 & 15); + } + } + return encoding.GetString(buffer); + } + + private static bool IsSafeChar(char ch) + { + if ((((ch < 'a') || (ch > 'z')) && ((ch < 'A') || (ch > 'Z'))) && ((ch < '0') || (ch > '9'))) + { + + switch (ch) + { + case '-': + case '.': + break; //安全字符 + case '+': + case ',': + return false; //非安全字符 + default: //非安全字符 + if (ch != '_') + { + return false; + } + break; + } + } + return true; + } + private static char IntToHex(int n) + { + if (n <= 9) + { + return (char)(n + 0x30); + } + return (char)((n - 10) + 0x41); + } + } diff --git a/Common/02WebApiCall/WebApiCall/WbApi.cs b/Common/02WebApiCall/WebApiCall/WbApi.cs new file mode 100644 index 0000000..f3d99bf --- /dev/null +++ b/Common/02WebApiCall/WebApiCall/WbApi.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WebApiCall +{ + public class WbApi + { + + } + + +} diff --git a/Common/02WebApiCall/WebApiCall/WritePLC.cs b/Common/02WebApiCall/WebApiCall/WritePLC.cs new file mode 100644 index 0000000..f666f83 --- /dev/null +++ b/Common/02WebApiCall/WebApiCall/WritePLC.cs @@ -0,0 +1,129 @@ +using DoWhatPlc; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +namespace DtWebApi +{ + public partial class ReadWritePLC + { + // static object lockerReadWritePLC = new object(); + + public static void Write_TagValueByTagTypeID(string tagTypeCodeID, string opName, object tagValue) + { + //lock (lockerReadWritePLC) + { + var rs = new ReturnValueString("", tagValue, opName, tagTypeCodeID); + var tagvalue = JsonConvert.SerializeObject(rs); + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "WritePLC_TagTypeCodeID"; + Dictionary dic = new Dictionary(); + dic.Add("tagTypeCodeID", tagTypeCodeID); + dic.Add("opName", opName); + + ReturnValueString rv = new ReturnValueString(); + rv.TagTypeCodeID = tagTypeCodeID; + rv.OpName = opName; + rv.TagValue = tagValue.ToString(); + rv.ValueType = tagValue.GetType().Name.ToLower(); + dic.Add("tagValue", JsonConvert.SerializeObject(rv)); + + new CallWebApi().InvokeWebapiWritePLC(controlStr, actionStr, api, type, dic); + } + + } + public static void Write_TagValueByTagID(string TagID, object tagValue) + { + WritePLC(TagID, tagValue); + } + public static void WritePLC(string tagTypeCodeID, string opName, object tagValue) + { + //lock (lockerReadWritePLC) + { + var rs = new ReturnValueString("", tagValue, opName, tagTypeCodeID); + var tagvalue = JsonConvert.SerializeObject(rs); + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "WritePLC_TagTypeCodeID"; + Dictionary dic = new Dictionary(); + dic.Add("tagTypeCodeID", tagTypeCodeID); + dic.Add("opName", opName); + + ReturnValueString rv = new ReturnValueString(); + rv.TagTypeCodeID = tagTypeCodeID; + rv.OpName = opName; + rv.TagValue = tagValue.ToString(); + rv.ValueType = tagValue.GetType().Name.ToLower(); + dic.Add("tagValue", JsonConvert.SerializeObject(rv)); + + + new CallWebApi().InvokeWebapiWritePLC(controlStr, actionStr, api, type, dic); + + } + + + } + + public static void WritePLC(string tagID, object tagValue) + { + //lock (lockerReadWritePLC) + { + var rs = new ReturnValueString(tagID, tagValue, "", ""); + var tagvalue = JsonConvert.SerializeObject(rs); + + + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "WritePLC"; + Dictionary dic = new Dictionary(); + dic.Add("tagID", tagID); + + ReturnValueString rv = new ReturnValueString(); + rv.TagID = tagID; + rv.TagValue = tagValue.ToString(); + rv.ValueType = tagValue.GetType().Name.ToLower(); + + dic.Add("tagValue", JsonConvert.SerializeObject(rv)); + + new CallWebApi().InvokeWebapiWritePLC(controlStr, actionStr, api, type, dic); + } + } + + public static void Write_TagValueByTagTypeName(string cmd, string opName, object tagValue) + { + // lock (lockerReadWritePLC) + { + string api = ""; + string type = "GET"; + string controlStr = "PLC1"; + string actionStr = "Write_TagValueByTagTypeName"; + Dictionary dic = new Dictionary(); + dic.Add("cmd", cmd); + dic.Add("opName", opName); + + ReturnValueString rv = new ReturnValueString(); + rv.CmdPlcReadWrite = cmd; + rv.OpName = opName; + rv.TagValue = tagValue.ToString(); + rv.ValueType = tagValue.GetType().Name.ToLower(); + dic.Add("tagValue", JsonConvert.SerializeObject(rv)); ; + + var rc = new CallWebApi().InvokeWebapiReturnValueObject(controlStr, actionStr, api, type, dic); + + } + + } + + } +} diff --git a/Common/02WebApiCall/packages.config b/Common/02WebApiCall/packages.config new file mode 100644 index 0000000..ce3dc38 --- /dev/null +++ b/Common/02WebApiCall/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Common/04DataBaseAccess/Common/dll/DataBaseAccess.dll b/Common/04DataBaseAccess/Common/dll/DataBaseAccess.dll new file mode 100644 index 0000000000000000000000000000000000000000..137dc82ad87299ff69434d7a0ee71280434c1d5a GIT binary patch literal 15872 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 literal 0 HcmV?d00001 diff --git a/Common/04DataBaseAccess/Common/dll/DataBaseAccess.pdb b/Common/04DataBaseAccess/Common/dll/DataBaseAccess.pdb new file mode 100644 index 0000000000000000000000000000000000000000..e9bf580774428fd0844238f92268fcb5efcc2ed1 GIT binary patch literal 44544 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 literal 0 HcmV?d00001 diff --git a/Common/04DataBaseAccess/Common/dll/DoWhatPlc.dll b/Common/04DataBaseAccess/Common/dll/DoWhatPlc.dll new file mode 100644 index 0000000000000000000000000000000000000000..34ab0bbd7586b1afe7a9d7655e8b5cfe6c52b0de GIT binary patch literal 19456 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 literal 0 HcmV?d00001 diff --git a/Common/04DataBaseAccess/Common/dll/MQTTnet.Extensions.ManagedClient.dll b/Common/04DataBaseAccess/Common/dll/MQTTnet.Extensions.ManagedClient.dll new file mode 100644 index 0000000000000000000000000000000000000000..99035f681521e2f7de77f9108af911e9768b8054 GIT binary patch literal 45568 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 mVvNAhON@zWFjAF%cRoA_V%!2bc-3~m|# literal 0 HcmV?d00001 diff --git a/Common/04DataBaseAccess/Common/dll/MQTTnet.dll b/Common/04DataBaseAccess/Common/dll/MQTTnet.dll new file mode 100644 index 0000000000000000000000000000000000000000..29514337fa29d1b44093bb04d465550f31c5eba2 GIT binary patch literal 293376 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

%Y`YjZ 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⪙W^k07#wt47YU^>^=bw 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

>wk9Qmb*Xr!(8w4fBE~JUw`&LfA`tfe*53g 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 literal 0 HcmV?d00001 diff --git a/Common/04DataBaseAccess/Common/dll/MesWorkMqtt.pdb b/Common/04DataBaseAccess/Common/dll/MesWorkMqtt.pdb new file mode 100644 index 0000000000000000000000000000000000000000..fb106249579e14adc3849508ef626c6ad94d5243 GIT binary patch literal 24064 zcmeHP4RBP|6~3FqmUwFRd##nFyG<6mcNA(cAlOf7cW+Of`vo!SBs`(ynX>$Dd7efQnFd7Es0 zAX_WTJ9zfo-*eAB=iYPgJMYDYU?37U!yVCr+LGEUt|(||sxMgT@p|(vm{r##02xBK zKuUmznFn|*;{2wA1{%d{Q)8zbI7c;5i8cI>b9C;`v`?M-xNZINm(G9Hy|YOiZ2V!y z-b1U_e(%Kb-@11$xAK!7_}WeGj#u6N#X@|Xv!;LQuNQv(Irog39d~Y>a>sWcn^~ZI z;5Gj`dH>Sa8+PBh?)GEl{TTy)dwSQLtq6L%@=tl*&eQ;0qM}04*qwdmSPN}m0)8?KHIS-$x{>_Sq zd^djE+jnGA(FNyCefiJF?rMGO{_aZ$(m_}0IEP6u`&_&Oh-nHzcrIp1nu%X4pNz^% z=jW`}fMfr&+I$lhKAHV5ga@$i{|OJ`F!;=BAesGVI`;p}+AGz9rRx6Y-2YQ;nNNpb zs_gIF|34jjrFxW;@1A^@@%?Rx^NZRmTTbl#$-wR>jva^{yXW4P?X&AwBndD5yNe_wA2}Gy_;G**RN`>kNCR{4!r0_BVq=_p{uu)dn!CW&q~uYy4$+? zRz{RYXOkF4?k8?+le&mXF zUwm!NfqA(Z`yYLFBfB(+I`9)B3%1Kbr^!r%M^?6Q{&1Ex2g(1L0hOV-=fj+O&Z-8cCRlX0(ch;8tE}`c& z6=es3gulOgGDd$w`Z>@q2@#tG+5-A{RlX4PX5{e-M0^=^wJP5O+KT++Do-VCMBW8T zewm8S0rjJNp30-Sgj{if$P+~}ohPOUw^%FFZuN$pWg6I)@F6e<2v!o9CR}Wh)Bd&F z|3TGT?_*{$4!5^8UQ^T`iLNyJLIGG}9QFtEMd(|FT_1%8BKTbyw{10S+KPW=WG}Ej zGC2p=MXsA%vG2QL{jS(s$kUE`eJ)ayUd|2*um-XzudG_v+tw8{=@#G<#wQ=OUnSOw zUePAHL=e(-3N2YV>bP#XhF!OpCCEY_MX>9N>#_%BvZ^T>?y*!Qt{qDjbjX6P7ND=C ztFY)vqNydQr#`Cne#L-<*%pz%V3WNUDJer^sHwNj4B+BoL~6sKkP(O)?Ly2HneJ!N zU>EwcuWmm@6uEC`Sl`@?s|cA*x8*&xT|pxh6?2D|c@*nlXp<0yN$Tr@X22R#;?`v*<-frQ7{M)8-}&~wtF}dr5N~Uyr@Ts-yRNH?xdMnqs2 zp}eWjj2hk6SXLTy=<0%cB(H0XkP!(6EIH%#p^o6D-iV(~v~E=0b-~cBaeb+>X3I?` z@M!Lg82)z5!_(|HH=B^Lz|DTJnWRidjDWK7IMy%PGi*;kNKX-8tNGSCsZr}>9R?t< zord$UPWq7~tVE6M}pY>|o$ryw%=*2K7{-d8BHZC3?OjyvewH#Wm z(`Lwi7)TzvpVk}L57XO~W6298*yV-JGUWbNI`b&mdz9?+H~|Ilwb`#AEoJuv0?}~f zjP%2EsS3DP@^Z!ZFSoN7NWfN#aU3|a*d?I1fLiB8jUXitwzX{NirbbpE&>wZizE+I z_0|12wxvr~+&1>H`&7TLfaam?ZK{8sSQQ_eJS<(fgw~Or2hP$M4-TBAF`lP$C66lf zZw4+Lc8*n|4d-(mkn8TNz+J${fQNu@1F850z!ktQ;CA31paW;F0c@@K`8rwY@-H?= zfm=s5*P5)d-T$_Xwa>5^680JL<=~^Xm3T*uF&d>m!?whoQ50_frzpGw3-V0wjF3Nm zXWWMj=k)@p7jiJ&2&(UlIViX0>=IfRl;aa1!G33)jXc(WY!2vrP@dty*cwpW8)MC& z#h|UAR|s)e9(ZG|$1o?c473vTO11;N3bY3ldn@)WP>ypP^lIck0Idd{3prW7MbT$K zSD<{q%3~M_maizp{jv&3Iv+R{SPu*WBfvX>0ogteJ2Ve_Qv>@GJ_P0fF}wt(d3QLh z3skv7&Q1+*|I^0Pfcw-G^xalv9g@Zxu>1cbYM$@e=8N+``%U<6x!rC4f6V8rB>q1i ze97l2;Lm{Y?{eMAm_SsB>qj_K#)=2P^-14O-i!}W=5K)7{kb&Qd?7d*#_*rh68py=hGxU)#V-vD~EDt`jB5qZva9q4}0^`Hkp5d(|y z{?!b65S091P?R>f0p&+k9z=rW&x>T*9v5)qDeXe>uqCnUA&3iO|eiVxP zL>kx{%lSQbG{898tlX0K9>kQd!$!hgU+&Qt6@6S$#>TirR^o>gYhBV;RK8o$6RP|_ zDsQO#LY2Qm(FYXusd~oD@LwE%tn$Ycz0X#MWFoMm0$WlS4WpQ560k~LbcmzCc=(Uf zUD)_19ciNc6UI(5Lh`xWd!}t9dU;27G3xZ!QAzxv>fezb$XD8$r8( z+ko4FJAr$Ej{u(q9t0i*I>0#DJU8_~8)S*W1AeAhXe;+tcmX~rdX}xdOV|R!=x^`i z5>_8CHn<*RAKJLYV31a~x5`!f(!us#EJco?1F5>bRj%42d|aqx;&X{hBoBJ(zE&I6 zx17&x*8GpiJC40?VjxWSx7w-x2*?(z{)|&4jy*h}rFmFw6_1L+`A);bu}i4Hl1-mh zxoVGxN3BoVEMo+lWoZ5T6WeDFX+P5b0&DplFwX|29Y|jda2;jp_0pcc^K@o5Tm!uS zZO!%Z`h};5*>}$nGotzMLPfYJFh;cq<&3pzn27}Mf_Q2-yLFDuBJ0ek8Q&CyJw7y1G$9W~^JylFo3=77?+fy}oU{$xbww8&y zirU)RrDfJ&TJGdyxy2tXk;FL1QU@IeDi^+*vRYqx4X-K^MjtCr@Hvoh6gZ~NI4^Zb za~_X%i25qKCiFC=U=v@TEK#JD@*HeoQuUj^}MI&fa}08U>(bs z538}}-lOV=R_7rc@0c6 z#-I;N`?##*HwgOs12l_61|(!mm{RF=$CqR|ih(X8J&zS=mjQ2`1#11Xk7Ti35Au6p z%DxZdzU0SXDPuUHkMB|@#VDV>3H@E9GL5BJ{?ZT@O?X2RaQ=62iBVrYJEZfs#(V&^97%UE#oHtDqy;Wtb&_RDbp<2TL*U z34MF{zYu7YPbANWdFZZarni^@;B}IGNpmp@`8YfSsH)^^Hom~2!{F=J9N-QhKeZ$r zSzkt00^v z@5ko=9XNdr6rO$;r$;(!fE$&dsg-kn(_912_upx5;4!AhyPos@hf2bw1z>wWBlAOl zaP658*!VN-HVh`pKY?MA5v*Azv>K90sRToKC(lYTS0t|+DL&0RB=3PmKn7K+fUAMc zz>UBz;5OiP;7;Hk;3Gii{STC21MYt({#PS4GJ2dWJ>!2P?Jp`spAEL<;v~~f15W(c zZc?6pPW*R-Kj%(aSIB5Z}7|4LNJ^ssgY`niSR?KGrz9t@T{C7Uu ZUJk_HSUB-t=-^CY@tJmX`lW>i{tKdD00aO4 literal 0 HcmV?d00001 diff --git a/Common/04DataBaseAccess/Common/dll/Newtonsoft.Json.dll b/Common/04DataBaseAccess/Common/dll/Newtonsoft.Json.dll new file mode 100644 index 0000000000000000000000000000000000000000..597a1cef97ecae69891fa0366cdb2790140bf0d4 GIT binary patch literal 502272 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

mf6P`GVZz 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⪙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 literal 0 HcmV?d00001 diff --git a/Common/04DataBaseAccess/Common/dll/WebApiCall.dll b/Common/04DataBaseAccess/Common/dll/WebApiCall.dll new file mode 100644 index 0000000000000000000000000000000000000000..a519e2aefcc175d7a4149dc9138cbdb715dcfc65 GIT binary patch literal 21504 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 XV}X70H(0;8@{gs!fA;&w^uYfHnTXXj literal 0 HcmV?d00001 diff --git a/Common/04DataBaseAccess/Common/dll/WebApiCall.dll.config b/Common/04DataBaseAccess/Common/dll/WebApiCall.dll.config new file mode 100644 index 0000000..6035ea8 --- /dev/null +++ b/Common/04DataBaseAccess/Common/dll/WebApiCall.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Common/04DataBaseAccess/Common/dll/WebApiCall.pdb b/Common/04DataBaseAccess/Common/dll/WebApiCall.pdb new file mode 100644 index 0000000000000000000000000000000000000000..16b7902bc72852a5f41a546970b916612bb9094a GIT binary patch literal 75264 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 literal 0 HcmV?d00001 diff --git a/Common/04DataBaseAccess/DataBaseAccess.sln b/Common/04DataBaseAccess/DataBaseAccess.sln new file mode 100644 index 0000000..87a94f3 --- /dev/null +++ b/Common/04DataBaseAccess/DataBaseAccess.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32901.82 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "04-DataBaseAccess", "DataBaseAccess\04-DataBaseAccess.csproj", "{F434E066-4C59-47C8-AA82-6F48CC84501A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F434E066-4C59-47C8-AA82-6F48CC84501A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F434E066-4C59-47C8-AA82-6F48CC84501A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F434E066-4C59-47C8-AA82-6F48CC84501A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F434E066-4C59-47C8-AA82-6F48CC84501A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {CB4AAB51-C433-4A0B-B835-FF7E3CB86238} + EndGlobalSection +EndGlobal diff --git a/Common/04DataBaseAccess/DataBaseAccess/04-DataBaseAccess.csproj b/Common/04DataBaseAccess/DataBaseAccess/04-DataBaseAccess.csproj new file mode 100644 index 0000000..6218853 --- /dev/null +++ b/Common/04DataBaseAccess/DataBaseAccess/04-DataBaseAccess.csproj @@ -0,0 +1,54 @@ + + + + + Debug + AnyCPU + {F434E066-4C59-47C8-AA82-6F48CC84501A} + Library + Properties + DataBaseAccess + 04DataBaseAccess + v4.8 + 512 + true + + + + true + full + false + ..\..\dll\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Common/04DataBaseAccess/DataBaseAccess/DataAccess.cs b/Common/04DataBaseAccess/DataBaseAccess/DataAccess.cs new file mode 100644 index 0000000..b04d9cf --- /dev/null +++ b/Common/04DataBaseAccess/DataBaseAccess/DataAccess.cs @@ -0,0 +1,611 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Configuration; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DataLinkMesWork +{ + public class DataAccess + { + public static string ConnectionString_MES = ConfigurationManager.AppSettings["ConnectionString_MES"]; + public static bool ExecuteNonQuery(string sql, string connectionString, out string errorMessage) + { + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + cmd.ExecuteNonQuery(); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + //ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + + } + public static bool ExecuteDataset(string sql, string connectionString, out DataSet ds, out string errorMessage) + { + errorMessage = ""; + bool result = true; + errorMessage = ""; + ds = new DataSet(); + + /// SQLSERVER + /// SQLiteDB + try + { + //bool result = false; + errorMessage = ""; + ds = new DataSet(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(sql, conn); + dsCommand.Fill(ds); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + //ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + catch (Exception err) + { + + } + + return result; + + + } + ///

+ /// 增 删 改 + /// + /// + /// + /// + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlCommand cmd = new SqlCommand(procedureName, conn)) + { + cmd.CommandTimeout = 0; + cmd.CommandType = CommandType.StoredProcedure; + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + cmd.Parameters.Add(sqlParameters[i]); + } + } + cmd.ExecuteNonQuery(); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + if (conn.State == ConnectionState.Open) + conn.Close(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters,out DataTable dt) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + //ds = new DataSet(); + dt = new DataTable(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(procedureName, conn); + dsCommand.SelectCommand.CommandType = CommandType.StoredProcedure; + dsCommand.SelectCommand.CommandTimeout = 0; + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + dsCommand.SelectCommand.Parameters.Add(sqlParameters[i]); + } + } + + dsCommand.Fill(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters, out DataSet ds) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + ds = new DataSet(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(procedureName, conn); + dsCommand.SelectCommand.CommandType = CommandType.StoredProcedure; + dsCommand.SelectCommand.CommandTimeout = 0; + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + dsCommand.SelectCommand.Parameters.Add(sqlParameters[i]); + } + } + + dsCommand.Fill(ds); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + public static bool ExecuteDataset(string sql, out DataSet ds) + { + string errorMessage; + string connectionString = ConnectionString_MES; + bool result = false; + errorMessage = ""; + ds = new DataSet(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(sql, conn); + dsCommand.Fill(ds); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + public static bool ExecuteDataTable(string sql, out DataTable dt) + { + //public static bool ExecuteDataTable(string sql, string connectionString, out DataTable dt, out string errorMessage) + string errorMessage; + string connectionString = ConnectionString_MES; + bool result = false; + errorMessage = ""; + dt = new DataTable(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(sql, conn); + dsCommand.Fill(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + public static DataTable ExecuteSQL(string sql, ref SqlParameter[] sqlParameters) + { + string connectionString = ConnectionString_MES; + string err; + bool result = false; + err = ""; + DataTable dt = new DataTable(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter(sql, conn)) + { + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + dsCommand.SelectCommand.Parameters.Add(sqlParameters[i]); + } + } + dsCommand.Fill(dt); + } + result = true; + } + catch (Exception e) + { + err = e.ToString(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteSelectMesWork\r\n" + sql + "\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return dt; + } + + public static bool ExecuteSQL(string sql) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + cmd.ExecuteNonQuery(); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + /// + /// 提供通用的调用存储过程的方法(增加数据的数据表的到数据库的调用) + /// + /// 存储过程名称 + /// 存储过程参数数组 + /// 增加数据的数据表 + /// + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters, DataTable dt) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + // if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.InsertCommand = new SqlCommand(procedureName, conn); + dsCommand.InsertCommand.CommandType = CommandType.StoredProcedure; + for (int i = 0; i < sqlParameters.Length; i++) + { + dsCommand.InsertCommand.Parameters.Add(sqlParameters[i]); + } + if (dt == null) return false; + dt.AcceptChanges(); + for (int i = 0; i < dt.Rows.Count; i++) + { + dt.Rows[i].SetAdded(); + } + dsCommand.Update(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + /// + /// 提供通用的调用存储过程的方法(增加数据的数据表的到数据库的调用) + /// + /// + /// + /// + public static bool ExecuteStoredProcedure(string procedureName, out DataTable dt) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + dt = new DataTable(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(procedureName, conn); + dsCommand.SelectCommand.CommandType = CommandType.StoredProcedure; + + dsCommand.Fill(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + /// + /// + /// + /// + /// + /// + /// + public static bool ExecuteSQL(string sql, ref SqlParameter[] sqlParameters, DataTable dt) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + + + try + { + // if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.InsertCommand = new SqlCommand(sql, conn); + + for (int i = 0; i < sqlParameters.Length; i++) + { + sqlParameters[i].IsNullable = true; + dsCommand.InsertCommand.Parameters.Add(sqlParameters[i]); + } + if (dt == null) return false; + dt.AcceptChanges(); + for (int i = 0; i < dt.Rows.Count; i++) + { + dt.Rows[i].SetAdded(); + } + dsCommand.Update(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + //ApplicationConfig.ConnectionStringPIS_NEW_Value = "0"; + //TestConnection(); + //errorMessage = e.ToString(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteSQL\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + public static bool ExecuteNonQuery_newID(string sql, out long newID) + { + sql += ";select @@identity"; + string connectionString; + connectionString = ConnectionString_MES; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + conn.Open(); + newID = Convert.ToInt64(cmd.ExecuteScalar()); + } + return true; + } + catch (Exception e) + { + newID = 0; + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\n ExecuteNonQuery_newID\r\n�洢���̣�\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + return false; + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + } + + public static bool ExecuteOutNum(string sql, out int count) + { + string connectionString; + connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + count = 0; + try + { + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + count = Convert.ToInt32(cmd.ExecuteScalar().ToString()); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + } + + +} diff --git a/Common/04DataBaseAccess/DataBaseAccess/JsonHelper.cs b/Common/04DataBaseAccess/DataBaseAccess/JsonHelper.cs new file mode 100644 index 0000000..5ec9f9c --- /dev/null +++ b/Common/04DataBaseAccess/DataBaseAccess/JsonHelper.cs @@ -0,0 +1,336 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Data; +using System.Runtime.Serialization.Json; +using System.Web.Script.Serialization; +//using System.Runtime.Serialization.Json; + +//using System.Runtime.Serialization.Json; + +public class JsonHelper +{ + #region 序列化和反序列化 + // 序列化 + public static string JsonSerializer(T t) + { + // 使用 DataContractJsonSerializer 将 T 对象序列化为内存流。 + DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(T)); + MemoryStream ms = new MemoryStream(); + // 使用 WriteObject 方法将 JSON 数据写入到流中。 + jsonSerializer.WriteObject(ms, t); + // 流转字符串 + string jsonString = Encoding.UTF8.GetString(ms.ToArray()); + ms.Close(); + //替换Json的Date字符串 + string p = @"\\/Date\((\d+)\+\d+\)\\/"; + MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString); + Regex reg = new Regex(p); + jsonString = reg.Replace(jsonString, matchEvaluator); + return jsonString; + } + public static T JsonDeserialize(string jsonString) + { + //将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式 + string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}"; + MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate); + Regex reg = new Regex(p); + jsonString = reg.Replace(jsonString, matchEvaluator); + DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(T)); + // 字符串转流 + MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); + // 通过使用 DataContractJsonSerializer 的 ReadObject 方法,将 JSON 编码数据反序列化为T + T obj = (T)jsonSerializer.ReadObject(ms); + return obj; + } + public static string ConvertJsonDateToDateString(Match match) + { + string result = string.Empty; + DateTime dateTime = new DateTime(1970, 1, 1); + dateTime = dateTime.AddMilliseconds(long.Parse(match.Groups[1].Value)); + dateTime = dateTime.ToLocalTime(); + result = dateTime.ToString("yyyy-MM-dd HH:mm:ss"); + return result; + } + private static string ConvertDateStringToJsonDate(Match m) + { + string result = string.Empty; + DateTime dt = DateTime.Parse(m.Groups[0].Value); + dt = dt.ToUniversalTime(); + TimeSpan ts = dt - DateTime.Parse("1970-01-01"); + result = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds); + return result; + } + #endregion + + // 对象转换为Json + public static string ObjectToJson(object obj) + { + JavaScriptSerializer js = new JavaScriptSerializer(); + js.MaxJsonLength = Int32.MaxValue; // 定义JavaScriptSerializer接受字符串的最大长度 hdk 20180524 + try + { + return js.Serialize(obj); + } + catch (Exception exception) + { + + throw new Exception(exception.Message); + } + } + // 数据表转化为集合 + public static List> DataTableToList(DataTable dt) + { + List> list = new List>(); + foreach (DataRow dataRow in dt.Rows) + { + Dictionary dic = new Dictionary(); + + + foreach (DataColumn dc in dt.Columns) + { + if (dataRow[dc.ColumnName].GetType() == typeof(DateTime)) + { + string str = Convert.ToDateTime(dataRow[dc.ColumnName]).ToString("yyyy-MM-dd HH:mm:ss"); + dic.Add(dc.ColumnName, str); + } + else if + (dataRow[dc.ColumnName].GetType() == typeof(byte[])) + { + string str = Convert.ToBase64String((byte[])dataRow[dc.ColumnName]); + dic.Add(dc.ColumnName, str); + } + else + { + dic.Add(dc.ColumnName, dataRow[dc.ColumnName]); + } + + //Type type1 = dt.Rows[0]["产品图片"].GetType(); + //Type type2 = typeof(byte[]); + + } + list.Add(dic); + } + return list; + } + /// + /// 表转换为Json + /// + /// + /// + public static string DataTableToJson(DataTable dt) + { + return ObjectToJson(DataTableToList(dt)); + } + /// + /// 将DataTable中的数据转换成JSON格式 + /// + /// 数据源DataTable + /// 是否输出数据总条数 + /// JSON中显示的数据总条数 + /// + public static string CreateJsonParameters(DataTable dt, bool displayCount, int totalcount) + { + StringBuilder JsonString = new StringBuilder(); + //Exception Handling + + if (dt != null) + { + JsonString.Append("{ "); + JsonString.Append("\"rows\":[ "); + for (int i = 0; i < dt.Rows.Count; i++) + { + JsonString.Append("{ "); + for (int j = 0; j < dt.Columns.Count; j++) + { + if (j < dt.Columns.Count - 1) + { + //if (dt.Rows[i][j] == DBNull.Value) continue; + if (dt.Columns[j].DataType == typeof(bool)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + dt.Rows[i][j].ToString().ToLower() + ","); + } + else if (dt.Columns[j].DataType == typeof(string)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + ObjectToJson(dt.Rows[i][j]).ToString() + ","); + //JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + // dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\","); + } + else + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\","); + } + } + else if (j == dt.Columns.Count - 1) + { + //if (dt.Rows[i][j] == DBNull.Value) continue; + if (dt.Columns[j].DataType == typeof(bool)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + dt.Rows[i][j].ToString().ToLower()); + } + else if (dt.Columns[j].DataType == typeof(string)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + ObjectToJson(dt.Rows[i][j]).ToString()); + //JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + // dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\""); + } + else + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\""); + } + } + } + /*end Of String*/ + if (i == dt.Rows.Count - 1) + { + JsonString.Append("} "); + } + else + { + JsonString.Append("}, "); + } + } + JsonString.Append("]"); + + if (displayCount) + { + JsonString.Append(","); + + JsonString.Append("\"total\":"); + JsonString.Append(totalcount); + } + + JsonString.Append("}"); + return JsonString.ToString().Replace("\n", ""); + } + else + { + return null; + } + } + public static string CreateJsonParameters(DataTable dt) + { + StringBuilder JsonString = new StringBuilder(); + //Exception Handling + + if (dt != null) + { + JsonString.Append("{ "); + JsonString.Append("\"rows\":[ "); + for (int i = 0; i < dt.Rows.Count; i++) + { + JsonString.Append("{ "); + for (int j = 0; j < dt.Columns.Count; j++) + { + if (j < dt.Columns.Count - 1) + { + //if (dt.Rows[i][j] == DBNull.Value) continue; + if (dt.Columns[j].DataType == typeof(bool)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + dt.Rows[i][j].ToString().ToLower() + ","); + } + else if (dt.Columns[j].DataType == typeof(string)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + ObjectToJson(dt.Rows[i][j]).ToString() + ","); + //JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + // dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\","); + } + else + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\","); + } + } + else if (j == dt.Columns.Count - 1) + { + //if (dt.Rows[i][j] == DBNull.Value) continue; + if (dt.Columns[j].DataType == typeof(bool)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + dt.Rows[i][j].ToString().ToLower()); + } + else if (dt.Columns[j].DataType == typeof(string)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + ObjectToJson(dt.Rows[i][j]).ToString()); + //JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + // dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\""); + } + else + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\""); + } + } + } + /*end Of String*/ + if (i == dt.Rows.Count - 1) + { + JsonString.Append("} "); + } + else + { + JsonString.Append("}, "); + } + } + JsonString.Append("]"); + + JsonString.Append("}"); + return JsonString.ToString().Replace("\n", ""); + } + else + { + return null; + } + } + StringBuilder result = new StringBuilder(); + StringBuilder sb = new StringBuilder(); + /// + /// 根据DataTable生成EasyUI Tree Json树结构 + /// + /// 数据源 + /// ID列 + /// Text列 + /// 节点Url + /// 关系字段 + /// 父ID + public string GetTreeJsonByTable(DataTable tabel, string idCol, string txtCol, string url, string rela, object pId) + { + result.Append(sb.ToString()); + sb.Clear(); + if (tabel.Rows.Count > 0) + { + sb.Append("["); + string filer = string.Format("{0}='{1}'", rela, pId); + DataRow[] rows = tabel.Select(filer); + if (rows.Length > 0) + { + foreach (DataRow row in rows) + { + sb.Append("{\"id\":\"" + row[idCol] + "\",\"text\":\"" + row[txtCol] + "\",\"attributes\":\"" + row[url] + "\",\"state\":\"open\""); + if (tabel.Select(string.Format("{0}='{1}'", rela, row[idCol])).Length > 0) + { + sb.Append(",\"children\":"); + GetTreeJsonByTable(tabel, idCol, txtCol, url, rela, row[idCol]); + result.Append(sb.ToString()); + sb.Clear(); + } + result.Append(sb.ToString()); + sb.Clear(); + sb.Append("},"); + } + sb = sb.Remove(sb.Length - 1, 1); + } + sb.Append("]"); + result.Append(sb.ToString()); + sb.Clear(); + } + return result.ToString(); + } +} \ No newline at end of file diff --git a/Common/04DataBaseAccess/DataBaseAccess/Properties/AssemblyInfo.cs b/Common/04DataBaseAccess/DataBaseAccess/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..34eb61c --- /dev/null +++ b/Common/04DataBaseAccess/DataBaseAccess/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("DataBaseAccess")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DataBaseAccess")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("f434e066-4c59-47c8-aa82-6f48cc84501a")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Common/07WebBusinessFacade/BusinessFacade.sln b/Common/07WebBusinessFacade/BusinessFacade.sln new file mode 100644 index 0000000..dd3b15d --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32901.82 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "07BusinessFacade", "BusinessFacade\07BusinessFacade.csproj", "{F0A0C525-03FD-428A-9B17-7F54AA0E4475}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F0A0C525-03FD-428A-9B17-7F54AA0E4475}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F0A0C525-03FD-428A-9B17-7F54AA0E4475}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F0A0C525-03FD-428A-9B17-7F54AA0E4475}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F0A0C525-03FD-428A-9B17-7F54AA0E4475}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {855F5203-2363-4447-B96A-9A6FE08E1E46} + EndGlobalSection +EndGlobal diff --git a/Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/EngineIDCode.cs b/Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/EngineIDCode.cs new file mode 100644 index 0000000..0a7e003 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/EngineIDCode.cs @@ -0,0 +1,105 @@ +using System; +using System.Data; +using System.Data.SqlClient; + +using System.Collections; +using System.Collections.Specialized; +//using SystemFramework; +using DataLinkMesWork; +namespace SystemFramework +{ + +} +namespace bizFacade +{ + /// + /// 电子看板信息系统 + /// select 重量1,重量2,重量差,允许重量差,合格标志 + /// + public partial class BaseDataSystemMES + { + + /// + /// 电子看板_发动机号_分线组件装配关系_增加 + /// + /// + /// + /// + /// + static public void MailLineAndSubLineData_Insert(string engineID, int engineTypeID, string engineType, string engineID_SubLine) + { + string procedureName; + procedureName = "电子看板_发动机号_分线组件装配关系_增加"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号_分线", engineID_SubLine); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@机型代码", engineTypeID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 电子看板_发动机号_线首工位_查询_根据发动机号 + /// select 工位号,订单号,发动机号,基本机型,机型代码,发动机型号,托盘号, + /// 条码类型,零件流水号,零件流水号带空格,壳体编号型号,壳体编号型号带空格,QR码 + /// from dbo.电子看板_发动机号_线首工位 + /// where 发动机号=@发动机号 and 是否禁用=0 + /// + /// + /// + /// + static public void GetEngineID_Select(string opName,string engineID, out DataTable dt) + { + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_根据发动机号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + /// + /// 测量数据工位_监控系统_操作者工号_是否登录 + /// + /// + /// + /// + static public void CheckUser_IsLogin(string opName, out DataTable dt) + { + string procedureName; + procedureName = "测量数据工位_监控系统_操作者工号_是否登录"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + static public void SubLineLoadPartCountMatch_Update( string opName, int SubLineLoadPartCountMatch) + { + string procedureName; + procedureName = "MES_计划BOM_工位与名称_工步属性修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工步属性", SubLineLoadPartCountMatch); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + + static public void SubLineLoadPartCountMatch_Select(string opName, out int SubLineLoadPartCountMatch) + { + string procedureName; + DataTable dt; + procedureName = "MES_计划BOM_工位与名称_工步属性查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + if(dt.Rows.Count>0) + { + SubLineLoadPartCountMatch = Convert.ToInt32(dt.Rows[0][0]); + } + else + { + SubLineLoadPartCountMatch = 0; + } + } + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/Materials.cs b/Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/Materials.cs new file mode 100644 index 0000000..371a141 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/Materials.cs @@ -0,0 +1,204 @@ +using DataLinkMesWork; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + /// + /// 测量数据工位_监控系统_自动手动_查询 + /// + /// + /// + public static DataTable OpName_MIS_AutoOrMaunal_Select(string opName) + { + DataTable dt = null; + string sql; + sql = "SELECT top 1 自动手动 from 测量数据工位_监控系统_自动手动 where 工位号='" + opName + "' "; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + /// + /// 订单下达到线首工位 + /// 北汽福田工位状态监控MOBY_增加_线首工位订单下达 + /// + /// + /// + public static void OrderWorkStartToOpName(string opName,string orderForm) + { + string procedureName = "北汽福田工位状态监控MOBY_增加_线首工位订单下达"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", orderForm); + + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + /// + /// 电子看板_发动机号_线首工位_流水号_修改 + /// + /// + /// + /// + static public bool FirstOpName_Code_Update(string opName, string engineID, string partcode) + { + string procedureName = "电子看板_发动机号_线首工位_流水号_修改"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@托盘号", partcode); + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + return true; + } + else + { + return false; + } + } + + /// + /// 测量数据工位_监控系统_自动手动_增加 + /// + /// + /// + /// + public static bool OpName_MIS_AutoOrMaunal_Insert(string opName, int isAutoOrManul) + { + string produceName = "测量数据工位_监控系统_自动手动_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@自动手动", isAutoOrManul); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// MES_装配数据_零部件追溯_增加_不合格 + /// + /// + /// + /// + public static bool Material_Insert_NG(string opName, int m_ConfirmOkGo) + { + string produceName = "MES_装配数据_零部件追溯_增加_不合格"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@放行方式", m_ConfirmOkGo); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 测量数据工位_监控系统_手动打印_查询 + /// + /// + /// + /// + public static bool OpName_MIS_MaualPrint_Select(string opName, out DataTable dt) + { + string sql; + sql = "SELECT top 1 * FROM [测量数据工位_监控系统_手动打印] " + + "where 工位号='" + opName + "'"; + return DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// 测量数据工位_监控系统_MOBY_查询 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool OpName_MIS_CreateMoby_Select(string opName, + out string orderForm, out int engineTypeID, out string engineType, + out string engineID, out string palletCode, out int isRepair, out string repairCode) + { + orderForm = ""; + engineTypeID = 0; + engineType = ""; + engineID = ""; + palletCode = ""; + isRepair = 0; + repairCode = ""; + + string produceName = "测量数据工位_监控系统_创建发动机号_扫描方式"; + SqlParameter[] thisParms = new SqlParameter[8]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", SqlDbType.NVarChar, 50); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@产品型号代码", SqlDbType.Int, 4); + thisParms[2].Direction = ParameterDirection.Output; + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", SqlDbType.NVarChar, 50); + thisParms[3].Direction = ParameterDirection.Output; + thisParms[4] = new System.Data.SqlClient.SqlParameter("@发动机号", SqlDbType.NVarChar, 50); + thisParms[4].Direction = ParameterDirection.Output; + thisParms[5] = new System.Data.SqlClient.SqlParameter("@托盘号", SqlDbType.NVarChar, 50); + thisParms[5].Direction = ParameterDirection.Output; + thisParms[6] = new System.Data.SqlClient.SqlParameter("@拆解标志", SqlDbType.Int, 4); + thisParms[6].Direction = ParameterDirection.Output; + thisParms[7] = new System.Data.SqlClient.SqlParameter("@拆解返修条码", SqlDbType.NVarChar, 50); + thisParms[7].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + orderForm = thisParms[1].Value.ToString(); + engineTypeID = Convert.ToInt32(thisParms[2].Value); + engineType = thisParms[3].Value.ToString(); + engineID = thisParms[4].Value.ToString(); + palletCode = thisParms[5].Value.ToString(); + isRepair = Convert.ToInt32(thisParms[6].Value); + repairCode = thisParms[7].Value.ToString(); + return true; + } + return false; + } + + /// + /// 电子看板_工位机型_质量数据测量位置_临时表_查询_完成情况 + /// + /// 工位号 + /// 拧紧序号 + /// 套筒号 + /// 工步属性 + /// 是否全部完成 + /// + public static bool MesServer_ShaftPosition_Select_FinishResult(string opName, out int ProcessCode, out int BoltCode, out int workStepProperty, out bool sn_WorkingStepIsOver) + { + BoltCode = 0; + ProcessCode = 512; + workStepProperty = 0; + sn_WorkingStepIsOver = true; + + string produceName = "电子看板_工位机型_质量数据测量位置_临时表_查询_完成情况"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@拧紧序号", SqlDbType.Int, 4); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@套筒号", SqlDbType.Int, 4); + thisParms[2].Direction = ParameterDirection.Output; + thisParms[3] = new System.Data.SqlClient.SqlParameter("@工步属性", SqlDbType.Int, 4); + thisParms[3].Direction = ParameterDirection.Output; + thisParms[4] = new System.Data.SqlClient.SqlParameter("@是否全部完成", SqlDbType.Int, 4); + thisParms[4].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + ProcessCode = Convert.ToInt32(thisParms[1].Value); + BoltCode = Convert.ToInt32(thisParms[2].Value); + workStepProperty = Convert.ToInt32(thisParms[3].Value); + sn_WorkingStepIsOver = Convert.ToBoolean(thisParms[4].Value); + return true; + } + return false; + } + + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/OpName.MainForm.Launch.cs b/Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/OpName.MainForm.Launch.cs new file mode 100644 index 0000000..2967908 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/OpName.MainForm.Launch.cs @@ -0,0 +1,447 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Collections; +using System.Collections.Specialized; +using SystemFramework; + +namespace bizFacade +{ + /// + /// 电子看板信息系统 + /// + public partial class BaseDataSystemMES + { + ///// + ///// 电子看板_发动机号_线首工位_创建线首发动机号_根据输入机型代码_手动方式 + ///// + ///// 工位号 + ///// 发动机型号 + ///// 年份 + ///// 月份 + ///// 日期 + ///// 流水号 + ///// @是否分线 bit=0 @是否分线 = 0 总线线首(OP2010);=1分线线首(OP1010,OP2100) + ///// + //static public void GetEngineID_Manual(string opName, string engineType, string engineYear, string engineMoon, string engineDay, int engineNumber, bool isSubLine, out DataTable dt) + //{ + // string procedureName; + // procedureName = "电子看板_发动机号_线首工位_创建线首发动机号_根据输入机型代码_手动方式"; + // SqlParameter[] thisParms = new SqlParameter[7]; + // thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + // thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + // thisParms[2] = new System.Data.SqlClient.SqlParameter("@年份", engineYear); + // thisParms[3] = new System.Data.SqlClient.SqlParameter("@月份", engineMoon); + // thisParms[4] = new System.Data.SqlClient.SqlParameter("@日期", engineDay); + // thisParms[5] = new System.Data.SqlClient.SqlParameter("@流水号", engineNumber); + // thisParms[6] = new System.Data.SqlClient.SqlParameter("@是否分线", isSubLine); + // DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + //} + + /// + /// 电子看板_发动机号_线首工位_创建线首发动机号_根据输入机型代码 + /// 工件机型,机型代码,工件编号,壳体编号型号,工件流水号,QR码,基本流水号 + /// + /// 工位号 + /// 发动机型号 + /// 托盘号 = 0 总线线首(OP2010);=1分线线首(OP1010,OP2100) + /// 工件机型,机型代码,工件编号,壳体编号型号,工件流水号,QR码,基本流水号 + static public void GetEngineID_Auto(string opName, string engineType, string palletCode, out DataTable dt) + { + try + { + string procedureName; + procedureName = "电子看板_发动机号_线首工位_创建线首发动机号_根据输入机型代码"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@托盘号", palletCode); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + catch (Exception err) + { + dt = null; + } + } + + /// + /// 分线线首号生成 + /// + /// + /// + /// + /// + static public void GetEngineID_Auto_branch(string opName, string engineType, string partcode, out DataTable dt) + { + string procedureName; + procedureName = "电子看板_发动机号_线首工位_创建线首发动机号_根据输入机型代码_分线"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@托盘号", partcode); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + /// + /// 电子看板_发动机号_线首工位_创建线首发动机号_根据输入机型代码_分线_手动方式 + /// + /// + /// + /// + /// + /// + /// + /// + /// + static public void GetEngineID_Manual_branch(string opName, string engineType, string engineYear, string engineMoon, string engineDay, int engineNumber, bool isSubLine, out DataTable dt) + { + string procedureName; + procedureName = "电子看板_发动机号_线首工位_创建线首发动机号_根据输入机型代码_分线_手动方式"; + SqlParameter[] thisParms = new SqlParameter[7]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@年份", engineYear); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@月份", engineMoon); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@日期", engineDay); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@流水号", engineNumber); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@是否分线", isSubLine); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + ///// + ///// [电子看板_发动机号_线首工位_手动方式_增加] + ///// + ///// 工位号 + ///// 订单号 + ///// 托盘号 + ///// 工件机型 + ///// 工件机型,机型代码,工件编号, 壳体编号型号,工件流水号,QR码,基本流水号 + //static public bool GetEngineID_ManulEngine_Save(string opName, string orderForm, string PartPalletCode, string engineType, string EngineID_DateTime, DataTable dt) + //{ + // string engineID; + // int engineTypeID; + // string partCode_Space; + // string partCode; + // string shellCode; + // string shellCode_Space; + // string QR_Code; + // int engineCount; + // int barCodeType; + // string engineTypeBase; + // string partCode_Text; + // string partCode_BarCode; + // string engineType_Text; + // string engineType_BarCode; + + // try + // { + // GetEngineIDFromFirstOpName(out engineID, out engineTypeID, out partCode_Space, + // out partCode, out shellCode, out shellCode_Space, out QR_Code, + // out engineCount, out barCodeType, out engineTypeBase, + // out partCode_Text, out partCode_BarCode, out engineType_Text, out engineType_BarCode, dt); + + + // string procedureName; + // procedureName = "电子看板_发动机号_线首工位_手动方式_增加"; + // SqlParameter[] thisParms = new SqlParameter[19]; + // thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + // thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", orderForm); + // thisParms[2] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + // thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + // thisParms[4] = new System.Data.SqlClient.SqlParameter("@基本机型", engineTypeBase); + // thisParms[5] = new System.Data.SqlClient.SqlParameter("@机型代码", engineTypeID); + // thisParms[6] = new System.Data.SqlClient.SqlParameter("@托盘号", PartPalletCode); + // thisParms[7] = new System.Data.SqlClient.SqlParameter("@条码类型", barCodeType); + // thisParms[8] = new System.Data.SqlClient.SqlParameter("@零件流水号", partCode); + // thisParms[9] = new System.Data.SqlClient.SqlParameter("@零件流水号带空格", partCode_Space); + // thisParms[10] = new System.Data.SqlClient.SqlParameter("@壳体编号型号", shellCode); + // thisParms[11] = new System.Data.SqlClient.SqlParameter("@壳体编号型号带空格", shellCode_Space); + // thisParms[12] = new System.Data.SqlClient.SqlParameter("@QR码", QR_Code); + // thisParms[13] = new System.Data.SqlClient.SqlParameter("@基本流水号", engineCount); + // thisParms[14] = new System.Data.SqlClient.SqlParameter("@流水号文本", partCode_Text); + // thisParms[15] = new System.Data.SqlClient.SqlParameter("@流水号条码", partCode_BarCode); + // thisParms[16] = new System.Data.SqlClient.SqlParameter("@型号文本", engineType_Text); + // thisParms[17] = new System.Data.SqlClient.SqlParameter("@型号条码", engineType_BarCode); + // thisParms[18] = new System.Data.SqlClient.SqlParameter("@工件编号时间", EngineID_DateTime); + + // return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + // // return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + // } + + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, err.Message); + // return false; + + // } + //} + + + ///// + ///// 电子看板_发动机号_线首工位_增加 + ///// + ///// 工位号 + ///// 订单号 + ///// 托盘号 + ///// 工件机型 + ///// 工件机型,机型代码,工件编号, 壳体编号型号,工件流水号,QR码,基本流水号 + //static public bool GetEngineID_Save(string opName, string orderForm, string PartPalletCode, string engineType, DataTable dt) + //{ + // string engineID; + // int engineTypeID; + // string partCode_Space; + // string partCode; + // string shellCode; + // string shellCode_Space; + // string QR_Code; + // int engineCount; + // int barCodeType; + // string engineTypeBase; + // string partCode_Text; + // string partCode_BarCode; + // string engineType_Text; + // string engineType_BarCode; + // string codeCreatetime; + // string a_code; + // string b_code; + // string c_code; + // string d_code; + + // try + // { + // GetEngineIDFromFirstOpName_Auto(out engineID, out engineTypeID, out partCode_Space, + // out partCode, out shellCode, out shellCode_Space, out QR_Code, + // out engineCount, out barCodeType, out engineTypeBase, + // out partCode_Text, out partCode_BarCode, out engineType_Text, out engineType_BarCode, out codeCreatetime, + // out a_code, out b_code, out c_code, out d_code, + // dt); + + + // string procedureName; + // procedureName = "电子看板_发动机号_线首工位_增加"; + // SqlParameter[] thisParms = new SqlParameter[23]; + // thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + // thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", orderForm); + // thisParms[2] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + // thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + // thisParms[4] = new System.Data.SqlClient.SqlParameter("@基本机型", engineTypeBase); + // thisParms[5] = new System.Data.SqlClient.SqlParameter("@机型代码", engineTypeID); + // thisParms[6] = new System.Data.SqlClient.SqlParameter("@托盘号", PartPalletCode); + // thisParms[7] = new System.Data.SqlClient.SqlParameter("@条码类型", barCodeType); + // thisParms[8] = new System.Data.SqlClient.SqlParameter("@零件流水号", partCode); + // thisParms[9] = new System.Data.SqlClient.SqlParameter("@零件流水号带空格", partCode_Space); + // thisParms[10] = new System.Data.SqlClient.SqlParameter("@壳体编号型号", shellCode); + // thisParms[11] = new System.Data.SqlClient.SqlParameter("@壳体编号型号带空格", shellCode_Space); + // thisParms[12] = new System.Data.SqlClient.SqlParameter("@QR码", QR_Code); + // thisParms[13] = new System.Data.SqlClient.SqlParameter("@基本流水号", engineCount); + // thisParms[14] = new System.Data.SqlClient.SqlParameter("@流水号文本", partCode_Text); + // thisParms[15] = new System.Data.SqlClient.SqlParameter("@流水号条码", partCode_BarCode); + // thisParms[16] = new System.Data.SqlClient.SqlParameter("@型号文本", engineType_Text); + // thisParms[17] = new System.Data.SqlClient.SqlParameter("@型号条码", engineType_BarCode); + // thisParms[18] = new System.Data.SqlClient.SqlParameter("@条码创建时间", codeCreatetime); + // thisParms[19] = new System.Data.SqlClient.SqlParameter("@总成代码", a_code); + // thisParms[20] = new System.Data.SqlClient.SqlParameter("@零件图号", b_code); + // thisParms[21] = new System.Data.SqlClient.SqlParameter("@邓氏码", c_code); + // thisParms[22] = new System.Data.SqlClient.SqlParameter("@VPPS码", d_code); + + + // return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + // // return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + // } + + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, err.Message); + // return false; + + // } + //} + + /// + /// 电子看板_发动机号_线首工位_增加 + /// + /// 工位号 + /// 订单号 + /// 托盘号 + /// 工件机型 + /// 工件机型,机型代码,工件编号, 壳体编号型号,工件流水号,QR码,基本流水号 + static public bool GetEngineID_Save_Outline(string opName, string orderForm, string PartPalletCode, string engineType, int engineTypeID, string engineID, string barCodeType) + { + + try + { + string procedureName; + procedureName = "电子看板_发动机号_线首工位_增加"; + SqlParameter[] thisParms = new SqlParameter[19]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", orderForm); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@基本机型", engineType); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@机型代码", engineTypeID); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@托盘号", PartPalletCode); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@条码类型", barCodeType); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@零件流水号", engineID); + thisParms[9] = new System.Data.SqlClient.SqlParameter("@零件流水号带空格", engineID); + thisParms[10] = new System.Data.SqlClient.SqlParameter("@壳体编号型号", engineType); + thisParms[11] = new System.Data.SqlClient.SqlParameter("@壳体编号型号带空格", engineType); + thisParms[12] = new System.Data.SqlClient.SqlParameter("@QR码", engineID); + thisParms[13] = new System.Data.SqlClient.SqlParameter("@基本流水号", 1); + thisParms[14] = new System.Data.SqlClient.SqlParameter("@流水号文本", engineID); + thisParms[15] = new System.Data.SqlClient.SqlParameter("@流水号条码", engineID); + thisParms[16] = new System.Data.SqlClient.SqlParameter("@型号文本", engineType); + thisParms[17] = new System.Data.SqlClient.SqlParameter("@型号条码", engineType); + thisParms[18] = new System.Data.SqlClient.SqlParameter("@条码创建时间", DateTime.Now.ToShortDateString()); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + return false; + + } + } + /// + /// 电子看板_装配零件_盆子类型_查询 + /// + static public DataTable WorkPlatePartSelect(string opName, string engineID) + { + try + { + DataTable dt = new DataTable(); + string procedureName; + procedureName = "电子看板_装配零件_盆子类型_查询"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineID); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + return dt; + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + return null; + } + } + /// + /// [电子看板_发动机号_线首工位]信息手动用 + /// + /// 发动机号 + /// 机型代码 + /// 零件流水号带空格 + /// 零件流水号 + /// 壳体编号型号 + /// 壳体编号型号带空格 + /// QR码 + /// 基本流水号 + /// 条码类型 + /// 基本机型 + /// 流水号文本 + /// 流水号条码 + /// 型号文本 + /// 型号条码 + /// + //static public void GetEngineIDFromFirstOpName(out string engineID, out int engineTypeID, out string partCode_Space, + // out string partCode, out string shellCode, out string shellCode_Space, out string QR_Code, + // out int engineCount, out int barCodeType, out string engineTypeBase, + // out string partCode_Text, out string partCode_BarCode, + // out string engineType_Text, out string engineType_BarCode, + // DataTable dt) + //{ + // engineID = ""; + // engineTypeID = 0; + // partCode_Space = ""; + // partCode = ""; + // shellCode = ""; + // shellCode_Space = ""; + // QR_Code = ""; + // engineCount = 0; + // barCodeType = 0; + // engineTypeBase = ""; + // partCode_Text = ""; + // partCode_BarCode = ""; + // engineType_Text = ""; + // engineType_BarCode = ""; + + // engineID = dt.Rows[0]["发动机号"].ToString(); + // engineTypeID = Convert.ToInt32(dt.Rows[0]["机型代码"]); + // shellCode = dt.Rows[0]["壳体编号型号"].ToString(); + // shellCode_Space = dt.Rows[0]["壳体编号型号带空格"].ToString(); + // partCode = dt.Rows[0]["零件流水号"].ToString(); + // partCode_Space = dt.Rows[0]["零件流水号带空格"].ToString(); + // QR_Code = dt.Rows[0]["QR码"].ToString(); + // engineCount = Convert.ToInt32(dt.Rows[0]["基本流水号"]); + // engineTypeBase = dt.Rows[0]["基本机型"].ToString(); + // barCodeType = Convert.ToInt32(dt.Rows[0]["条码类型"]); + // partCode_Text = dt.Rows[0]["流水号文本"].ToString(); + // partCode_BarCode = dt.Rows[0]["流水号条码"].ToString(); + // engineType_Text = dt.Rows[0]["型号文本"].ToString(); + // engineType_BarCode = dt.Rows[0]["型号条码"].ToString(); + + //} + + /// + /// [电子看板_发动机号_线首工位]信息自动用 + /// + /// 发动机号 + /// 机型代码 + /// 零件流水号带空格 + /// 零件流水号 + /// 壳体编号型号 + /// 壳体编号型号带空格 + /// QR码 + /// 基本流水号 + /// 条码类型 + /// 基本机型 + /// 流水号文本 + /// 流水号条码 + /// 型号文本 + /// 型号条码 + /// + static public void GetEngineIDFromFirstOpName_Auto(out string engineID, out int engineTypeID, out string partCode_Space, + out string partCode, out string shellCode, out string shellCode_Space, out string QR_Code, + out int engineCount, out int barCodeType, out string engineTypeBase, + out string partCode_Text, out string partCode_BarCode, + out string engineType_Text, out string engineType_BarCode, out string CodeCreatetime, + out string a_code, out string b_code, out string c_code, out string d_code, + DataTable dt) + { + engineID = ""; + engineTypeID = 0; + partCode_Space = ""; + partCode = ""; + shellCode = ""; + shellCode_Space = ""; + QR_Code = ""; + engineCount = 0; + barCodeType = 0; + engineTypeBase = ""; + partCode_Text = ""; + partCode_BarCode = ""; + engineType_Text = ""; + engineType_BarCode = ""; + + engineID = dt.Rows[0]["发动机号"].ToString(); + engineTypeID = Convert.ToInt32(dt.Rows[0]["机型代码"]); + shellCode = dt.Rows[0]["壳体编号型号"].ToString(); + shellCode_Space = dt.Rows[0]["壳体编号型号带空格"].ToString(); + partCode = dt.Rows[0]["零件流水号"].ToString(); + partCode_Space = dt.Rows[0]["零件流水号带空格"].ToString(); + QR_Code = dt.Rows[0]["QR码"].ToString(); + engineCount = Convert.ToInt32(dt.Rows[0]["基本流水号"]); + engineTypeBase = dt.Rows[0]["基本机型"].ToString(); + barCodeType = Convert.ToInt32(dt.Rows[0]["条码类型"]); + partCode_Text = dt.Rows[0]["流水号文本"].ToString(); + partCode_BarCode = dt.Rows[0]["流水号条码"].ToString(); + engineType_Text = dt.Rows[0]["型号文本"].ToString(); + engineType_BarCode = dt.Rows[0]["型号条码"].ToString(); + CodeCreatetime = dt.Rows[0]["条码创建时间"].ToString(); + a_code = dt.Rows[0]["总成代码"].ToString(); + b_code = dt.Rows[0]["零件图号"].ToString(); + c_code = dt.Rows[0]["邓氏码"].ToString(); + d_code = dt.Rows[0]["VPPS码"].ToString(); + } + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/RepairWorkStation.cs b/Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/RepairWorkStation.cs new file mode 100644 index 0000000..d855a37 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/RepairWorkStation.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace bizFacade +{ + public class RepairWorkStation + { + /// + /// 保存复合工位工作状态 + /// + /// + /// + public static void StationStatusChanges(string OpName,int Status) + { + if (NormalOrRepairRecord_Hash.ContainsKey (OpName)) + { + NormalOrRepairRecord_Hash[OpName] = Status; + + } + else + { + NormalOrRepairRecord_Hash.Add(OpName,Status ); + } + + } + + /// + /// 查询工位工作状态 1为正常,其他为返修 + /// + /// + /// + public static int StationStatusSearch(string OpName) + { + if (NormalOrRepairRecord_Hash.ContainsKey(OpName)) + { + return Convert.ToInt32(NormalOrRepairRecord_Hash[OpName]); + + } + else + { + return 1; + } + } + + + + public static Hashtable NormalOrRepairRecord_Hash = new Hashtable(); + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/ShowLED.cs b/Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/ShowLED.cs new file mode 100644 index 0000000..732ff13 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/ShowLED.cs @@ -0,0 +1,91 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Collections; +using System.Collections.Specialized; +using SystemFramework; + +namespace bizFacade +{ + /// + /// 电子看板信息系统 + /// + public partial class BaseDataSystemMES + { + /// + /// 基本数据_工作日历_班次产量查询_New + /// + /// + /// 在线产量 + /// 在线节拍 + static public void OpNameCount_BQ(string opName, out int opNameCount, out int opNameCountTime) + { + opNameCount = 0; + opNameCountTime = 0; + string procedureName; + procedureName = "基本数据_工作日历_班次产量查询_北汽"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@在线产量", 0); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@在线节拍", 0); + thisParms[2].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + opNameCount = Convert.ToInt32(thisParms[1].Value); + opNameCountTime = Convert.ToInt32(thisParms[2].Value); + } + } + + /// + /// 基本数据_工作日历_班次产量查询_New + /// + /// + /// 在线产量 + /// 在线节拍 + static public void OpNameCount_New(string opName, out int opNameCount, out int opNameCountTime) + { + opNameCount = 0; + opNameCountTime = 0; + string procedureName; + procedureName = "基本数据_工作日历_班次产量查询_New"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@在线产量", 0); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@在线节拍", 0); + thisParms[2].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + opNameCount = Convert.ToInt32(thisParms[1].Value); + opNameCountTime = Convert.ToInt32(thisParms[2].Value); + } + } + + /// + /// MES界面显示_消息滚动_增加 + /// + /// + /// + /// + public static bool Rolling_news_Add(string opName, string content) + { + + string procedureName = "MES界面显示_消息滚动_增加"; + bool isOK; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@ScollNotice", content); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + if (isOK) + { + return true; + } + else + { + return false; + } + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/vssver2.scc b/Common/07WebBusinessFacade/BusinessFacade/05Biz/MES/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..f6a03607ae5b94582ddded10e98999c15ab8f547 GIT binary patch literal 1047 zcmXpJVq~~_m%l5bInsUAj6{**Nns-G47*>-2{SN=FfcI418J^nllJ$%xzEoCR|WD#o=CB+i9ZD9s{#4dH!?YuR@?*g)q#BRFEdWO-+dU&*8uXBn8S}MkEmx%=O5K=|4~zLot^A9bZ8VD&mc{?wBiGLuD)g88~Y{^C2C zk1MX62J`iReASMlyq#+xe0?B4$?)FqEAJut4S@WzDctr2QYXOb4T1cs#$L|DaVNoi zBOsqQWU*|2;yEy1Mc+5G*d?(f5tDWe)^p0Na!X83Oi9)Ebq!{4N-RzVDGjbHE=kP= zis(5O7pLYX + /// 机床报警变量 + /// 103 + ///
+ /// + public static DataTable BaseData_tagTable_Alarm() + { + //string errorMessage; + DataTable dt; + string sql; + sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo FROM [MES_基本变量_原始数据] where 变量类型代码 = 103 and 是否启用 = 1" + + " and (监控属性代码 = '" + 1 + "')"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + /// + /// 测量数据发动机在线状态_增加数据_自动工位 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + static public void WorkStartInsert_AutoWorkStation(string opName, string EngineID, int Pallet, DateTime arrivedTime, DateTime leavedTime, int TimeDiff, int Target, string lineType, string isPass, int OpNameUpDownType) + { + string procedureName; + procedureName = "测量数据发动机在线状态_增加数据_自动工位"; + SqlParameter[] thisParms = new SqlParameter[10]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@托盘编号", Pallet); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@到达时间", arrivedTime); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@离开时间", leavedTime); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@在线时间", TimeDiff); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@目标时间", Target); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@线体类型", lineType); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@是否合格", isPass); + thisParms[9] = new System.Data.SqlClient.SqlParameter("@工位上下线类型", OpNameUpDownType); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + static public void WorkStartInsert(string opName, int isOK) + { + string procedureName; + procedureName = "测量数据发动机在线状态_增加数据"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@是否合格", isOK.ToString()); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + static public void OPA90CheckErrorData(string EngineID) + { + string procedureName; + procedureName = "合力_轮毂桥壳缓存数据_异常记录标记"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@轮毂总成号", EngineID); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + static public void OPA90CheckQiaoKeErrorData(string EngineID) + { + string procedureName; + procedureName = "合力_轮毂桥壳缓存数据_异常记录标记_桥壳"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@桥壳总成号", EngineID); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + static public void Set_EngineWorkOpName(string EngineID, string targetOpName) + { + string procedureName; + procedureName = "合力_转线设置工件状态"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总成号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@目标工位号", targetOpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + static public void SLResult_Add(string SLResult, string EngineID, string EngineType, int EngineTypeID, int TurnLineWork) + { + string procedureName; + procedureName = "试漏结果_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@测量结果", SLResult); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@总成码", EngineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@机型号", EngineType); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@机型代码", EngineTypeID); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@转线工件", TurnLineWork); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + + // ALTER PROCEDURE[dbo].[测量数据报警全部_增加数据] + // @TagID nvarchar(50), + //@OpName nvarchar(50), + //@TagValue int, + //@State int, + //@alarmStartTime datetime, + //@alarmEndTime datetime, + //@TimeDiff int, + //@Text1 nvarchar(255), + //@Text2 nvarchar(255) + + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// 报警级别 + /// 报文 + /// + /// + public static bool Alarm_Insert(string TagID, string tagTypeID, string opName, int TagValue, + DateTime alarmStartTime, DateTime alarmEndTime, int TimeDiff, + string Text1, string Text2, string TagOrderBy) + { + + + string produceName = "测量数据工位报警全部_增加数据"; + SqlParameter[] thisParms = new SqlParameter[10]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@TagID", TagID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@TagTypeID", tagTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@opName", opName); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@TagValue", TagValue); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@alarmStartTime", alarmStartTime); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@alarmEndTime", alarmEndTime); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@TimeDiff", TimeDiff); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@Text1", Text1); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@Text2", Text2); + thisParms[9] = new System.Data.SqlClient.SqlParameter("@TagOrderBy", TagOrderBy); + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + + return true; + } + return false; + } + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/05Biz/OPC/BaseDataSystemMES.OPC.QualityData.GoodBad.cs b/Common/07WebBusinessFacade/BusinessFacade/05Biz/OPC/BaseDataSystemMES.OPC.QualityData.GoodBad.cs new file mode 100644 index 0000000..d56b31f --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/05Biz/OPC/BaseDataSystemMES.OPC.QualityData.GoodBad.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; + +using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + /// + /// 发动机类型转换表 + /// SELECT ID,发动机机型代码 FROM MES_计划BOM_发动机型号代码 + /// + /// + public static DataTable BaseData_tagTable_QualityData_EngineTypeID() + { + DataTable dt; + string sql; + sql = "SELECT ID,发动机机型代码 FROM MES_计划BOM_发动机型号代码 "; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + + /// + /// 测量合格标志 + /// 全部测量数据的测量工位 + /// + /// + public static DataTable BaseData_tagTable_QualityData_GoodBad_MIS_OpName_B5A() + { + DataTable dt; + string sql; + sql = "SELECT distinct 工位号 " + + " FROM MES_基本变量_原始数据 " + + " where 变量特点 = 8 and 是否启用 = 1 " + + " and (监控属性代码 = '" + 1 + "')"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + /// + /// 测量合格标志 + /// 全部测量数据的测量工位的数据来源 + /// + /// + public static DataTable BaseData_tagTable_QualityData_GoodBad_MIS_OpName(string opName) + { + DataTable dt; + string sql; + sql = "SELECT TagID,工位号,数据来源 " + + " FROM MES_基本变量_原始数据 " + + " where OpcServer_OPNAME = '1' and 是否启用 = 1 " + + " and 工位号='" + opName+"'" + + " and (监控属性代码 = '" + 1 + "')"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + /// + /// 测量合格标志 + /// 全部测量数据的测量工位的数据来源的测量变量 + /// + /// + public static DataTable BaseData_tagTable_QualityData_GoodBad_MIS_OpName(string opName,string opNameFrom) + { + DataTable dt; + string sql; + sql = "SELECT TagID " + + " FROM MES_基本变量_原始数据 " + + " where OpcServer_OPNAME = '2' and 是否启用 = 1 " + + " and 工位号='" + opName + "'" + + " and 数据来源='" + opNameFrom + "'" + + " and (监控属性代码 = '" + 1 + "')"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/05Biz/OPC/BaseDataSystemMES.OPC.QualityData.cs b/Common/07WebBusinessFacade/BusinessFacade/05Biz/OPC/BaseDataSystemMES.OPC.QualityData.cs new file mode 100644 index 0000000..0b83b7f --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/05Biz/OPC/BaseDataSystemMES.OPC.QualityData.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; + +using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + + + /// + /// 测量工位号和工位名称 + /// + /// + public static DataTable BaseData_tagTable_QualityData_OpName_Name() + { + DataTable dt; + string sql = "SELECT distinct [工位号],[工位名称] FROM [MES_计划BOM_工位与名称] " + + " where (监控属性代码 = '" + 1+ "')" + + " ORDER BY 工位号 "; + //来源于SQL Server + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + /// + /// MES_计划BOM_工位与名称 + /// + /// + public static DataTable BaseData_tagTable_OpName() + { + //DataTable dt; + //string sql = "SELECT * FROM [MES_计划BOM_工位与名称] " + // + " where (监控属性代码 = '" + ApplicationConfig.MES_Code.ToString() + "')" + // + " ORDER BY 工位号 "; + //DataAccess.ExecuteDataTable(sql, out dt); + //return dt; + + //2022.07.27.LLX 处理了一下子 + DataTable dt; + string sql = "SELECT * FROM [MES_计划BOM_工位与名称] " + + " where (监控属性代码 = '" + 1 + "') and [是否通过监控系统保存数据] is not null" + + " ORDER BY 工位号 "; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/05Biz/OPC/BaseDataSystemMES.OPC.cs b/Common/07WebBusinessFacade/BusinessFacade/05Biz/OPC/BaseDataSystemMES.OPC.cs new file mode 100644 index 0000000..ac285f5 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/05Biz/OPC/BaseDataSystemMES.OPC.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; + +using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + + /// + /// MES_基本变量_DB数据结构_根据工位代码_获得普通变量 + /// + /// + public static DataTable BaseData_tagTable_OpcServerMES(int mesCode, string opName) + { + DataTable dt; + string sql; + sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo,变量特点,变量排序 " + + " FROM MES_基本变量_原始数据 " + + " where 变量类型代码 = "+mesCode.ToString()+" and 是否启用 = 1" + + " and 工位号='" + opName + "'" + + " and (监控属性代码 = '" + 1+ "')"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + /// + /// MES_基本变量_DB数据结构_根据工位代码_获得普通变量 + /// + /// + public static DataTable BaseData_tagTable_OpcServerMES(int mesCode) + { + DataTable dt; + string sql; + sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo,变量特点,变量排序 " + + " FROM MES_基本变量_原始数据 " + + " where 变量类型代码 = " + mesCode.ToString() + " and 是否启用 = 1" + + " and (监控属性代码 = '" + 1 + "')"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + /// + /// MES_基本变量_DB数据结构_获得激发变量 + /// + /// + public static DataTable BaseData_tagTable_All() + { + //string errorMessage; + DataTable dt = null; + string sql; + sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo,变量特点,变量排序 FROM [MES_基本变量_原始数据] " + + " where ((变量类型代码 >= 19 and 变量类型代码 <= 27) or (变量类型代码 = 101) or (变量类型代码 = 102) or (变量类型代码 = 105) or (变量类型代码 = 1000) or (变量类型代码 = 1001) or (变量类型代码 = 1002) or (变量类型代码 = 1003) or (变量类型代码 = 1004)) and (是否启用 = 1) " + + " and (监控属性代码 = '" + 1 + "')" + + " ORDER BY TagID "; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + /// + /// MES_基本变量_DB数据结构_获得激发变量 + /// + /// + public static DataTable BaseData_tagTable_All_B5A() + { + //string errorMessage; + DataTable dt = null; + string sql; + sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo,变量特点,变量排序 FROM [MES_基本变量_原始数据] " + + " where ((变量类型代码 = 101) or (变量类型代码 = 102) ) and (是否启用 = 1) " + + " and (监控属性代码 = '" + 1 + "')" + + " ORDER BY TagID "; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + /// + /// 20170310 新加 + /// MES_基本变量_DB数据结构_获得所有普通变量(除101.102.103.104.105) + /// + /// + public static DataTable BaseData_tagTable_OpcServerMES_ALL_CF() + { + DataTable dt; + string sql; + sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo,变量特点,变量排序 " + + " FROM MES_基本变量_原始数据 " + + " where 变量类型代码 <> 101 and 变量类型代码 <> 102 and 变量类型代码 <> 103 and 变量类型代码 <> 104 and 变量类型代码 <> 105 and 是否启用 = 1" + + " and (监控属性代码 = '" + 1 + "')"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/05Biz/OPC/vssver2.scc b/Common/07WebBusinessFacade/BusinessFacade/05Biz/OPC/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..37c4fff017907453df4691d3309f5902a717bcb8 GIT binary patch literal 432 zcmXpJVq~~_m%l5bInsUAj6{**Nns){4%9y`5@ujvXJB9`2GWU(Js2LWZ{%kL@=JjH z`!4al9&fwB{8Av_y8Z9#vk7frei@Lz>#5A6WSv$pzZ}SqbUKp^<5vLr`FGczJhZVF zEME!a-&6X&)WNs|%vaI(%`A3FEJ?(qU4!+UGOOGYlM_=?_5A~!8JrS}Q$b3DD~n4~ zbA5sGKv6x%oW!DBz2ssX(l{kNQWJ|xoKh1@aO?F=OwP#6OARhbEGaF + /// 通用BizFaced类 + ///
+ public partial class BaseDataSystemMES + { + /// + /// 验证质量数据状态哈希表 + /// + public static Hashtable QualityVerifyStatus_Hash = new Hashtable(); + + /// + /// 读取工位质量数据验证状态 + /// + /// + /// + public static bool QualityVerifyStatus_Hash_Read(string OpName) + { + if (QualityVerifyStatus_Hash.Contains(OpName)) + { + return Convert.ToBoolean(QualityVerifyStatus_Hash[OpName]); + + } + return false; + + } + + + /// + /// 写入工位质量数据验证状态 + /// + /// + /// + public static void QualityVerifyStatus_Hash_Write(string OpName, bool Result) + { + if (QualityVerifyStatus_Hash.Contains(OpName)) + { + QualityVerifyStatus_Hash[OpName] = Result; + + } + else + { + QualityVerifyStatus_Hash.Add(OpName, Result); + + } + } + + + + + /// + /// 部装工位质量数据验证 + /// + /// + public static bool QulityDataVerify(string OpName, string EngineID_Subline, out string AlarmStr) + { + int IsAlarm = 0; + AlarmStr = ""; + string procedureName; + procedureName = "测量数据工位_监控系统_部装质量数据验证"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@部装总成号", EngineID_Subline); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@是否报警", IsAlarm); + thisParms[2].Direction = ParameterDirection.Output; + thisParms[3] = new System.Data.SqlClient.SqlParameter("@报警工位号", AlarmStr); + thisParms[3].Direction = ParameterDirection.Output; + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + IsAlarm = Convert.ToInt32(thisParms[2].Value.ToString()); + AlarmStr = thisParms[3].Value.ToString(); + + if (IsAlarm == 0) + { + return true; + } + } + return false; + + } + + + + + + /// + /// 线外工位质量数据验证 + /// + /// + public static bool QualityVerifyStatusOutline(string OpName, out string AlarmStr) + { + int IsAlarm = 0; + AlarmStr = ""; + string procedureName; + procedureName = "测量数据工位_监控系统_线外质量数据验证"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@是否报警", IsAlarm); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@报警工位号", AlarmStr); + thisParms[2].Direction = ParameterDirection.Output; + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + IsAlarm = Convert.ToInt32(thisParms[1].Value.ToString()); + AlarmStr = thisParms[2].Value.ToString(); + + if (IsAlarm == 0) + { + return true; + } + } + return false; + + } + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/05Biz/QualityData/GetQualityData_GoodBad.cs b/Common/07WebBusinessFacade/BusinessFacade/05Biz/QualityData/GetQualityData_GoodBad.cs new file mode 100644 index 0000000..85b79c0 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/05Biz/QualityData/GetQualityData_GoodBad.cs @@ -0,0 +1,415 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Collections; + +using SystemFramework; +using DoWhatPlc; +//using BasicData; +//using OpcData; + +namespace bizFacade +{ + + public partial class BaseDataSystemMES + { + + + /// + /// 对应玉柴项目 + /// 20111101 + /// 质量数据的上限值,下限值,理论值来源于表[MES_基本数据_测量范围] + /// 通过TagID和engineTypeID。如果engineTypeID=0,上限值,下限值,理论值="" + /// 质量数据可以读数据 19 + /// 分散控制 + /// tagID_CF质量数据激发变量对应的质量数据列表 + /// + /// tagID_CF质量数据激发变量对应的质量数据列表(Hashtable) + /// 质量数据列表 + /// 质量数据列表 + /// + /// 质量数据列表 + /// 质量数据总成合格标志 21( =0 数据合格) (= 1数据不合格) + /// 质量数据发动机机型标志 9 + /// 质量数据发动机号 10 + /// 质量数据发动机机型 11 + /// + /// + /// 缸盖号[TagValue2] + /// 发动机类型转换表 + /// 发动机类型转换表 + /// 发动机类型转换表 + /// 发动机类型转换表 + /// 发动机类型转换表 + /// 发动机类型转换表 + static public void GetQualityDataTable_B5A(Hashtable valuList, string opName, DataTable BasicDataTagValue, + DataTable BasicDataTagValueUpDown, + out DataTable dt, + out int qualityMask, + out int engineTypeID, + out string engineID, + out string engineType,out string partPallet, out string engineTraceCode, out string engineCap, Hashtable hashtable_EngineTypeID, + out int mes_MustTest,out int onLineState,out int partMoveDirection, + out int pressIsOK, out int pressIsNoOK) + { + //78 0:屏蔽MES;1:启用MES(必须MIS) + //79 通过线体工位PC实现下达工位工作状态:工位有三种状态:在线、离线、屏蔽。在线;0正常状态,实现正常功能。1离线:2屏蔽。(必须MIS) + //41 机体流向标志(1 BYTE):0普通工位:1:上线(发动机上线);2:下线(发动机下线);(必须PLC) + //51 返修工位,修改后的数据MES将数据写入PLC ,MES通知PLC数据修改完成。(YN) + //8 只要返修,必须由mes发送此信号,plc接收此信号后才能放行 + //(暂时没用)用于有扳手拧紧工位。通知设备螺钉拧紧完成。PC已经将数据保存到数据库中。(B5A) + mes_MustTest = 0; + onLineState = 0; + partMoveDirection = 0; + pressIsOK = 0; + pressIsNoOK = 0; + QualityDataType qualityData; + //是否有数据 + //bool isUsing; + + DataRow dr; + DataRow[] dr_WWW; + //MES_基本数据_测量范围 + DataRow[] dr_WWW_UpDown; + + dt = BuildDataTables_WWW(); + qualityMask = 0; + engineTypeID = 0; + engineID = ""; + engineType = ""; + engineTraceCode = ""; + engineCap = ""; + partPallet = ""; + //测量位置 + string shaftID; + //测量项目 + string item; + //测量单位 + string unit; + //机体类型 + //原始数据中的机型代码 + int engineTypeID_Source; + //上限值 + string tagValueUp; + //下限值 + string tagValueDown; + //理论值 + string tagValeNormal; + //TagValue + // 合格标志 + //string IsGoodBad; + + + foreach (DictionaryEntry valueItem in valuList) //ht为一个Hashtable实例 + { + try + { + qualityData = (QualityDataType)valueItem.Value; + + switch (qualityData.tagValueType) + { + case 21: + qualityMask = Convert.ToInt32(qualityData.tagValue); + //转变一下 + //qualityMask = transferIsOK_OpName_2(Convert.ToInt32(qualityData.tagValue)); + break; + case 8: + //8 只要返修,必须由mes发送此信号,plc接收此信号后才能放行 + //(暂时没用)用于有扳手拧紧工位。通知设备螺钉拧紧完成。PC已经将数据保存到数据库中。(B5A) + pressIsNoOK = Convert.ToInt32(qualityData.tagValue); + break; + //质量数据发动机机型标志 22(玉柴) 发动机机型标志 9 (有MOBY)需要换算成2的n次幂的形式,以便生成报表 + case 9: + engineTypeID = Convert.ToInt32(qualityData.tagValue); + if (engineTypeID == 0) + { + engineTypeID = 1; + } + if (hashtable_EngineTypeID.ContainsKey(engineTypeID)) + { + string engineTypeIDString = hashtable_EngineTypeID[engineTypeID].ToString(); + engineTypeID = Convert.ToInt32(engineTypeIDString); + if (engineTypeID == 0) + { + engineTypeID = 1; + } + } + break; + //发动机编号 23 10 + //case 23: + case 10: + engineID = Convert.ToString(qualityData.tagValue); + break; + //质量数据发动机机型 24(玉柴) 11(有MOBY) + //case 24: + case 11: + engineType = Convert.ToString(qualityData.tagValue); + break; + case 41: + //41 机体流向标志(1 BYTE):0普通工位:1:上线(发动机上线); + //2:下线(发动机下线);(必须PLC) + partMoveDirection = Convert.ToInt32(qualityData.tagValue); + break; + case 51: + //51 返修工位,修改后的数据MES将数据写入PLC ,MES通知PLC数据修改完成。(YN) + pressIsOK = Convert.ToInt32(qualityData.tagValue); + break; + //78 0:屏蔽MES;1:启用MES(必须MIS) + case 78: + mes_MustTest = Convert.ToInt32(qualityData.tagValue); + break; + //79 通过线体工位PC实现下达工位工作状态:工位有三种状态:在线、离线、屏蔽。在线: + //0正常状态,实现正常功能。1离线:2屏蔽。(必须MIS) + case 79: + onLineState = Convert.ToInt32(qualityData.tagValue); + break; + //托盘编号(B5A) + case 80: + partPallet = Convert.ToString(qualityData.tagValue); + break; + } + //if ((qualityData.tagProperty != 2) || (qualityData.tagProperty != 6)) + //{ + // continue ; + //} + if ((qualityData.tagProperty == 2) || (qualityData.tagProperty == 6)) + { + if (engineTypeID == 0) + { + engineTypeID = 1; + } + dr_WWW = BasicDataTagValue.Select("TagID = " + qualityData.tagID); + try + { + dr_WWW_UpDown = BasicDataTagValueUpDown.Select("TagID = " + qualityData.tagID); + } + catch { dr_WWW_UpDown = null; } + + + if (dr_WWW.Length > 0) + { + { + engineTypeID_Source = Convert.ToInt32(dr_WWW[0]["机体类型"]); + int temp; + temp = engineTypeID_Source & engineTypeID; + if (temp == 0) + { + continue; + } + if (qualityData.isGoodBad == -1) + { + continue; + } + } + } + else + { + continue; + + } + + try + { + shaftID = dr_WWW[0]["测量位置"].ToString(); + } + catch + { + shaftID = ""; + } + try + { + item = dr_WWW[0]["测量项目"].ToString(); + } + catch + { + item = ""; + } + try + { + unit = dr_WWW[0]["测量单位"].ToString(); + } + catch + { + unit = ""; + } + try + { + tagValueUp = ""; + if (dr_WWW_UpDown != null&& dr_WWW_UpDown.Length >0) + { + tagValueUp = dr_WWW_UpDown[0]["值上限"].ToString(); + } + else + { + tagValueUp = ""; + } + } + catch + { + tagValueUp = ""; + } + try + { + tagValueDown = ""; + if (dr_WWW_UpDown != null && dr_WWW_UpDown.Length > 0) + { + tagValueDown = dr_WWW_UpDown[0]["值下限"].ToString(); + } + } + catch + { + tagValueDown = ""; + } + try + { + tagValeNormal = ""; + if (dr_WWW_UpDown != null && dr_WWW_UpDown.Length > 0) + { + tagValeNormal = dr_WWW_UpDown[0]["理论值"].ToString(); + } + + } + catch + { + tagValeNormal = ""; + } + + dr = dt.NewRow(); + + dr["TagID"] = qualityData.tagID; + dr["测量位置"] = shaftID; + dr["测量项目"] = item; + dr["测量单位"] = unit; + dr["上限值"] = tagValueUp; + dr["下限值"] = tagValueDown; + dr["理论值"] = tagValeNormal; + dr["工位号"] = opName; + dr["列位置"] = qualityData.tagOrderBy; + dr["变量排序"] = qualityData.tagItemOrderBy; + + dr["IsGoodBad"] = qualityData.isGoodBad; + + switch (qualityData.tagTypeID)// + { + //合格标志数组 + case 8203: + dr["TagValue"] = BaseDataSystemMES.GetQualityData_GoodBad_String((bool[])qualityData.tagValue); + break; + case 8209: + dr["TagValue"] = ""; + break; + //非标准REAL + case 8210: + dr["TagValue"] = GetNoNormalReal(qualityData.tagValue); + dt.Rows.Add(dr); + break; + default: + dr["TagValue"] = Convert.ToString(qualityData.tagValue); + dt.Rows.Add(dr); + break; + } + + + } + + + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + } + } + } + + /// + /// 数据表 + /// + /// + static public DataTable BuildDataTables_WWW() + { + DataTable table; + DataColumnCollection columns; + table = new DataTable(); + columns = table.Columns; + table.Columns.Add("TagID", typeof(System.String)); + table.Columns.Add("TagValue", typeof(System.String)); + table.Columns.Add("IsGoodBad", typeof(System.Int32)); + table.Columns.Add("测量位置", typeof(System.String)); + table.Columns.Add("测量项目", typeof(System.String)); + table.Columns.Add("工位号", typeof(System.String)); + table.Columns.Add("理论值", typeof(System.String)); + table.Columns.Add("上限值", typeof(System.String)); + table.Columns.Add("下限值", typeof(System.String)); + table.Columns.Add("测量单位", typeof(System.String)); + table.Columns.Add("列位置", typeof(System.Int32)); + table.Columns.Add("变量排序", typeof(System.Int32)); + + return table; + } + /// + /// 返回非标准real + /// + /// + /// + static public string GetNoNormalReal(object vDataValue) + { + try + { + string real_a; + string real_b; + string groupValueString; + int length; + + //int real_b_Int; + + length = ((System.Array)(vDataValue)).Length; + groupValueString = ""; + if (length != 2) + return "0.0"; + + real_a = Convert.ToUInt16((((System.Array)(vDataValue)).GetValue(0))).ToString(); + real_b = Convert.ToUInt16((((System.Array)(vDataValue)).GetValue(1))).ToString("00"); + groupValueString = real_a + "." + real_b; + return groupValueString; + } + catch + { + ////ApplicationLog.WriteLog(err, "GetNoNormalReal"); + return "0.0"; + + } + } + + /// + /// 29 工位具体零件合格标志 + /// + /// + static public string GetQualityData_GoodBad_String(bool[] QualityData_GoodBad) + { + string str; + str = ""; + if (QualityData_GoodBad != null) + { + + for (int i = 0; i < QualityData_GoodBad.Length; i++) + { + str = str + (Convert.ToInt32(QualityData_GoodBad[i])).ToString() + "|"; + } + + } + return str; + + } + /// + /// 返回非标准real + /// + /// + /// + + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/07BusinessFacade.csproj b/Common/07WebBusinessFacade/BusinessFacade/07BusinessFacade.csproj new file mode 100644 index 0000000..6491263 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/07BusinessFacade.csproj @@ -0,0 +1,147 @@ + + + + + Debug + AnyCPU + {F0A0C525-03FD-428A-9B17-7F54AA0E4475} + Library + Properties + BusinessFacade + 07BusinessFacade + v4.8 + 512 + true + + + + true + full + false + ..\..\dll\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\dll\MQTTnet.dll + + + ..\..\dll\MQTTnet.Extensions.ManagedClient.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {f55da1a0-a982-4479-8c47-0d9a5aaf3e18} + 00MesWorkMqtt + + + {0d1af432-439a-4920-8692-43ae139f5530} + 01_01DoWhatPlc + + + {f434e066-4c59-47c8-aa82-6f48cc84501a} + 04-DataBaseAccess + + + + \ No newline at end of file diff --git a/Common/07WebBusinessFacade/BusinessFacade/Db2023/Order.cs b/Common/07WebBusinessFacade/BusinessFacade/Db2023/Order.cs new file mode 100644 index 0000000..66cc98b --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/Db2023/Order.cs @@ -0,0 +1,340 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; + +using System.Data.OleDb; + + +using DataLinkMesWork; + +//using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + //[北汽福田变速器序列号总线上线_是否重号] + /// + /// + /// + /// + /// + public static bool EngineTypeID_IsNotRepeatedNumber(string sn) + { + DataTable dt = new DataTable(); + int count; + + + string produceName = "北汽福田变速器序列号总线上线_是否重号"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@变速器序列号", sn); + + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt)) + { + if (dt.Rows.Count > 0) + { + count = Convert.ToInt32(dt.Rows[0]["数量"]); + if (count == 0) + { + return true; + } + else + { + return false; + + } + } + } + return true; + + } + //北汽福田_配方内容_根据配方号查询 + public static bool PLCRcipeByOpName(string OpName, out byte[] bytes, out string tagStartAdr, int PLCRcipe) + { + DataTable dt = new DataTable(); + string produceName = "北汽福田_配方内容_根据配方号查询"; + tagStartAdr = ""; + bytes = new byte[0]; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@配方号", PLCRcipe); + + + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, dt)) + { + if (dt.Rows.Count > 0) + { + tagStartAdr = dt.Rows[0]["地址"].ToString(); + bytes = new byte[dt.Rows.Count]; + for (int i = 0; i < dt.Rows.Count; i++) + { + bytes[i] = Convert.ToByte(dt.Rows[0]["操作号码"]); + } + return true; + } + } + return false; + } + /// + /// 北汽福田_配方当前_查询 + /// + /// + /// + public static bool PLCRcipeCurrent(string opName, out byte[] bytes, out string tagStartAdr) + { + DataTable dt = new DataTable(); + string produceName = "北汽福田_配方当前_查询"; + tagStartAdr = ""; + bytes = null; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + if (DataAccess.ExecuteStoredProcedure(produceName, out dt)) + { + if (dt.Rows.Count > 0) + { + tagStartAdr = dt.Rows[0]["地址"].ToString(); + bytes = new byte[dt.Rows.Count]; + for (int i = 0; i < dt.Rows.Count; i++) + { + bytes[i] = Convert.ToByte(dt.Rows[0]["操作号码"]); + } + return true; + } + } + return false; + } + /// + /// 北汽福田BOM_上线需要数据_查询 + /// + /// 零件号 + /// PTO检测 + /// 空挡开关检测 + /// 倒挡开关检测 + /// 里程表检测 + /// 大机型扩展 + /// + public static bool UpLoadPTO(string sn, out int PTO, out int NgearSwitch, out int RgearSwitch, out int SpeedSensor, out string PartTypeMid, out int Tcu_V) + { + DataTable dt = new DataTable(); + int count; + PTO = 0; + NgearSwitch = 0; + RgearSwitch = 0; + SpeedSensor = 0; + Tcu_V = 0; + PartTypeMid = ""; + //select @倒挡开关 as RgearSwitch,@空挡开关 as NgearSwitch,@里程表 as SpeedSensor,@型号 as PartTypeMid,@PTO as PTO + // + string produceName = "北汽福田BOM_上线需要数据_查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@零件号", sn); + + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt)) + { + if (dt.Rows.Count > 0) + { + PTO = Convert.ToInt32(dt.Rows[0]["PTO"]); + NgearSwitch = Convert.ToInt32(dt.Rows[0]["NgearSwitch"]); + RgearSwitch = Convert.ToInt32(dt.Rows[0]["RgearSwitch"]); + SpeedSensor = Convert.ToInt32(dt.Rows[0]["SpeedSensor"]); + PartTypeMid = dt.Rows[0]["PartTypeMid"].ToString(); + Tcu_V = Convert.ToInt32(dt.Rows[0]["TCU"]); + return true; + } + } + return false; + + } + /// + /// 北汽福田变速器序列号总线上线_获得机型信息 + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool GetEngineTypeUpLoadOpName(string sn, string OpName, out int EngineTypeID, out string EngineType, out string OrderForm, out int Recipe1, out int Recipe2) + { + DataTable dt = new DataTable(); + EngineTypeID = 0; + EngineType = ""; + OrderForm = ""; + Recipe1 = 0; + Recipe2 = 0; + + string produceName = "北汽福田变速器序列号总线上线_获得机型信息"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@变速箱总成号", sn); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt)) + { + if (dt.Rows.Count > 0) + { + EngineTypeID = Convert.ToInt32(dt.Rows[0]["机型代码"]); + EngineType = dt.Rows[0]["零件号"].ToString(); + OrderForm = dt.Rows[0]["订单号"].ToString(); + return true; + } + } + return false; + } + //MES_计划BOM_工位与名称_查询_MQTT监控工位 + + public static DataTable GetCheckOpName_BQ() + { + DataTable dt = new DataTable(); + string produceName = "MES_计划BOM_工位与名称_查询_MQTT监控工位"; + SqlParameter[] thisParms = null; + + + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt); + + return dt; + } + public static DataTable GetCheckOpName() + { + DataTable dt = new DataTable(); + string produceName = "MES_计划BOM_工位与名称_查询"; + SqlParameter[] thisParms = null; + + + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt); + + return dt; + } + /// + /// 测量数据工位_监控系统_MOBY_查询 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static DataTable GetOrder_BQ() + { + DataTable dt = new DataTable(); + string produceName = "北汽福田生产订单计划_查询"; + SqlParameter[] thisParms = null; + + + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt); + + return dt; + } + + public static DataTable GetOrderOpName_BQ() + { + DataTable dt = new DataTable(); + string produceName = "MES_计划BOM_工位与名称_上线工位号查询"; + SqlParameter[] thisParms = null; + + + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt); + + return dt; + } + /// + /// 北汽福田工位状态监控MOBY_增加_线首工位订单下达 + /// + /// + /// + /// + public static void DownOrderToOpName(string orderForm, string opName) + { + string produceName = "北汽福田工位状态监控MOBY_增加_线首工位订单下达"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new SqlParameter("@订单号", orderForm); + thisParms[1] = new SqlParameter("@工位号", opName); + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + + } + + public static DataTable DownOrderToOpNameMobyList(string OpName) + { + DataTable dt = new DataTable(); + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new SqlParameter("@工位号", OpName); + string produceName = "北汽福田工位状态监控MOBY_查询_订单下达用"; + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt); + + return dt; + } + + /// + /// PA30 40 获取数据 测量数据发动机在线状态_抽取记录_查询 + /// + /// + /// 排序方式 0 ASC 1 DESC + /// + public static DataTable lineOutTowBackWork_GetData(string OpName, int OrderType) + { + DataTable dt = new DataTable(); + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new SqlParameter("@工位号", OpName); + thisParms[1] = new SqlParameter("@排序方式", OrderType); + string produceName = "测量数据发动机在线状态_抽取记录_查询"; + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt); + + return dt; + } + /// + /// PA40 获取数据 机型代码 测量数据发动机在线状态_抽取记录_查询 + /// + /// + /// 排序方式 0 ASC 1 DESC + /// + public static DataTable lineOutTowBackWorkEngineTypeCode_GetData(string OpName, string materialCode) + { + DataTable dt = new DataTable(); + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new SqlParameter("@工位号", OpName); + thisParms[1] = new SqlParameter("@零件编号", materialCode); + string produceName = "北汽福田工位状态监控_根据零件号获取型号_查询"; + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt); + + return dt; + } + /// + /// 北汽福田工位状态监控MOBY历史数据_增加 + /// + /// + /// + public static void MobySaveData(string opName) + { + string produceName = "北汽福田工位状态监控MOBY历史数据_增加"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new SqlParameter("@工位号", opName); + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + + } + + + public static string GetOrderDataBySn(string sn) + { + + DataTable dt = new DataTable(); + string orderForm = ""; + string produceName = "北汽福田变速器序列号_查询订单号"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@变速器序列号", sn); + if (DataAccess.ExecuteStoredProcedure(produceName, out dt)) + { + if (dt.Rows.Count > 0) + { + orderForm = dt.Rows[0]["订单号"].ToString(); + } + } + return orderForm; + } + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Factory/Factory.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Factory/Factory.cs new file mode 100644 index 0000000..275ef7f --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Factory/Factory.cs @@ -0,0 +1,93 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using System.Collections; +using System.Collections.Specialized; +//using SystemFramework; +using DataLinkMesWork; + +namespace bizFacade +{ + /// + /// 电子看板信息系统 + /// + public partial class BaseDataSystemMES + { + /// + /// 电子看板_零件图号_生产厂家_厂家_查询 + /// + /// + static public void Factory_Select(out DataTable dt) + { + string sql; + sql = " exec 电子看板_零件图号_生产厂家_厂家_查询"; + DataAccess.ExecuteDataTable(sql, out dt); + } + + + /// + /// 电子看板_零件图号_生产厂家_厂家_快速_查询 + /// + /// + /// + static public void Factory_kuaisu_Select(string str ,out DataTable dt) + { + string procedureName; + procedureName = "电子看板_零件图号_生产厂家_厂家_快速_查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@零件图号", str); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + /// + /// 电子看板_零件图号_生产厂家_厂家_增加 + /// + static public bool Factory_Insert(string Lingjian_tuhao, string Wuliaohao, + string Gongyingshang_number, string Gongyingshang_name, string Gongyingshang_shortname) + { + string procedureName; + procedureName = "电子看板_零件图号_生产厂家_厂家_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@零件图号", Lingjian_tuhao); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@物料号", Wuliaohao); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@供应商代码", Gongyingshang_number); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@供应商名称", Gongyingshang_name); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@供应商简称", Gongyingshang_shortname); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + /// + /// 电子看板_零件图号_生产厂家_厂家_修改 + /// + static public bool Factory_Update(int Changjia_num, string Lingjian_tuhao, string Wuliaohao, + string Gongyingshang_number, string Gongyingshang_name, string Gongyingshang_shortname) + { + string procedureName; + procedureName = "电子看板_零件图号_生产厂家_厂家_修改"; + SqlParameter[] thisParms = new SqlParameter[6]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@厂家代码", Changjia_num); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@零件图号", Lingjian_tuhao); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@物料号", Wuliaohao); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@供应商代码", Gongyingshang_number); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@供应商名称", Gongyingshang_name); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@供应商简称", Gongyingshang_shortname); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + /// + /// 电子看板_零件图号_生产厂家_厂家_删除 + /// + /// 序号 + static public bool Factory_Delete(int Changjia_num) + { + string procedureName; + procedureName = "电子看板_零件图号_生产厂家_厂家_删除"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@厂家代码", Changjia_num); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Factory/vssver2.scc b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Factory/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..c12a7f44110a50747fcb72de8bfbec99c370312e GIT binary patch literal 106 zcmXpJVq~~_m%l5bInsUAj6{**Nns)ay6UI(m>3us85kJ!fpp)&)e;?jpY%a|6@6dN t;PTWY80A!2oSBzeTr literal 0 HcmV?d00001 diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/EngineIDCode.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/EngineIDCode.cs new file mode 100644 index 0000000..fa59789 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/EngineIDCode.cs @@ -0,0 +1,405 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using System.Collections; +using System.Collections.Specialized; +//using SystemFramework; +using DataLinkMesWork; + +namespace bizFacade +{ + /// + /// 电子看板信息系统 + /// select 重量1,重量2,重量差,允许重量差,合格标志 + /// + public partial class BaseDataSystemMES + { + /// + /// 测量数据合格_查询_称重 + /// + /// + /// + static public void ShowWeightData_Select(string engineID, out DataTable dt) + { + string procedureName; + procedureName = "测量数据合格_查询_称重"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + /// + ///测量数据合格_合并_视图_查询_照相 + /// select IsGoodBad as 合格标志, 列位置 + ///from 测量数据合格_合并_视图 + ///where EngineID=@工件编号 and 工位号=@工位号 + ///order by 列位置 + /// + /// + /// + /// + static public void ShowPicData_Select(string engineID, string opName, out DataTable dt) + { + string procedureName; + procedureName = "测量数据合格_合并_视图_查询_照相"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + /// + /// insert into 电子看板_发动机号_分线组件装配关系 + ///(工位号,发动机号,机型代码,发动机型号,工位号_分线,发动机号_分线,机型代码_分线,发动机型号_分线) + ///values(@工位号,@发动机号,@机型代码,@发动机型号,@工位号_分线,@发动机号_分线,@机型代码_分线,@发动机型号_分线) + /// + /// + /// + /// + /// + /// + /// + /// + /// + static public void MailLineAndSubLineData_Insert(string opName, string engineID, int engineTypeID, string engineType, string opName_SubLine, string engineID_SubLine, int engineTypeID_SubLine, string engineType_SubLine) + { + string procedureName; + procedureName = "电子看板_发动机号_分线组件装配关系_增加"; + SqlParameter[] thisParms = new SqlParameter[8]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@机型代码", engineTypeID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@工位号_分线", opName_SubLine); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@发动机号_分线", engineID_SubLine); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@机型代码_分线", engineTypeID_SubLine); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@发动机型号_分线", engineType_SubLine); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 电子看板_发动机号_线首工位_查询_根据发动机号 + /// select 工位号,订单号,发动机号,基本机型,机型代码,发动机型号,托盘号, + /// 条码类型,零件流水号,零件流水号带空格,壳体编号型号,壳体编号型号带空格,QR码 + /// from dbo.电子看板_发动机号_线首工位 + /// where 发动机号=@发动机号 and 是否禁用=0 + /// + /// + /// + static public void GetEngineID_Select(string engineID, out DataTable dt) + { + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_根据发动机号"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + /// + /// select 工位号,发动机号,机型代码,发动机型号,返修数据 + /// from 电子看板_发动机号_工件下线 + /// where 零件流水号=@零件流水号 --and 是否禁用=0 + /// + /// 零件流水号 + /// + static public void GetRepareData_Select(string partCode, out DataTable dt) + { + string procedureName; + procedureName = "电子看板_发动机号_工件下线_查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@零件流水号", partCode); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + /// + ///select '' as 工位号,发动机号,机型代码,发动机型号,'' as 返修数据 + ///from 电子看板_发动机号_线首工位 + ///where 零件流水号_返修=@零件流水号 and 是否禁用=0 + /// + /// 零件流水号 + /// + static public void GetRepareData_OtherLine_Select(string partCode, out DataTable dt) + { + string procedureName; + procedureName = "电子看板_发动机号_工件下线_其它装配线_查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@零件流水号", partCode); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + // + /// + /// 电子看板_发动机号_工件下线_增加 + /// @工位号 nvarchar(50) = null, + /// @发动机号 nvarchar(50) = null, + /// @机型代码 int = 1, + /// @发动机型号 nvarchar(50) = null, + /// @返修数据 nvarchar(4000) = null + /// + /// + /// 零件流水号 + /// + /// + /// + /// + static public void GetRepareData_Insert(string opName,string partCode, + string engineID, int engineTypeID, string engineType, string engineData) + { + string procedureName; + procedureName = "电子看板_发动机号_工件下线_增加"; + SqlParameter[] thisParms = new SqlParameter[6]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@零件流水号", partCode); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@机型代码", engineTypeID); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@返修数据", engineData); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 电子看板_发动机号_线首工位_增加 + /// + /// 工位号 + /// 订单号 + /// 托盘号 + /// 工件机型 + /// 工件机型,机型代码,工件编号, 壳体编号型号,工件流水号,QR码,基本流水号 + static public bool GetEngineID_Save(string opName, string orderForm, string PartPalletCode, string engineType, DataTable dt) + { + string engineID; + int engineTypeID; + string partCode_Space; + string partCode; + string shellCode; + string shellCode_Space; + string QR_Code; + int engineCount; + int barCodeType; + string engineTypeBase; + string partCode_Text; + string partCode_BarCode; + string engineType_Text; + string engineType_BarCode; + string codeCreatetime; + try + { + GetEngineIDFromFirstOpName_Auto(out engineID, out engineTypeID, out partCode_Space, + out partCode, out shellCode, out shellCode_Space, out QR_Code, + out engineCount, out barCodeType, out engineTypeBase, + out partCode_Text, out partCode_BarCode, out engineType_Text, out engineType_BarCode, out codeCreatetime, dt); + + + string procedureName; + procedureName = "电子看板_发动机号_线首工位_增加"; + SqlParameter[] thisParms = new SqlParameter[19]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", orderForm); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@基本机型", engineTypeBase); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@机型代码", engineTypeID); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@托盘号", PartPalletCode); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@条码类型", barCodeType); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@零件流水号", partCode); + thisParms[9] = new System.Data.SqlClient.SqlParameter("@零件流水号带空格", partCode_Space); + thisParms[10] = new System.Data.SqlClient.SqlParameter("@壳体编号型号", shellCode); + thisParms[11] = new System.Data.SqlClient.SqlParameter("@壳体编号型号带空格", shellCode_Space); + thisParms[12] = new System.Data.SqlClient.SqlParameter("@QR码", QR_Code); + thisParms[13] = new System.Data.SqlClient.SqlParameter("@基本流水号", engineCount); + thisParms[14] = new System.Data.SqlClient.SqlParameter("@流水号文本", partCode_Text); + thisParms[15] = new System.Data.SqlClient.SqlParameter("@流水号条码", partCode_BarCode); + thisParms[16] = new System.Data.SqlClient.SqlParameter("@型号文本", engineType_Text); + thisParms[17] = new System.Data.SqlClient.SqlParameter("@型号条码", engineType_BarCode); + thisParms[18] = new System.Data.SqlClient.SqlParameter("@条码创建时间", codeCreatetime); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + // return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + return false; + + } + } + + /// + /// 电子看板_发动机号_线首工位_增加 + /// + /// 工位号 + /// 订单号 + /// 托盘号 + /// 工件机型 + /// 工件机型,机型代码,工件编号, 壳体编号型号,工件流水号,QR码,基本流水号 + static public bool GetEngineID_Save_SY(string opName, string engineID1, string orderForm, string PartPalletCode, string engineType, DataTable dt) + { + string engineID; + int engineTypeID; + string partCode_Space; + string partCode; + string shellCode; + string shellCode_Space; + string QR_Code; + int engineCount; + int barCodeType; + string engineTypeBase; + string partCode_Text; + string partCode_BarCode; + string engineType_Text; + string engineType_BarCode; + string codeCreatetime; + try + { + GetEngineIDFromFirstOpName_Auto(out engineID, out engineTypeID, out partCode_Space, + out partCode, out shellCode, out shellCode_Space, out QR_Code, + out engineCount, out barCodeType, out engineTypeBase, + out partCode_Text, out partCode_BarCode, out engineType_Text, out engineType_BarCode, out codeCreatetime, dt); + + + string procedureName; + procedureName = "电子看板_发动机号_线首工位_增加"; + SqlParameter[] thisParms = new SqlParameter[19]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", orderForm); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID1); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@基本机型", engineTypeBase); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@机型代码", engineTypeID); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@托盘号", PartPalletCode); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@条码类型", barCodeType); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@零件流水号", partCode); + thisParms[9] = new System.Data.SqlClient.SqlParameter("@零件流水号带空格", partCode_Space); + thisParms[10] = new System.Data.SqlClient.SqlParameter("@壳体编号型号", shellCode); + thisParms[11] = new System.Data.SqlClient.SqlParameter("@壳体编号型号带空格", shellCode_Space); + thisParms[12] = new System.Data.SqlClient.SqlParameter("@QR码", QR_Code); + thisParms[13] = new System.Data.SqlClient.SqlParameter("@基本流水号", engineCount); + thisParms[14] = new System.Data.SqlClient.SqlParameter("@流水号文本", partCode_Text); + thisParms[15] = new System.Data.SqlClient.SqlParameter("@流水号条码", partCode_BarCode); + thisParms[16] = new System.Data.SqlClient.SqlParameter("@型号文本", engineType_Text); + thisParms[17] = new System.Data.SqlClient.SqlParameter("@型号条码", engineType_BarCode); + thisParms[18] = new System.Data.SqlClient.SqlParameter("@条码创建时间", codeCreatetime); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + // return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + return false; + + } + } + /// + /// 测量数据发动机在线状态_工件到位时间_查询 + /// + /// + /// + /// + static public void GetTime_Arrived(int EngineTypeID, string EngineID, out DataTable dt) + { + string procedureName; + procedureName = "测量数据发动机在线状态_工件到位时间_查询"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@机型代码", EngineTypeID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + + + //2013-01-06 王可心 手动创建编号时调用 + /// + /// [电子看板_发动机号_线首工位_手动方式_增加] + /// + /// 工位号 + /// 订单号 + /// 托盘号 + /// 工件机型 + /// 工件机型,机型代码,工件编号, 壳体编号型号,工件流水号,QR码,基本流水号 + static public bool GetEngineID_ManulEngine_Save(string opName, string orderForm, string PartPalletCode, string engineType, string EngineID_DateTime, DataTable dt) + { + string engineID; + int engineTypeID; + string partCode_Space; + string partCode; + string shellCode; + string shellCode_Space; + string QR_Code; + int engineCount; + int barCodeType; + string engineTypeBase; + string partCode_Text; + string partCode_BarCode; + string engineType_Text; + string engineType_BarCode; + + try + { + GetEngineIDFromFirstOpName(out engineID, out engineTypeID, out partCode_Space, + out partCode, out shellCode, out shellCode_Space, out QR_Code, + out engineCount, out barCodeType, out engineTypeBase, + out partCode_Text, out partCode_BarCode, out engineType_Text, out engineType_BarCode, dt); + + + string procedureName; + procedureName = "电子看板_发动机号_线首工位_手动方式_增加"; + SqlParameter[] thisParms = new SqlParameter[19]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", orderForm); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@基本机型", engineTypeBase); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@机型代码", engineTypeID); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@托盘号", PartPalletCode); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@条码类型", barCodeType); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@零件流水号", partCode); + thisParms[9] = new System.Data.SqlClient.SqlParameter("@零件流水号带空格", partCode_Space); + thisParms[10] = new System.Data.SqlClient.SqlParameter("@壳体编号型号", shellCode); + thisParms[11] = new System.Data.SqlClient.SqlParameter("@壳体编号型号带空格", shellCode_Space); + thisParms[12] = new System.Data.SqlClient.SqlParameter("@QR码", QR_Code); + thisParms[13] = new System.Data.SqlClient.SqlParameter("@基本流水号", engineCount); + thisParms[14] = new System.Data.SqlClient.SqlParameter("@流水号文本", partCode_Text); + thisParms[15] = new System.Data.SqlClient.SqlParameter("@流水号条码", partCode_BarCode); + thisParms[16] = new System.Data.SqlClient.SqlParameter("@型号文本", engineType_Text); + thisParms[17] = new System.Data.SqlClient.SqlParameter("@型号条码", engineType_BarCode); + thisParms[18] = new System.Data.SqlClient.SqlParameter("@工件编号时间", EngineID_DateTime); + + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + // return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + return false; + + } + } + + /// + /// 电子看板_发动机号_线首工位_查询_QR码返修 + /// + /// + /// + static public void GetRepareDataSelect_QR(string QR, out DataTable dt) + { + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_QR码返修"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@QR码", QR); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + /// + /// 电子看板_发动机号_线首工位_查询_两行条码返修 + /// + /// + /// + static public void GetRepareDataSelect_EngingeRepair(string barCode_EngineType, string barCode_EngineNum, out DataTable dt) + { + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_两行条码返修"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@型号条码", barCode_EngineType); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@流水号条码", barCode_EngineNum); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/OpName.MainForm.Launch.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/OpName.MainForm.Launch.cs new file mode 100644 index 0000000..314135b --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/OpName.MainForm.Launch.cs @@ -0,0 +1,316 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Collections; +using System.Collections.Specialized; +//using SystemFramework; + +namespace bizFacade +{ + /// + /// 电子看板信息系统 + /// + public partial class BaseDataSystemMES + { + + /// + /// 获得总线发动机号 + /// + /// + /// + /// + static public void GetEngineID_MailLine(string opName, string engineType, out DataTable dt) + { + bool isSubLine; + isSubLine = false; + GetEngineID_Auto(opName, engineType, isSubLine, out dt); + } + /// + /// 获得分线发动机号 + /// + /// + /// + /// 工件机型,机型代码,工件编号,壳体编号型号,工件流水号,QR码,基本流水号 + static public void GetEngineID_SubLine(string opName, string engineType, out DataTable dt) + { + bool isSubLine; + isSubLine = true; + GetEngineID_Auto(opName, engineType, isSubLine, out dt); + } + /// + /// 电子看板_发动机号_线首工位_创建线首发动机号_根据输入机型代码 + /// 工件机型,机型代码,工件编号,壳体编号型号,工件流水号,QR码,基本流水号 + /// + /// 工位号 + /// 发动机型号 + /// 是否分线--@是否分线 = 0 总线线首(OP2010);=1分线线首(OP1010,OP2100) + /// 工件机型,机型代码,工件编号,壳体编号型号,工件流水号,QR码,基本流水号 + static public void GetEngineID_Auto(string opName, string engineType, bool isSubLine, out DataTable dt) + { + string procedureName; + procedureName = "电子看板_发动机号_线首工位_创建线首发动机号_根据输入机型代码"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@是否分线", isSubLine); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + /// + /// 电子看板_发动机号_线首工位_创建线首发动机号_根据输入机型代码_手动方式 + /// + /// 工位号 + /// 发动机型号 + /// 年份 + /// 月份 + /// 日期 + /// 流水号 + /// + static public void GetEngineID_Manual_MainLine(string opName, string engineType, string engineYear, string engineMoon, string engineDay, int engineNumber, out DataTable dt) + { + //@是否分线 bit=0 @是否分线 = 0 总线线首(OP2010);=1分线线首(OP1010,OP2100) + bool isSubLine = false; + GetEngineID_Manual(opName, engineType, engineYear, engineMoon, engineDay, engineNumber, isSubLine, out dt); + } + /// + /// 电子看板_发动机号_线首工位_创建线首发动机号_根据输入机型代码_手动方式 + /// + /// 工位号 + /// 发动机型号 + /// 年份 + /// 月份 + /// 日期 + /// 流水号 + /// + static public void GetEngineID_Manual_SunLine(string opName, string engineType, string engineYear, string engineMoon, string engineDay, int engineNumber, out DataTable dt) + { + //@是否分线 bit=0 @是否分线 = 0 总线线首(OP2010);=1分线线首(OP1010,OP2100) + bool isSubLine = true; + GetEngineID_Manual(opName, engineType, engineYear, engineMoon, engineDay, engineNumber, isSubLine, out dt); + } + + /// + /// 电子看板_发动机号_线首工位_创建线首发动机号_根据输入机型代码_手动方式 + /// + /// 工位号 + /// 发动机型号 + /// 年份 + /// 月份 + /// 日期 + /// 流水号 + /// @是否分线 bit=0 @是否分线 = 0 总线线首(OP2010);=1分线线首(OP1010,OP2100) + /// + static public void GetEngineID_Manual(string opName, string engineType, string engineYear, string engineMoon, string engineDay, int engineNumber, bool isSubLine, out DataTable dt) + { + string procedureName; + procedureName = "电子看板_发动机号_线首工位_创建线首发动机号_根据输入机型代码_手动方式"; + SqlParameter[] thisParms = new SqlParameter[7]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@年份", engineYear); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@月份", engineMoon); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@日期", engineDay); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@流水号", engineNumber); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@是否分线", isSubLine); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + /// + /// 电子看板_发动机号_线首工位_创建线首发动机号_根据输入机型代码_手动方式 + /// + /// 工位号 + /// 发动机型号 + /// 年份 + /// 月份 + /// 日期 + /// 流水号 + /// @是否分线 bit=0 @是否分线 = 0 总线线首(OP2010);=1分线线首(OP1010,OP2100) + /// + static public void GetEngineID_Manual_OldLineLoad(string opName, string engineType, string engineYear, string engineMoon, string engineDay, int engineNumber, bool isSubLine, out DataTable dt) + { + string procedureName; + procedureName = "电子看板_发动机号_线首工位_创建线首发动机号_根据输入机型代码_手动方式_老线上线用"; + SqlParameter[] thisParms = new SqlParameter[7]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@年份", engineYear); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@月份", engineMoon); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@日期", engineDay); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@流水号", engineNumber); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@是否分线", isSubLine); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + /// + /// [电子看板_发动机号_线首工位]信息手动用 + /// + /// 发动机号 + /// 机型代码 + /// 零件流水号带空格 + /// 零件流水号 + /// 壳体编号型号 + /// 壳体编号型号带空格 + /// QR码 + /// 基本流水号 + /// 条码类型 + /// 基本机型 + /// 流水号文本 + /// 流水号条码 + /// 型号文本 + /// 型号条码 + /// + static public void GetEngineIDFromFirstOpName(out string engineID, out int engineTypeID, out string partCode_Space, + out string partCode, out string shellCode, out string shellCode_Space, out string QR_Code, + out int engineCount, out int barCodeType, out string engineTypeBase, + out string partCode_Text, out string partCode_BarCode, + out string engineType_Text, out string engineType_BarCode, + DataTable dt) + { + engineID = ""; + engineTypeID = 0; + partCode_Space=""; + partCode=""; + shellCode=""; + shellCode_Space=""; + QR_Code=""; + engineCount=0; + barCodeType=0; + engineTypeBase=""; + partCode_Text=""; + partCode_BarCode=""; + engineType_Text=""; + engineType_BarCode = ""; + + engineID = dt.Rows[0]["发动机号"].ToString(); + engineTypeID = Convert.ToInt32(dt.Rows[0]["机型代码"]); + shellCode = dt.Rows[0]["壳体编号型号"].ToString(); + shellCode_Space = dt.Rows[0]["壳体编号型号带空格"].ToString(); + partCode = dt.Rows[0]["零件流水号"].ToString(); + partCode_Space = dt.Rows[0]["零件流水号带空格"].ToString(); + QR_Code = dt.Rows[0]["QR码"].ToString(); + engineCount = Convert.ToInt32(dt.Rows[0]["基本流水号"]); + engineTypeBase = dt.Rows[0]["基本机型"].ToString(); + barCodeType = Convert.ToInt32(dt.Rows[0]["条码类型"]); + partCode_Text = dt.Rows[0]["流水号文本"].ToString(); + partCode_BarCode = dt.Rows[0]["流水号条码"].ToString(); + engineType_Text = dt.Rows[0]["型号文本"].ToString(); + engineType_BarCode = dt.Rows[0]["型号条码"].ToString(); + + } + + /// + /// [电子看板_发动机号_线首工位]信息自动用 + /// + /// 发动机号 + /// 机型代码 + /// 零件流水号带空格 + /// 零件流水号 + /// 壳体编号型号 + /// 壳体编号型号带空格 + /// QR码 + /// 基本流水号 + /// 条码类型 + /// 基本机型 + /// 流水号文本 + /// 流水号条码 + /// 型号文本 + /// 型号条码 + /// + static public void GetEngineIDFromFirstOpName_Auto(out string engineID, out int engineTypeID, out string partCode_Space, + out string partCode, out string shellCode, out string shellCode_Space, out string QR_Code, + out int engineCount, out int barCodeType, out string engineTypeBase, + out string partCode_Text, out string partCode_BarCode, + out string engineType_Text, out string engineType_BarCode,out string CodeCreatetime, + DataTable dt) + { + engineID = ""; + engineTypeID = 0; + partCode_Space = ""; + partCode = ""; + shellCode = ""; + shellCode_Space = ""; + QR_Code = ""; + engineCount = 0; + barCodeType = 0; + engineTypeBase = ""; + partCode_Text = ""; + partCode_BarCode = ""; + engineType_Text = ""; + engineType_BarCode = ""; + + engineID = dt.Rows[0]["发动机号"].ToString(); + engineTypeID = Convert.ToInt32(dt.Rows[0]["机型代码"]); + shellCode = dt.Rows[0]["壳体编号型号"].ToString(); + shellCode_Space = dt.Rows[0]["壳体编号型号带空格"].ToString(); + partCode = dt.Rows[0]["零件流水号"].ToString(); + partCode_Space = dt.Rows[0]["零件流水号带空格"].ToString(); + QR_Code = dt.Rows[0]["QR码"].ToString(); + engineCount = Convert.ToInt32(dt.Rows[0]["基本流水号"]); + engineTypeBase = dt.Rows[0]["基本机型"].ToString(); + barCodeType = Convert.ToInt32(dt.Rows[0]["条码类型"]); + partCode_Text = dt.Rows[0]["流水号文本"].ToString(); + partCode_BarCode = dt.Rows[0]["流水号条码"].ToString(); + engineType_Text = dt.Rows[0]["型号文本"].ToString(); + engineType_BarCode = dt.Rows[0]["型号条码"].ToString(); + CodeCreatetime = dt.Rows[0]["条码创建时间"].ToString(); + + } + /// + /// [电子看板_发动机号_线首工位]信息 + /// + /// 发动机号 + /// 机型代码 + /// 零件流水号带空格 + /// 零件流水号 + /// 壳体编号型号 + /// 壳体编号型号带空格 + /// QR码 + /// 基本流水号 + /// 条码类型 + /// 基本机型 + /// 流水号文本 + /// 流水号条码 + /// 型号文本 + /// 型号条码 + /// 零件流水号_返修 + /// + static public void GetEngineIDFromFirstOpName(out string engineID, out int engineTypeID, out string partCode_Space, + out string partCode, out string shellCode, out string shellCode_Space, out string QR_Code, + out int engineCount, out int barCodeType, out string engineTypeBase, + out string partCode_Text, out string partCode_BarCode, + out string engineType_Text, out string engineType_BarCode, out string partCode_Repair, + DataTable dt) + { + engineID = ""; + engineTypeID = 0; + partCode_Space = ""; + partCode = ""; + shellCode = ""; + shellCode_Space = ""; + QR_Code = ""; + engineCount = 0; + barCodeType = 0; + engineTypeBase = ""; + partCode_Text = ""; + partCode_BarCode = ""; + engineType_Text = ""; + engineType_BarCode = ""; + + engineID = dt.Rows[0]["发动机号"].ToString(); + engineTypeID = Convert.ToInt32(dt.Rows[0]["机型代码"]); + shellCode = dt.Rows[0]["壳体编号型号"].ToString(); + shellCode_Space = dt.Rows[0]["壳体编号型号带空格"].ToString(); + partCode = dt.Rows[0]["零件流水号"].ToString(); + partCode_Space = dt.Rows[0]["零件流水号带空格"].ToString(); + QR_Code = dt.Rows[0]["QR码"].ToString(); + engineCount = Convert.ToInt32(dt.Rows[0]["基本流水号"]); + engineTypeBase = dt.Rows[0]["基本机型"].ToString(); + barCodeType = Convert.ToInt32(dt.Rows[0]["条码类型"]); + partCode_Text = dt.Rows[0]["流水号文本"].ToString(); + partCode_BarCode = dt.Rows[0]["流水号条码"].ToString(); + engineType_Text = dt.Rows[0]["型号文本"].ToString(); + engineType_BarCode = dt.Rows[0]["型号条码"].ToString(); + partCode_Repair = dt.Rows[0]["零件流水号_返修"].ToString(); + + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/OpName.MainForm.Material.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/OpName.MainForm.Material.cs new file mode 100644 index 0000000..81896ca --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/OpName.MainForm.Material.cs @@ -0,0 +1,165 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Collections; +using System.Collections.Specialized; +//using SystemFramework; + +namespace bizFacade +{ + /// + /// 电子看板信息系统 + /// + public partial class BaseDataSystemMES + { + /// + /// MES_装配数据_零部件追溯_数据主表_增加_电子看板 + /// @发动机号 nvarchar(50)=null, + /// @发动机型号 nvarchar(50)=null, + /// @机型代码 int=null, + /// @订单号 nvarchar(50)=null, + /// @工位号 nvarchar(50)=null, + /// @到达时间 datetime, + /// @离开时间 datetime, + /// @操作者工号 nvarchar(50)=null, + /// @班次代码 nvarchar(50)=null, + /// @放行方式 int =null, + /// @工位类型 nvarchar(50)=null, + /// @追溯代码 int = null output + /// + /// 发动机号 + /// 发动机型号 + /// 机型代码 + /// 订单号 + /// 工位号 + /// 到达时间 + /// 离开时间 + /// 操作者工号 + /// 班次代码 + /// 放行方式 + /// 工位类型 + /// 追溯代码 + static public void MaterialMailTable_Insert(string engineID,string engineType,int engineTypeID,string orderForm,string opName, + DateTime arrivedTime,DateTime leavTime,string opperatorCode,string shiftCode, + int goOverType,string opNameType,out int traceCode) + { + + string procedureName; + try + { + procedureName = "MES_装配数据_零部件追溯_数据主表_增加_电子看板"; + SqlParameter[] thisParms = new SqlParameter[12]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@机型代码", engineTypeID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@订单号", orderForm); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@到达时间", arrivedTime); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@离开时间", leavTime); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@操作者工号", opperatorCode); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@班次代码", shiftCode); + thisParms[9] = new System.Data.SqlClient.SqlParameter("@放行方式", goOverType); + thisParms[10] = new System.Data.SqlClient.SqlParameter("@工位类型", opNameType); + thisParms[11] = new System.Data.SqlClient.SqlParameter("@追溯代码", 0); + thisParms[11].Direction = ParameterDirection.Output; + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + + traceCode = Convert.ToInt32(thisParms[11].Value); + } + catch (Exception err) + { + traceCode = 0; + ////ApplicationLog.WriteLog(err, err.Message); + } + + } + + + /// + /// MES_装配数据_零部件追溯_增加_电子看板 + ///ALTER PROCEDURE MES_装配数据_零部件追溯_增加_电子看板 + ///@追溯代码 int = null, + ///@发动机号 nvarchar(50)=null, + ///@工位号 nvarchar(50)=null, + ///@零件图号 nvarchar(50)=null, + ///@零件名称 nvarchar(50)=null, + ///@零件数量 int=null, + ///@生产厂家 nvarchar(50)=null, + ///@物料条码批次 nvarchar(50)=null, + ///@操作者工号 nvarchar(50)=null, + ///@班次代码 nvarchar(50)=null + /// + /// + /// + /// + /// + /// + /// + static public void MaterialSubTable_Insert(int traceCode,string engineID, string opName,string opperatorCode,string shiftCode, + DataTable dt) + { + string procedureName; + procedureName = "MES_装配数据_零部件追溯_增加_电子看板"; + SqlParameter[] thisParms = new SqlParameter[10]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@追溯代码", traceCode); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@操作者工号", opperatorCode); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@班次代码", shiftCode); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@零件图号", SqlDbType.NVarChar, 50, "零件图号"); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@零件名称", SqlDbType.NVarChar, 50, "零件名称"); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@零件数量", SqlDbType.Int, 4, "零件数量"); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@生产厂家", SqlDbType.NVarChar, 50, "生产厂家"); + thisParms[9] = new System.Data.SqlClient.SqlParameter("@物料条码批次", SqlDbType.NVarChar, 50, "零件批号"); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms,dt); + } + /// + /// 保存物料信息 + /// + /// 发动机号 + /// 发动机型号 + /// 机型代码 + /// 订单号 + /// 工位号 + /// 到达时间 + /// 离开时间 + /// 操作者工号 + /// 班次代码 + /// 放行方式 + /// 工位类型 + /// 装配物料列表 + static public void Material_Insert_B5A(string engineID, string engineType, int engineTypeID, string orderForm, string opName, + DateTime arrivedTime, DateTime leavTime, string opperatorCode, string shiftCode, + int goOverType, string opNameType, DataTable dt) + { + int traceCode; + //MES_装配数据_零部件追溯_数据主表_增加_电子看板 + MaterialMailTable_Insert( engineID, engineType, engineTypeID,orderForm,opName,arrivedTime, leavTime, opperatorCode, shiftCode,goOverType, opNameType,out traceCode); + //MES_装配数据_零部件追溯_增加_电子看板 + MaterialSubTable_Insert(traceCode, engineID, opName, opperatorCode, shiftCode, dt); + } + + /// + /// 电子看板_工位名称与产品型号工艺卡_查询 + /// + /// + /// + /// + static public void GetPdfSrc(string opName, string engineTypeID, out string PdfSrc) + { + string sql; + DataTable dt; + PdfSrc = null; + sql = "exec 电子看板_工位名称与产品型号工艺卡_查询 '" + opName + "'," + engineTypeID; + DataAccess.ExecuteDataTable(sql, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + PdfSrc = dt.Rows[0]["工艺卡路径"].ToString(); + } + } + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/OpName.MainForm.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/OpName.MainForm.cs new file mode 100644 index 0000000..68105fb --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/OpName.MainForm.cs @@ -0,0 +1,89 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Collections; +using System.Collections.Specialized; +//using SystemFramework; + +namespace bizFacade +{ + /// + /// 电子看板信息系统 + /// + public partial class BaseDataSystemMES + { + + /// + /// 基本数据_工作日历_查询 + /// 日期,班次代码,工位产量,工位节拍,在线产量,在线节拍 + /// + /// + /// + /// + /// + /// + /// + /// + static public void OpNameCount_Select(DateTime dateTime, string opName, + out int shiftCode,out int OpNameCount,out int opNameTargetTime,out int onlineCount,out int onlineTargetTime) + { + + DataTable dt; + OpNameCount = 0; + shiftCode = 1; + OpNameCount = 0; + opNameTargetTime = 0; + onlineCount = 0; + onlineTargetTime = 0; + + string procedureName; + procedureName = "基本数据_工作日历_查询"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@日期", dateTime); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms,out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + try + { + shiftCode = Convert.ToInt32(dt.Rows[0]["班次代码"]); + OpNameCount = Convert.ToInt32(dt.Rows[0]["工位产量"]); + opNameTargetTime = Convert.ToInt32(dt.Rows[0]["工位节拍"]); + onlineCount = Convert.ToInt32(dt.Rows[0]["在线产量"]); + onlineTargetTime = Convert.ToInt32(dt.Rows[0]["在线节拍"]); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + } + } + } + } + /// + /// MES_操作着_生产班次_查询 + /// + /// + static public void Shift_Select(out DataTable dt) + { + string sql; + sql = "exec MES_操作着_生产班次_查询"; + DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// 电子看板_托盘编号_查询 + /// + /// + static public void PartPalletCode_Select(out DataTable dt) + { + string sql; + sql = "exec 电子看板_托盘编号_查询"; + DataAccess.ExecuteDataTable(sql,out dt); + } + + + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/UserManage.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/UserManage.cs new file mode 100644 index 0000000..9205e3e --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/UserManage.cs @@ -0,0 +1,223 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; + +//using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + /// + /// 登录用户与工位校验 + /// + /// + /// + /// + /// + static public bool User_WorkCenter(string userName,string opName, out bool result) + { + string sql; + DataTable dt = null; + sql = "SELECT COUNT(*) as usercount FROM [dbo].[MES_Web_User]" + +"where[UserId] = (select top 1 ID from MES_用户管理_人员 where 用户名 = '"+userName+"') and OpName = '"+opName+"'"; + DataAccess.ExecuteDataTable(sql, out dt); + string usercount = dt.Rows[0]["usercount"].ToString(); + if (dt.Rows.Count > 0 && usercount == "1") + { + return result=true; + } + else { + return result=false; + } + } + + /// + /// MES_用户管理_人员信息_视图_显示_查询 + /// + /// + static public void UserInfo_Select(out DataTable dt) + { + dt = null; + string sql = "exec MES_用户管理_人员信息_视图_显示_查询"; + DataAccess.ExecuteDataTable(sql, out dt); + } + + /// + /// [MES_用户管理_人员信息_视图_显示车间操作员_查询] + /// + /// + static public void UserInfo_OPStaff_Select(out DataTable dt) + { + dt = null; + string sql = "exec MES_用户管理_人员信息_视图_显示车间操作员_查询"; + DataAccess.ExecuteDataTable(sql, out dt); + } + + /// + /// MES_用户管理_角色_查询 + /// + static public void StaffRole_select(out DataTable dt) + { + string sql; + sql = "exec MES_用户管理_角色_查询"; + DataAccess.ExecuteDataTable(sql, out dt); + } + + /// + /// [MES_用户管理_人员_增加_查询] + /// 执行后,返回count(*) + /// + /// + + public static int UserInfo_Select_ForInsert(string userID) + { + int count; + string sql; + sql = "exec MES_用户管理_人员_增加_查询 '" + userID + "'"; + DataAccess.ExecuteOutNum(sql, out count); + return count; + } + + /// + /// MES_用户管理_人员_增加 + /// + /// + /// + static public bool UserInfo_Insert(string userID, string userName, int roleNum) + { + string procedureName; + procedureName = "MES_用户管理_人员_增加"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@用户名", userID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@员工姓名", userName); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@角色代码", roleNum); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + + } + + /// + /// MES_用户管理_人员_修改 + /// + /// + /// + static public bool UserInfo_Update(int ID,string userID,string userPassword,string userName, int roleNum) + { + string procedureName; + procedureName = "MES_用户管理_人员_修改"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@ID", ID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@用户名", userID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@密码", userPassword); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@员工姓名", userName); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@角色代码", roleNum); + + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + + + } + + /// + /// MES_用户管理_人员_姓名_修改 + /// + /// + /// + static public bool UserInfo_Name_Update(int ID, string userID,string userName) + { + string procedureName; + procedureName = "MES_用户管理_人员_姓名_修改"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@ID", ID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@用户名", userID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@员工姓名", userName); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + + + } + + /// + ///[MES_用户管理_人员_删除] + /// + static public bool UserInfo_Delete(int ID, string userID) + { + string procedureName; + procedureName = "MES_用户管理_人员_删除"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@ID", ID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@用户名", userID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + + } + + + /// + /// MES_用户管理_人员登录_查询 + /// + /// + /// + static public void UserInfo_Login(string userID, string userPassword, out DataTable dt) + { + string procedureName; + procedureName = "MES_用户管理_人员登录_查询"; + //procedureName = "权限管理_用户登录_查询数据"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@用户名", userID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@密码", userPassword); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + + /// + /// MES_用户管理_人员登录_是否存在_查询 + /// 执行后,返回count(*) + /// + /// + /// + /// + public static int UserInfo_Login_Exist_Select(string userID,string userPassword) + { + int count; + string sql; + sql = "exec MES_用户管理_人员登录_是否存在_查询 '" + userID + "'" + ",'" + userPassword + "'"; + DataAccess.ExecuteOutNum(sql, out count); + return count; + } + + + /// + /// MES_用户管理_人员_密码_修改 + /// + /// + /// + static public bool UserInfo_Password_Update(string userID, string userPassword,string userNewPassword) + { + string procedureName; + procedureName = "MES_用户管理_人员_密码_修改"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@用户名", userID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@密码", userPassword); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@新密码", userNewPassword); + + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + + + } + + /// + /// 基本数据_工作日历_班次查询 2013-11-07 查出当前时间班次 + /// + /// + /// + static public void UserShift_Select(out DataTable dt) + { + string procedureName; + procedureName = "基本数据_工作日历_班次查询"; + DataAccess.ExecuteStoredProcedure(procedureName,out dt); + } + + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/UserNamePassword.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/UserNamePassword.cs new file mode 100644 index 0000000..e43c876 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/UserNamePassword.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; + +//using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + /// + /// MES_操作者_登录_增加 + /// + /// + /// + public static void UserNameLoginInsert(string opName,string userName) + { + string procedureName; + procedureName = "MES_操作者_登录_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@操作者工号", userName); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// MES_操作者_用户_增加 2013-01-23 王可心 + /// + /// + /// + static public bool UserNameTableInsert(string userName, string user) + { + string procedureName; + procedureName = "MES_操作者_用户_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@操作者工号", userName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@操作者姓名", user); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + + } + /// + /// MES_操作者_用户_修改 + /// + /// + /// + /// + public static void UserNameTableUpdate(string userName,string password,string passwordNew) + { + string sql; + sql = "exec MES_操作者_用户_修改 '" + userName + "','" + password + "','"+passwordNew+"'"; + DataAccess.ExecuteSQL(sql); + } + /// + /// MES_操作者_用户_设置初始秘密 + /// + /// + static public bool UserNameTableUpdateInitPassword(string userName) + { + string procedureName; + procedureName = "MES_操作者_用户_设置初始秘密"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@操作者工号", userName); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + + } + /// + /// MES_操作者_用户_查询 + /// 执行后,返回count(*) + /// + /// + /// + public static int UserNameTableSelect(string userName, string password) + { + int count; + string sql; + sql = "exec MES_操作者_用户_查询 '"+ userName + "','" + password + "'"; + DataAccess.ExecuteOutNum(sql, out count); + return count; + } + /// + /// MES_操作者_用户_增加用_查询 + /// 执行后,返回count(*) + /// + /// + + public static int UserNameTableSelectForInsert(string userName) + { + int count; + string sql; + sql = "exec MES_操作者_用户_增加用_查询 '" + userName + "'"; + DataAccess.ExecuteOutNum(sql, out count); + return count; + } + + + /// + /// MES_操作者_用户_删除 2013-01-23 王可心 删除该用户 + /// + /// 用户工号 + static public bool UserNameTableSelectForDelete(string userName) + { + string procedureName; + procedureName = "MES_操作者_用户_删除"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@操作者工号", userName); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + /// + /// MES_操作者_用户_姓名_修改 2013-01-23 王可心 + /// + /// + /// + static public bool UserNameTableAlter(string userName, string user) + { + string procedureName; + procedureName = "MES_操作者_用户_姓名_修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@操作者工号", userName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@操作者姓名", user); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/vssver2.scc b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.MainForm/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..22fe44abbc54eb197fabe7245e27a9dfd4e0a513 GIT binary patch literal 299 zcmXpJVq~~_m%l5bInsUAj6{**Nns+N78iXtU}9ikV_;w~1k&QmjT%oVebi?J@{NG} z@O85sZg@iY#z6k$28-1ig%G|8kpHq&WrxKK2;UUQzj{abm&7{=-weoqVjVswL-YgK zJQaOk&*1XZBpBsXTAZ1eT3qawn4FlBs_*L>tmkCvsOOuQndg>Yl*{0nmkyNobaBp4 zN!3d(X7DfYOUzA$%VQJrNi5Av&cG()n^=-sl$n?Vk_# + /// 电子看板信息系统 + /// + public partial class BaseDataSystemMES + { + /// + /// 电子看板_工作时间与班次_删除 + /// + /// 序号 + static public bool WorkShift_Delete(int shiftNO) + { + string procedureName; + procedureName = "电子看板_工作时间与班次_删除"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@序号", shiftNO); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 电子看板_工作时间与班次_修改 + /// + /// 序号 + /// 开始工作时间 + /// 结束工作时间 + /// 班次代码 + /// 是否工作 + static public bool WorkShift_Update(int shiftNO,string shiftStartTime, + string shiftEndTime, int shiftWorkNo, int shiftIsWork) + { + string procedureName; + procedureName = "电子看板_工作时间与班次_修改"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@序号", shiftNO); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@开始工作时间", shiftStartTime); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@结束工作时间", shiftEndTime); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@班次代码", shiftWorkNo); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@是否工作", shiftIsWork); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 电子看板_工作时间与班次_增加 + /// + /// 序号 + /// 开始工作时间 + /// 结束工作时间 + /// 班次代码 + /// 是否工作 + static public bool WorkShift_Insert(int shiftNO, string shiftStartTime, + string shiftEndTime, int shiftWorkNo, int shiftIsWork) + { + string procedureName; + procedureName = "电子看板_工作时间与班次_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@序号", shiftNO); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@开始工作时间", shiftStartTime); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@结束工作时间", shiftEndTime); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@班次代码", shiftWorkNo); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@是否工作", shiftIsWork); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 电子看板_工作时间与班次_查询 + /// + /// + static public void WorkShift_Select(out DataTable dt) + { + string sql; + sql = " exec 电子看板_工作时间与班次_查询"; + DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// MES_基本变量_基本机型_增加 + /// @基本机型 nvarchar(50), + /// @机型代码 int + /// + static public bool EngineBasicType_Insert(string engineBasicType, + int engineBasicTypeID, double maxWeight, double minWeight, double Vp, double tm) + { + string procedureName; + procedureName = "MES_基本变量_基本机型_增加"; + SqlParameter[] thisParms = new SqlParameter[6]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@基本机型", engineBasicType); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@机型代码", engineBasicTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@重量差上限", maxWeight); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@重量差下限", minWeight); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@Vp", Vp); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@tm", tm); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// MES_基本变量_基本机型_修改 + /// @序号 int, + /// @基本机型 nvarchar(50), + /// @机型代码 int + /// + static public bool EngineBasicType_Update(int sn,string engineBasicType, + int engineBasicTypeID, double maxWeight, double minWeight, double Vp, double tm) + { + string procedureName; + procedureName = "MES_基本变量_基本机型_修改"; + SqlParameter[] thisParms = new SqlParameter[7]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@序号", sn); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@基本机型", engineBasicType); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@机型代码", engineBasicTypeID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@重量差上限", maxWeight); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@重量差下限", minWeight); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@Vp", Vp); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@tm", tm); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// MES_基本变量_基本机型_删除 + /// @序号 int + /// + static public bool EngineBasicType_Delete(int sn) + { + string procedureName; + procedureName = "MES_基本变量_基本机型_删除"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@序号", sn); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// MES_基本变量_机型代码_增加 + /// @发动机型号 nvarchar(50), + /// @发动机机型标志 int, + /// @条码类型 int , + /// @流水号类型 int, + /// @工厂编号 nvarchar(50), + /// @装配线班组号 nvarchar(50), + /// @壳体编号型号 nvarchar(50), + /// @壳体编号型号带空格 nvarchar(50), + /// @QR码读数标志 nvarchar(50), + /// @QR码产品型号 nvarchar(50) + /// + /// 发动机型号 + /// 发动机机型标志 + /// 条码类型 + /// 流水号类型 + /// 工厂编号 + /// 装配线班组号 + /// 壳体编号型号 + /// 壳体编号型号带空格 + /// QR码读数标志 + /// QR码产品型号 + /// + static public bool EngineType_Insert(string engineType, int engineTypeID, + int barCodeID,int snNumberID,string factoryID,string shiftID, + string shellCode, string shellCode_Space, string QR_Code, string QR_Type, string shellCode_downline) + { + string procedureName; + procedureName = "MES_基本变量_机型代码_增加_new"; + SqlParameter[] thisParms = new SqlParameter[11]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机机型标志", engineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@条码类型", barCodeID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@流水号类型", snNumberID); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@工厂编号", factoryID); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@装配线班组号", shiftID); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@壳体编号型号", shellCode); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@壳体编号型号带空格", shellCode_Space); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@QR码读数标志", QR_Code); + thisParms[9] = new System.Data.SqlClient.SqlParameter("@QR码产品型号", QR_Type); + thisParms[10] = new System.Data.SqlClient.SqlParameter("@壳体编号型号条码", shellCode_downline); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// MES_基本变量_机型代码_修改 + /// @序号 int, + /// @发动机型号 nvarchar(50), + /// @发动机机型标志 int, + /// @条码类型 int , + /// @流水号类型 int, + /// @工厂编号 nvarchar(50), + /// @装配线班组号 nvarchar(50), + /// @壳体编号型号 nvarchar(50), + /// @壳体编号型号带空格 nvarchar(50), + /// @QR码读数标志 nvarchar(50), + /// @QR码产品型号 nvarchar(50) + /// + /// 序号 + /// 发动机型号 + /// 发动机机型标志 + /// 条码类型 + /// 流水号类型 + /// 工厂编号 + /// 装配线班组号 + /// 壳体编号型号 + /// 壳体编号型号带空格 + /// QR码读数标志 + /// QR码产品型号 + /// + static public bool EngineType_Update(int sn,string engineType, int engineBasicTypeID, + int barCodeID, int snNumberID, string factoryID, string shiftID, + string shellCode, string shellCode_Space, string QR_Code, string QR_Type,string shellCode_downline) + { + string procedureName; + procedureName = "MES_基本变量_机型代码_修改_new"; + SqlParameter[] thisParms = new SqlParameter[12]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@序号", sn); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@发动机机型标志", engineBasicTypeID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@条码类型", barCodeID); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@流水号类型", snNumberID); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@工厂编号", factoryID); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@装配线班组号", shiftID); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@壳体编号型号", shellCode); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@壳体编号型号带空格", shellCode_Space); + thisParms[9] = new System.Data.SqlClient.SqlParameter("@QR码读数标志", QR_Code); + thisParms[10] = new System.Data.SqlClient.SqlParameter("@QR码产品型号", QR_Type); + thisParms[11] = new System.Data.SqlClient.SqlParameter("@壳体编号型号条码", shellCode_downline); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// MES_基本变量_机型代码_删除 + /// @序号 int, + /// + /// 序号 + /// + static public bool EngineType_Delete(int sn) + { + string procedureName; + procedureName = "MES_基本变量_机型代码_删除"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@序号", sn); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/IsMES.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/IsMES.cs new file mode 100644 index 0000000..040f267 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/IsMES.cs @@ -0,0 +1,59 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Collections; +using System.Collections.Specialized; +//using SystemFramework; + +namespace bizFacade +{ + /// + /// [MES_计划BOM_工位与名称_查询_是否启用MES] + /// + public partial class BaseDataSystemMES + { + /// + /// [MES_计划BOM_工位与名称_查询_是否启用MES] + /// + /// + public static int IsMES_Select(string opName) + { + int count; + string sql = "exec MES_计划BOM_工位与名称_查询_是否启用MES '" + opName + "'"; + DataAccess.ExecuteOutNum(sql, out count); + return count; + } + /// + /// [MES_计划BOM_工位与名称_查询_在线状态] + /// + /// + public static int IsOnLine_Select(string opName) + { + int count; + string sql = "exec MES_计划BOM_工位与名称_查询_在线状态 '" + opName + "'"; + DataAccess.ExecuteOutNum(sql, out count); + return count; + } + /// + /// [MES_计划BOM_工位与名称_查询_是否启用MES] + /// + /// + /// + public static void IsMES_Update(string opName,string tagValue) + { + string sql = "exec MES_计划BOM_工位与名称_更新_是否启用MES '" + opName + "'," + tagValue; + DataAccess.ExecuteSQL(sql); + } + /// + /// [MES_计划BOM_工位与名称_查询_在线状态] + /// + /// + /// + public static void IsOnLine_Update(string opName, string tagValue) + { + string sql = "exec MES_计划BOM_工位与名称_更新_在线状态 '" + opName + "'," + tagValue; + DataAccess.ExecuteSQL(sql); + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/OpName.Material.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/OpName.Material.cs new file mode 100644 index 0000000..a0dca87 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/OpName.Material.cs @@ -0,0 +1,111 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Collections; +using System.Collections.Specialized; +////using SystemFramework; + +namespace bizFacade +{ + /// + /// 电子看板信息系统 + /// + public partial class BaseDataSystemMES + { + /// + /// MES_基本变量_厂家代码_查询 + /// + static public void MaterialFactory_Select(out DataTable dt) + { + string sql; + sql = "exec MES_基本变量_厂家代码_查询"; + DataAccess.ExecuteDataTable(sql, out dt); + } + ///// + ///// 电子看板_装配零件_查询 + ///// + ///// + ///// + ///// + //static public void PartMaterial_Select(string opName, string engineType,string engineTypeID, out DataTable dt) + //{ + // string sql; + // sql = "exec 电子看板_装配零件_查询 '" + opName + "'," + engineTypeID + ",'" + engineType+"'"; + // DataAccess.ExecuteDataTable(sql, out dt); + //} + /// + /// 电子看板_装配零件_增加 + /// + /// 工位号 + /// 产品型号代码 + /// 标号 + /// 零件图号 + /// 零件名称 + /// 零件数量 + /// 零件批号 + /// 生产厂家 + /// 备注 + /// 发动机型号 + static public void PartMaterial_Insert + (string opName, int engineTypeID, + int MaterialMark, string PartDrawNumber, string PartName, int PartCount, + string MaterialNumber, string PartFactor, string PartMemo, string engineType) + { + string procedureName; + procedureName = "电子看板_装配零件_增加"; + SqlParameter[] thisParms = new SqlParameter[10]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@产品型号代码", engineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@标号", MaterialMark); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@零件图号", PartDrawNumber); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@零件名称", PartName); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@零件数量", PartCount); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@零件批号", MaterialNumber); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@生产厂家", PartFactor); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@备注", PartMemo); + thisParms[9] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 电子看板_装配零件_修改 + /// + /// 唯一标志 + /// 标号 + /// 零件图号 + /// 零件名称 + /// 零件数量 + /// 零件批号 + /// 生产厂家 + /// 备注 + static public void PartMaterial_Update + (int ID,int MaterialMark, string PartDrawNumber, string PartName, int PartCount, + string MaterialNumber, string PartFactor, string PartMemo) + { + string procedureName; + procedureName = "电子看板_装配零件_修改"; + SqlParameter[] thisParms = new SqlParameter[8]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@ID", ID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@标号", MaterialMark); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@零件图号", PartDrawNumber); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@零件名称", PartName); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@零件数量", PartCount); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@零件批号", MaterialNumber); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@生产厂家", PartFactor); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@备注", PartMemo); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 电子看板_装配零件_删除 + /// + /// + static public void PartMaterial_Delete(int ID) + { + string procedureName; + procedureName = "电子看板_装配零件_删除"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@ID", ID); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/OpName.Proccess.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/OpName.Proccess.cs new file mode 100644 index 0000000..09bbbf5 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/OpName.Proccess.cs @@ -0,0 +1,113 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Collections; +using System.Collections.Specialized; +////using SystemFramework; + +namespace bizFacade +{ + /// + /// 电子看板信息系统 + /// + public partial class BaseDataSystemMES + { + /// + /// MES_计划BOM_工位与名称_修改_工序号和工序名称; + /// + /// 工位号 + /// 工序号 + /// 工序名称 + static public void OpNameWorkStepName_Update(string opName, string ProccessCode, string ProcessName) + { + string procedureName; + procedureName = "MES_计划BOM_工位与名称_修改_工序号和工序名称"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工序号", ProccessCode); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@工序名称", ProcessName); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 电子看板_工序内容_工步属性_查询 + /// + static public void GetWorkStepPropurty(out DataTable dt) + { + string sql; + sql = "exec 电子看板_工序内容_工步属性_查询"; + DataAccess.ExecuteDataTable(sql, out dt); + } + + /// + /// 电子看板_工序内容_增加 + /// + /// + /// + /// + /// + /// + /// + static public void WorkStepPropurty_Insert(string opName, int engineTypeID, int workStep, string contend,string requare, int propurtyID) + { + string procedureName; + procedureName = "电子看板_工序内容_增加"; + SqlParameter[] thisParms = new SqlParameter[6]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@产品型号代码", engineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@工步号", workStep); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@操作内容", contend); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@技术要求", requare); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@工步属性", propurtyID); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 电子看板_工序内容_修改 + /// + /// + /// + /// + /// + static public void WorkStepPropurty_Update(int ID, string contend, string requare, int propurtyID) + { + string procedureName; + procedureName = "电子看板_工序内容_修改"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@ID", ID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@操作内容", contend); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@技术要求", requare); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@工步属性", propurtyID); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 电子看板_工序内容_删除 + /// + /// + static public void WorkStepPropurty_Delete(int ID) + { + string procedureName; + procedureName = "电子看板_工序内容_删除"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@ID", ID); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 电子看板_工序内容_修改_修改序号 + /// + /// + /// + /// + /// + static public void WorkStepPropurty_Update_WorkStep(int ID,string opName, int engineTypeID, int workStep) + { + string procedureName; + procedureName = "电子看板_工序内容_修改_修改序号"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@ID", ID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@产品型号代码", engineTypeID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@工步号", workStep); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/OpName.Shaft.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/OpName.Shaft.cs new file mode 100644 index 0000000..1d63fbe --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/OpName.Shaft.cs @@ -0,0 +1,244 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Collections; +using System.Collections.Specialized; +//using SystemFramework; + +namespace bizFacade +{ + /// + /// 电子看板信息系统 + /// + public partial class BaseDataSystemMES + { + /// + /// MES_计划BOM_工位与名称_查询 + /// + /// + static public void GetOpNameByOpName(string opName,out DataTable dt) + { + string procedureName; + procedureName = "MES_计划BOM_工位与名称_查询_根据工位号"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms,out dt); + } + /// + /// MES_计划BOM_工位与名称_查询 + /// MES_计划BOM_工位与名称_查询_根据工位号 + /// + static public void GetOpName(out DataTable dt) + { + string sql; + sql = "exec MES_计划BOM_工位与名称_查询"; + DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// MES_计划BOM_工位与名称_查询_工位号_有工位计算机 + /// + static public void GetOpName_IsMEsPC(out DataTable dt) + { + string sql; + sql = "exec MES_计划BOM_工位与名称_查询_工位号_有工位计算机"; + DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// MES_计划BOM_工位与名称_查询_工位号_是否有测量数据_有拧紧数据 + /// + static public void GetOpName_IsNinJinOpName(out DataTable dt) + { + string sql; + sql = "exec MES_计划BOM_工位与名称_查询_工位号_是否有测量数据_有拧紧数据"; + DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// MES_基本变量_基本机型_查询 + /// + static public void GetEngineBasicType(out DataTable dt) + { + string sql; + sql = " exec MES_基本变量_基本机型_查询"; + DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// 电子看板_工位名称与产品型号产品图片_保存图片 + /// @工位号 nvarchar(50), + /// @产品型号代码 int =null, + /// @产品图片 image + /// + static public void SaveImageFile(string opName, int engineTypeID, byte[] pic) + { + string procedureName; + procedureName = "电子看板_工位名称与产品型号产品图片_保存图片"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@产品型号代码", engineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@产品图片", pic); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// + /// + /// + /// + /// + static public void GetImageFile(string opName, string engineTypeID, out byte[] pic) + { + string sql; + DataTable dt; + pic = null; + sql = "exec 电子看板_工位名称与产品型号产品图片_查询 '" + opName + "'," + engineTypeID; + DataAccess.ExecuteDataTable(sql, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + pic = (byte[])dt.Rows[0]["产品图片"]; + } + } + } + /// + /// 电子看板_工位机型_质量数据测量位置_查询 + /// + /// + /// + /// + static public void ShaftPositionSelect(string opName, string engineTypeID, out DataTable dt) + { + string sql; + sql = "exec 电子看板_工位机型_质量数据测量位置_查询 '" + opName + "'," + engineTypeID; + DataAccess.ExecuteDataTable(sql, out dt); + } + + /// + /// 电子看板_工位机型_质量数据测量位置_套筒号_查询 + /// + /// + /// + /// + static public void ShaftPositionSelect_BoltCode(string opName, string engineTypeID, out DataTable dt) + { + string sql; + sql = "exec 电子看板_工位机型_质量数据测量位置_套筒号_查询 '" + opName + "'," + engineTypeID; + DataAccess.ExecuteDataTable(sql, out dt); + } + + /// + /// 电子看板_工位机型_质量数据测量位置_保存数据 + /// 完成增加和修改数据 + /// + /// + /// + /// + /// + /// + /// + /// + /// + static public void ShaftPositionSaveData(string opName, + int engineTypeID, int shaftSN,int workGroup, + int xPosition, int yPosition, int workStep, int taoTongHao, string Torque) + { + string procedureName; + procedureName = "电子看板_工位机型_质量数据测量位置_保存数据"; + SqlParameter[] thisParms = new SqlParameter[9]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@产品型号代码", engineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@序号", shaftSN); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@组号", workGroup); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@测量位置X", xPosition); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@测量位置Y", yPosition); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@工作顺序", workStep); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@套筒号", taoTongHao); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@扭矩", Torque); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 电子看板_工位机型_质量数据测量位置_修改 + /// 修改数据 电子看板_工位机型_质量数据测量位置_修改_修改序号 + /// + /// 工位号 + /// 产品型号代码 + /// 序号 + /// 组号 + /// 测量位置X + /// 测量位置Y + /// 工作顺序 + /// 工作顺序 + static public void ShaftPositionSaveUpdate(string opName, + int engineTypeID, int shaftSN, int workGroup,int xPosition, + int yPosition, int workStep, int taoTongHao, string Torque) + { + string procedureName; + procedureName = "电子看板_工位机型_质量数据测量位置_修改"; + SqlParameter[] thisParms = new SqlParameter[9]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@产品型号代码", engineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@序号", shaftSN); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@组号", workGroup); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@测量位置X", xPosition); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@测量位置Y", yPosition); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@工作顺序", workStep); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@套筒号", taoTongHao); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@扭矩", Torque); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 电子看板_工位机型_质量数据测量位置_修改_修改序号 + /// + /// + /// + /// + /// + static public void ShaftPositionSaveUpdate_OnlySN(int id,string opName, int engineTypeID, int shaftSN) + { + string procedureName; + procedureName = "电子看板_工位机型_质量数据测量位置_修改_修改序号"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@ID", id); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@产品型号代码", engineTypeID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@序号", shaftSN); + + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 电子看板_工位机型_质量数据测量位置_删除 + /// + /// + /// + /// + static public void ShaftPositionSaveDelete(string opName, int engineTypeID, int shaftSN) + { + string procedureName; + procedureName = "电子看板_工位机型_质量数据测量位置_删除"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@产品型号代码", engineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@序号", shaftSN); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 电子看板_工位机型_质量数据测量位置_修改_修改扭矩 + /// + /// + /// + /// + /// + static public void ShaftPositionSaveUpdate_OnlyTorque(int shaftSN, string opName, int engineTypeID, string Torque) + { + string procedureName; + procedureName = "电子看板_工位机型_质量数据测量位置_修改_修改扭矩"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@序号", shaftSN); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@产品型号代码", engineTypeID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@扭矩", Torque); + + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/vssver2.scc b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.Manager/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..3e306403132914cd28e94b0112e92445cfa93d00 GIT binary patch literal 236 zcmXpJVq~~_m%l5bInsUAj6{**Nns)fGnYg7Z-@)o_fPCfXo=q^mioUOBaCvGHjB+Y1 z&df_KE_O>yPE1MF_jL`{b24?*^G(c4OiwLhaLr2xN{3Vyr0OLXGk6w*8xE fRG_Mo)S}G993-KDqWt7!pm|6_!5N8ZB_KWkeppJP literal 0 HcmV?d00001 diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.QualityData/QualityData.B5A.Pack.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.QualityData/QualityData.B5A.Pack.cs new file mode 100644 index 0000000..5c427ce --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.QualityData/QualityData.B5A.Pack.cs @@ -0,0 +1,904 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Collections; +using System.Collections.Specialized; +//using SystemFramework; + +namespace bizFacade +{ + /// + /// 电子看板信息系统 + /// + public partial class BaseDataSystemMES + { + /// + /// 拧紧结束后,查询拧紧不合格轴的数量,[测量数据合格_合格标志_查询] + /// + /// 发动机号 + /// 工位号 + /// 不合格数量 + /// + public static bool BaseData_QualityData_B5A_IsGoodBad_select(string EngineID,string OPName,out int Count_NG) + { + Count_NG = 0; + string procedureName; + procedureName = "测量数据合格_合格标志_查询"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", OPName); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@不合格数", Count_NG); + thisParms[2].Direction = ParameterDirection.Output; + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + Count_NG = Convert.ToInt32(thisParms[2].Value.ToString()); + return true; + } + return false; + + } + + /// + /// 测量数据合格索引_禁用 + /// + /// + /// + /// + public static bool BaseData_tagTable_QualityData_B5A_UnUsing + (string engineID, string opName) + { + string procedureName; + procedureName = "测量数据合格索引_禁用"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@EngineID", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + /// + /// 测量数据合格索引_分线数据_删除 + /// + /// + /// + /// + public static bool BaseData_tagTable_QualityData_B5A_SubTable_Delete + (string engineID,string opName) + { + string procedureName; + procedureName = "测量数据合格索引_分线数据_删除"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@EngineID", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + /// + /// alter PROCEDURE [dbo].[测量数据合格_手动拧紧_列位置_增加] + ///@EngineTypeID int =null, + ///@EngineType nvarchar(50)=null, + ///@EngineID nvarchar(100)=null, + ///@TagValue nvarchar(100)=null, + ///@合格标志 int=null, + ///@工位号 nvarchar(50)=null, + ///@托盘编号 nvarchar(50)=null, + ///@列位置 int=null, + ///@变量排序 int=null, + ///@TagID_CF int=null + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool BaseData_tagTable_QualityData_B5A_Insert +(int engineTypeID,string engineType,string engineID, + string tagValue, int isGoodBad, + string opName,string partPallet, + int shiftID,int orderBy,int tagID_CF + ) + { + string procedureName; + procedureName = "测量数据合格_手动拧紧_列位置_增加"; + SqlParameter[] thisParms = new SqlParameter[10]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@EngineTypeID", engineTypeID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@EngineType", engineType); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineID", engineID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@TagValue", tagValue); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@合格标志", isGoodBad); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@托盘编号", partPallet); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@列位置", shiftID); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@变量排序", orderBy); + thisParms[9] = new System.Data.SqlClient.SqlParameter("@TagID_CF", tagID_CF); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// alter PROCEDURE [dbo].[测量数据合格_手动拧紧_增加] + ///@EngineTypeID int =null, + ///@EngineType nvarchar(50)=null, + ///@EngineID nvarchar(100)=null, + ///@TagValue nvarchar(100)=null, + ///@合格标志 int=null, + ///@工位号 nvarchar(50)=null, + ///@托盘编号 nvarchar(50)=null, + ///@TagID int=null, + ///@TagID_CF int=null + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool BaseData_tagTable_QualityData_B5A_Insert +(int engineTypeID, string engineType, string engineID, + string tagValue, int isGoodBad, + string opName, string partPallet, int tagID, int tagID_CF) + { + string procedureName; + procedureName = "测量数据合格_手动拧紧_增加"; + SqlParameter[] thisParms = new SqlParameter[9]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@EngineTypeID", engineTypeID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@EngineType", engineType); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineID", engineID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@TagValue", tagValue); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@合格标志", isGoodBad); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@托盘编号", partPallet); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@TagID", tagID); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@TagID_CF", tagID_CF); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// alter PROCEDURE [dbo].[测量数据合格_增加_物料检测] + ///@EngineTypeID int =null, + ///@EngineType nvarchar(50)=null, + ///@EngineID nvarchar(100)=null, + ///@TagValue nvarchar(100)=null, + ///@合格标志 int=null, + ///@工位号 nvarchar(50)=null, + ///@托盘编号 nvarchar(50)=null, + ///@TagID int=null, + ///@TagID_CF int=null + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool BaseData_tagTable_QualityData_B5A_Insert_MaterialTest +(int engineTypeID, string engineType, string engineID, + string tagValue, int isGoodBad, + string opName, string partPallet, int tagID, int tagID_CF) + { + string procedureName; + procedureName = "测量数据合格_增加_物料检测"; + SqlParameter[] thisParms = new SqlParameter[9]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@EngineTypeID", engineTypeID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@EngineType", engineType); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineID", engineID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@TagValue", tagValue); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@合格标志", isGoodBad); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@托盘编号", partPallet); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@TagID", tagID); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@TagID_CF", tagID_CF); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } +// /// +// /// 测量数据合格_增加_物料检测 +// /// +// /// +// /// +// /// +// /// +// /// +// /// +// /// +// public static bool BaseData_tagTable_QualityData_B5A_Insert_MaterialTest +//(int Id_tagCF, int engineTypeID, string engineID, int tagID, string tagValue, int isGoodBad) +// { +// string procedureName; +// procedureName = "测量数据合格_增加_物料检测"; +// SqlParameter[] thisParms = new SqlParameter[6]; +// thisParms[0] = new System.Data.SqlClient.SqlParameter("@Id_tagCF", Id_tagCF); +// thisParms[1] = new System.Data.SqlClient.SqlParameter("@EngineTypeID", engineTypeID); +// thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineID", engineID); +// thisParms[3] = new System.Data.SqlClient.SqlParameter("@TagID", tagID); +// thisParms[4] = new System.Data.SqlClient.SqlParameter("@TagValue", tagValue); +// thisParms[5] = new System.Data.SqlClient.SqlParameter("@IsGoodBad", isGoodBad); +// return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); +// } + /// + /// ALTER PROCEDURE [dbo].[电子看板_发动机号_总合格标志_增加] + ///@工位号 nvarchar(50) = null, + ///@发动机号 nvarchar(50) = null, + ///@合格标志 int = 0测量数据合格索引_增加 + ///0合格;1不合格 + /// + /// + /// + /// + /// + public static bool BaseData_tagTable_Engine_IsOK_Insert + (string opName, string EngineID, int isOK) + { + string procedureName; + procedureName = "电子看板_发动机号_总合格标志_增加"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@合格标志", isOK); + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + return true; + } + return false; + } + + /// + /// 测量数据合格索引 合格标志修改-2012-08-23 chenghai + /// + /// + /// + /// 0合格;1不合格 + /// + public static bool BaseData_tagTable_QualityData_B5A_IsOK_update + (string opName, string EngineID, int isOK) + { + string procedureName; + procedureName = "电子看板_测量数据合格索引_合格标志_修改"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@合格标志", isOK); + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + return true; + } + return false; + } + + + /// + /// ALTER PROCEDURE [dbo].[电子看板_发动机号_总合格标志_查询] + ///@工位号 nvarchar(50) = null, + ///@发动机号 nvarchar(50) = null, + ///@合格标志 int = 0 output + /// + /// + /// + /// 0合格;1不合格 + /// + public static bool BaseData_tagTable_Engine_IsOK_Select + (string opName, string EngineID, out int isOK) + { + isOK = 1; + string procedureName; + procedureName = "电子看板_发动机号_总合格标志_查询"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@合格标志", isOK); + thisParms[2].Direction = ParameterDirection.Output; + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + isOK = Convert.ToInt32(thisParms[2].Value.ToString()); + return true; + } + return false; + } + /// + /// 测量数据合格_发动机返修前数据_合格标志_查询,用于3010工位 + /// + /// 工件号 + /// + /// + public static bool TestData_EngineRework_IsOK_Select + (string EngineID, out int isOK_M, out int isOK_S) + { + isOK_M = 1; + isOK_S = 1; + string procedureName; + procedureName = "测量数据合格_发动机返修前数据_合格标志_查询"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@合格标志_M", isOK_M); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@合格标志_S", isOK_S); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2].Direction = ParameterDirection.Output; + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + isOK_M = Convert.ToInt32(thisParms[1].Value.ToString()); + isOK_S = Convert.ToInt32(thisParms[2].Value.ToString()); + return true; + } + return false; + } + + /// + /// 电子看板_发动机号_不合格放行_查询 + /// + /// + /// + /// + /// + public static bool BaseData_tagTable_Engine_IsNG_Select + (string opName, string EngineID, out DataTable dt) + { + string procedureName; + procedureName = "电子看板_发动机号_不合格放行_查询"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms,out dt)) + { + if (dt != null) + { + if(dt.Rows.Count==1) + return true; + } + return false; + } + return false; + } + /// + /// 电子看板_发动机号_不合格放行_增加 + /// + /// + /// + /// + /// + /// + public static bool BaseData_tagTable_Engine_IsNG_Insert + (string opName, string EngineID, string worker,string text) + { + string procedureName; + procedureName = "电子看板_发动机号_不合格放行_增加"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@操作者编号", worker); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@不合格原因", text); + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + return true; + } + return false; + } + /// + /// 电子看板_发动机号_不合格放行_删除 + /// + /// + /// + /// + public static bool BaseData_tagTable_Engine_IsNG_Delete +(string opName, string EngineID) + { + string procedureName; + procedureName = "电子看板_发动机号_不合格放行_删除"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + + /// + /// 电子看板_发动机号_不合格放行_删除_分线线首 + /// + /// + /// + /// + public static bool BaseData_tagTable_Engine_IsNG_Delete_fenxian_xianshou +(string opName, string EngineID) + { + string procedureName; + procedureName = "电子看板_发动机号_不合格放行_删除_分线线首"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + + /// + /// 电子看板_零件图号_生产厂家_查询 + /// + /// + /// + /// + public static bool MaterialFactory_Select(string partDrawCode,out DataTable dt) + { + string procedureName; + procedureName = "电子看板_零件图号_生产厂家_查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@零件图号", partDrawCode); + + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms,out dt); + } + + /// + /// 派工订单_订单信息_查询 + /// + /// + /// + /// + public static bool Get_DataByOrderForm(string EngineID, out DataTable dt) + { + string procedureName; + procedureName = "派工订单_订单信息_查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工件编号", EngineID); + + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + /// + /// 电子看板_零件图号_生产厂家_增加 + /// + /// + /// + /// + public static bool MaterialFactory_Insert(string partDrawCode,string factory) + { + string procedureName; + procedureName = "电子看板_零件图号_生产厂家_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@零件图号", partDrawCode); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@生产厂家", factory); + + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 电子看板_零件图号_生产厂家_修改 + /// + /// + /// + /// + /// + public static bool MaterialFactory_Update(int factoryCode, string partDrawCode, string factory) + { + string procedureName; + procedureName = "电子看板_零件图号_生产厂家_修改"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@厂家代码", factoryCode); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@零件图号", partDrawCode); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@生产厂家", factory); + + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 电子看板_零件图号_生产厂家_删除 + /// + /// + /// + public static bool MaterialFactory_Delete(int factoryCode) + { + string procedureName; + procedureName = "电子看板_零件图号_生产厂家_删除"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@厂家代码", factoryCode); + + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// [电子看板_发动机号_不合格放行_返修下线_查询] + /// + /// + /// + /// + public static bool BaseData_tagTable_Engine_IsNG_PartUnLoad_Select + (string EngineID, out DataTable dt) + { + string procedureName; + procedureName = "电子看板_发动机号_不合格放行_返修下线_查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt)) + { + if (dt != null) + { + if (dt.Rows.Count == 1) + return true; + } + return false; + } + return false; + } + + + /// + /// [电子看板_发动机号_返修下线_查询]-2012-09-14-chenghai 以前只有不合格 才打印工位号 + /// + /// + /// + /// + public static bool BaseData_tagTable_Engine_fanxiu_PartUnLoad_Select + (string EngineID, out DataTable dt) + { + string procedureName; + procedureName = "电子看板_发动机号_返修下线_查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt)) + { + if (dt != null) + { + if (dt.Rows.Count == 1) + return true; + } + return false; + } + return false; + } + + + /// + /// 测量数据合格索引_不合格标志_查询-2012-12-05-kexin OP3024用 打印不合格工位 + /// + /// + /// + /// + public static bool BaseData_tagTable_Engine_buhege_PartUnLoad_Select + (string EngineID, out DataTable dt) + { + string procedureName; + procedureName = "测量数据合格索引_不合格标志_查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt)) + { + if (dt != null) + { + if (dt.Rows.Count == 1) + return true; + } + return false; + } + return false; + } + + + /// + /// [测量数据合格索引_返修上线信息_查询] OP3024 b6返修上线使用 + /// + /// + /// + /// + public static bool BaseData_Repair_PartUnLoad_Select + (string EngineID, out DataTable dt) + { + string procedureName; + procedureName = "测量数据合格索引_返修上线信息_查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt)) + { + if (dt != null) + { + if (dt.Rows.Count == 1) + return true; + } + return false; + } + return false; + } + + /// + ///电子看板_发动机号_人工合格放行记录_增加数据 + /// + /// + /// + /// + public static bool OKGo_Insert + (string Opname, string EngineID, string Enginetype,string headernum, string usernum) + { + string procedureName; + procedureName = "电子看板_发动机号_人工合格放行记录_增加数据"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", Opname); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@机型", Enginetype); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@输入领班号", headernum); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@操作者编号", usernum); + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + return true; + } + return false; + } + + + + + /// + /// [显示测量数据_工位号] 王可心 2012-12-06 + /// + /// + /// + /// + public static bool BaseData_tagTable_Engine_ShowOpname + (string EngineID, int LineType,out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_工位号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@固定条形码扫描枪", LineType); + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt)) + { + if (dt != null) + { + if (dt.Rows.Count == 1) + return true; + } + return false; + } + return false; + } + /// + /// [显示测量数据_工位数据] 王可心 2012-12-06 + /// + /// + /// + /// + public static bool BaseData_tagTable_Engine_ShowOpname_Data + (string EngineID,string OpName,out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_工位数据"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt)) + { + if (dt != null) + { + if (dt.Rows.Count == 1) + return true; + } + return false; + } + return false; + } + /// + /// 显示测量数据_工位数据_分线数据 王可心 2012-12-11 + /// + /// + /// + /// + public static bool BaseData_tagTable_Engine_ShowOpname_Data_SubLine + (string EngineID, string OpName, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_工位数据_分线数据"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt)) + { + if (dt != null) + { + if (dt.Rows.Count == 1) + return true; + } + return false; + } + return false; + } + /// + /// [显示测量数据_工位号_分线] 王可心 2012-12-11 + /// + /// + /// + /// + public static bool BaseData_tagTable_Engine_ShowOpname_SubLine + (string EngineID, int LineType, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_工位号_分线"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@固定条形码扫描枪", LineType); + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt)) + { + if (dt != null) + { + if (dt.Rows.Count == 1) + return true; + } + return false; + } + return false; + } + + /// + ///[电子看板_发动机号_线首工位_分线删除数据_根据发动机号] + /// + /// + /// + public static bool BaseData_tagTable_Engine_SubLine_DataDelete(string EngineID, string OpName) + { + string procedureName; + procedureName = "电子看板_发动机号_线首工位_分线删除数据_根据发动机号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号_分线", OpName); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + //2012-12-15 王可心 + /// + /// [测量数据合格_变速器总成称重_根据发动机号_删除] + /// + /// + /// + public static bool BaseData_tagTable_QualityData_B5A_Weight_Delete + (string engineID) + { + string procedureName; + procedureName = "测量数据合格_变速器总成称重_根据发动机号_删除"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + /// + /// [测量数据合格索引_不合格标志_OP3100_查询] 用于3100工位 2012-12-21 + /// + /// 工件号 + /// + /// 合格返回true 不合格返回false + public static bool TestData_EngineRework_IsOK_Select_OP3100 + (string EngineID) + { + + int isOK_S = 1; + string procedureName; + procedureName = "测量数据合格索引_不合格标志_OP3100_查询"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@数量", isOK_S); + + thisParms[1].Direction = ParameterDirection.Output; + + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + isOK_S = Convert.ToInt32(thisParms[1].Value.ToString()); + if (isOK_S == 0) + { return true; } + else + { + return false; } + + } + return false; + } + + /// + /// 测量数据合格索引 合格标志修改-2012-12-22 王可心 应用于OP3020R + /// + /// + /// + /// 0合格;1不合格 + /// + public static bool BaseData_tagTable_QualityData_B5A_IsOK_OP3020_update + (string opName, string EngineID, int isOK) + { + string procedureName; + procedureName = "电子看板_测量数据合格索引_合格标志_返修工位_修改"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@合格标志", isOK); + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + return true; + } + return false; + } + + + /// + /// [测量数据合格索引_不合格标志_轴齿上线_查询] 王可心 2012-12-23 轴齿上线匹配时 分线工件合格标志查询 + /// + /// + /// + /// 0合格;1不合格 + /// + public static bool BaseData_tagTable_Engine_IsOK_SubLine_Select + (string EngineID, int mathType,out int CountNum) + { + CountNum = 0; + string procedureName; + procedureName = "测量数据合格索引_不合格标志_轴齿上线_查询"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@匹配方式", mathType); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@数量", CountNum); + thisParms[2].Direction = ParameterDirection.Output; + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + CountNum = Convert.ToInt32(thisParms[2].Value.ToString()); + return true; + } + return false; + } + + + /// + /// [测量数据发动机在线状态_下线工位_OP3100_查询]2012-12-30-王可心 OP3100用 下线时查看该工件以前是否进行过下线 + /// + /// 发动机号 + /// + /// 以前下线过返回true ,否则返回false + static public void BaseData_tagTable_Engine_PartUnLoad_Select_OP3100(string EngineID, out DataTable dt) + { + string procedureName; + procedureName = "测量数据发动机在线状态_下线工位_OP3100_查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + /// + ///电子看板_发动机号_线首工位_查询发动机号 王可心 2013-11-07 + /// + /// + /// + /// + public static bool EngineNum_Select(DateTime BeginTime, DateTime EndTime, out DataTable dt) + { + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询发动机号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@开始时间", BeginTime); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@结束时间", EndTime); + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt)) + { + if (dt != null) + { + if (dt.Rows.Count == 1) + return true; + } + return false; + } + return false; + } + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.QualityData/QualityData.B5A.Save.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.QualityData/QualityData.B5A.Save.cs new file mode 100644 index 0000000..fa43d5a --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.QualityData/QualityData.B5A.Save.cs @@ -0,0 +1,247 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Collections; +using System.Collections.Specialized; +//using SystemFramework; + +namespace bizFacade +{ + /// + /// 电子看板信息系统 + /// + public partial class BaseDataSystemMES + { + /// + /// 测量数据合格索引_增加 + /// 用于B5A项目 + /// ALTER PROCEDURE [dbo].[测量数据合格索引_增加] + ///@EngineID nvarchar(50)=null, + ///@TagID_CF int = null, + ///@EngineType nvarchar(50)=null, + ///@EngineTypeID int = null, + ///@工位号 nvarchar(50)=null, + ///@订单号 nvarchar(50)=null, + ///@合格标志 int=null, + ///@TagValue1 nvarchar(50)=null, + ///@TagValue2 nvarchar(50)=null, + ///@TagValue3 nvarchar(50)=null, + ///@TagValue4 nvarchar(50)=null, + ///@TagValue5 nvarchar(50)=null, + ///@TagValue6 nvarchar(50)=null, + ///@TagValue7 nvarchar(50)=null, + ///@TagValue8 nvarchar(50)=null, + ///@TagValue9 nvarchar(50)=null, + ///@TagValue10 nvarchar(50)=null, + ///@TagValue nvarchar(50)=null, + ///@Id_tagCF int=null output + /// + /// + public static bool BaseData_tagTable_QualityData_B5A_IndexInsert + (string EngineID, int tagID, string EngineType, int EngineTypeID, string opName, + int isGoodBad,string PartPalletCode, out int Id_tagCF) + { + string procedureName; + procedureName = "测量数据合格索引_增加"; + Id_tagCF = 0; + SqlParameter[] thisParms = new SqlParameter[8]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@EngineID", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@TagID_CF", tagID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineType", EngineType); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@EngineTypeID", EngineTypeID); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@托盘编号", PartPalletCode); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@合格标志", isGoodBad); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@Id_tagCF", Id_tagCF); + thisParms[7].Direction = ParameterDirection.Output; + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + Id_tagCF = Convert.ToInt32(thisParms[7].Value.ToString()); + return true; + } + return false; + } + + /// + /// alter PROCEDURE dbo.[测量数据合格_增加] + ///@Id_tagCF int = null, + ///@EngineTypeID int =null, + ///@EngineID nvarchar(100)=null, + ///@TagID int=null, + ///@TagValue nvarchar(100)=null, + ///@IsGoodBad int=null, + /// + /// + /// + /// + /// + /// + public static bool BaseData_tagTable_QualityData_B5A_Insert + (int Id_tagCF,int engineTypeID,string engineID,string opName,DataTable dt) + { + string procedureName; + procedureName = "测量数据合格_增加"; + SqlParameter[] thisParms = new SqlParameter[6]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@Id_tagCF", Id_tagCF); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@EngineTypeID", engineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineID", engineID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@TagID", SqlDbType.Int, 4, "TagID"); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@TagValue", SqlDbType.NVarChar, 100, "TagValue"); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@IsGoodBad", SqlDbType.Int, 4, "IsGoodBad"); + //thisParms[6] = new System.Data.SqlClient.SqlParameter("@测量位置", SqlDbType.NVarChar, 50, "测量位置"); + //thisParms[7] = new System.Data.SqlClient.SqlParameter("@测量项目", SqlDbType.NVarChar, 50, "测量项目"); + //thisParms[8] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + //thisParms[9] = new System.Data.SqlClient.SqlParameter("@理论值", SqlDbType.NVarChar, 50, "理论值"); + //thisParms[10] = new System.Data.SqlClient.SqlParameter("@上限值", SqlDbType.NVarChar, 50, "上限值"); + //thisParms[11] = new System.Data.SqlClient.SqlParameter("@下限值", SqlDbType.NVarChar, 50, "下限值"); + //thisParms[12] = new System.Data.SqlClient.SqlParameter("@测量单位", SqlDbType.NVarChar, 50, "测量单位"); + //thisParms[13] = new System.Data.SqlClient.SqlParameter("@列位置", SqlDbType.Int, 4, "列位置"); + //thisParms[14] = new System.Data.SqlClient.SqlParameter("@变量排序", SqlDbType.Int, 4, "变量排序"); + //table.Columns.Add("TagID", typeof(System.Int32)); + //table.Columns.Add("TagValue", typeof(System.String)); + //table.Columns.Add("IsGoodBad", typeof(System.Int32)); + //table.Columns.Add("测量位置", typeof(System.String)); + //table.Columns.Add("测量项目", typeof(System.String)); + //table.Columns.Add("工位号", typeof(System.String)); + //table.Columns.Add("理论值", typeof(System.String)); + //table.Columns.Add("上限值", typeof(System.String)); + //table.Columns.Add("下限值", typeof(System.String)); + //table.Columns.Add("测量单位", typeof(System.String)); + //table.Columns.Add("列位置", typeof(System.Int32)); + //table.Columns.Add("变量排序", typeof(System.Int32)); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, dt); + } + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool BaseData_tagTable_QualityData_B5A_Insert +(int Id_tagCF, int engineTypeID, string engineID,int tagID,string tagValue,int isGoodBad) + { + string procedureName; + procedureName = "测量数据合格_增加"; + SqlParameter[] thisParms = new SqlParameter[6]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@Id_tagCF", Id_tagCF); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@EngineTypeID", engineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineID", engineID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@TagID", tagID); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@TagValue", tagValue); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@IsGoodBad", isGoodBad); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + //2012-12-12 离线状态时 只保存合格索引 + /// + /// 测量数据合格索引_增加_工位离线状态 2012-12-26 + /// 用于B5A项目 + /// ALTER PROCEDURE [dbo].[测量数据合格索引_增加_工位离线状态] + ///@EngineID nvarchar(50)=null, + ///@TagID_CF int = null, + ///@EngineType nvarchar(50)=null, + ///@EngineTypeID int = null, + ///@工位号 nvarchar(50)=null, + ///@订单号 nvarchar(50)=null, + ///@合格标志 int=null, + ///@TagValue1 nvarchar(50)=null, + ///@TagValue2 nvarchar(50)=null, + ///@TagValue3 nvarchar(50)=null, + ///@TagValue4 nvarchar(50)=null, + ///@TagValue5 nvarchar(50)=null, + ///@TagValue6 nvarchar(50)=null, + ///@TagValue7 nvarchar(50)=null, + ///@TagValue8 nvarchar(50)=null, + ///@TagValue9 nvarchar(50)=null, + ///@TagValue10 nvarchar(50)=null, + ///@TagValue nvarchar(50)=null, + ///@Id_tagCF int=null output + /// + /// + public static bool BaseData_tagTable_QualityData_B5A_IndexInsert_OffLine + (string EngineID, int tagID, string EngineType, int EngineTypeID, string opName, + int isGoodBad, string PartPalletCode, out int Id_tagCF) + { + string procedureName; + procedureName = "测量数据合格索引_增加_工位离线状态"; + Id_tagCF = 0; + SqlParameter[] thisParms = new SqlParameter[8]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@EngineID", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@TagID_CF", tagID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineType", EngineType); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@EngineTypeID", EngineTypeID); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@托盘编号", PartPalletCode); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@合格标志", isGoodBad); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@Id_tagCF", Id_tagCF); + thisParms[7].Direction = ParameterDirection.Output; + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + Id_tagCF = Convert.ToInt32(thisParms[7].Value.ToString()); + return true; + } + return false; + } + + //2012-12-16 + /// + /// [测量数据合格索引_增加_只装配物料工位] + /// 用于B5A项目 + /// ALTER PROCEDURE [dbo].[[测量数据合格索引_增加_只装配物料工位]] + ///@EngineID nvarchar(50)=null, + ///@TagID_CF int = null, + ///@EngineType nvarchar(50)=null, + ///@EngineTypeID int = null, + ///@工位号 nvarchar(50)=null, + ///@托盘编号 nvarchar(50)=null, + ///@合格标志 int=null, + ///@TagValue1 nvarchar(50)=null, + ///@TagValue2 nvarchar(50)=null, + ///@TagValue3 nvarchar(50)=null, + ///@TagValue4 nvarchar(50)=null, + ///@TagValue5 nvarchar(50)=null, + ///@TagValue6 nvarchar(50)=null, + ///@TagValue7 nvarchar(50)=null, + ///@TagValue8 nvarchar(50)=null, + ///@TagValue9 nvarchar(50)=null, + ///@TagValue10 nvarchar(50)=null, + ///@TagValue nvarchar(50)=null, + ///@Id_tagCF int=null output + /// + /// + public static bool BaseData_tagTable_QualityData_B5A_IndexInsert_OnlyMaterial + (string EngineID, int tagID, string EngineType, int EngineTypeID, string opName, + int isGoodBad, string PartPalletCode, out int Id_tagCF) + { + string procedureName; + procedureName = "测量数据合格索引_增加_只装配物料工位"; + Id_tagCF = 0; + SqlParameter[] thisParms = new SqlParameter[8]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@EngineID", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@TagID_CF", tagID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineType", EngineType); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@EngineTypeID", EngineTypeID); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@托盘编号", PartPalletCode); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@合格标志", isGoodBad); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@Id_tagCF", Id_tagCF); + thisParms[7].Direction = ParameterDirection.Output; + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + //Id_tagCF = Convert.ToInt32(thisParms[7].Value.ToString()); + return true; + } + return false; + } + + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.QualityData/QualityData.B5A.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.QualityData/QualityData.B5A.cs new file mode 100644 index 0000000..8afc559 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.QualityData/QualityData.B5A.cs @@ -0,0 +1,162 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Collections; +using System.Collections.Specialized; +//using SystemFramework; + +namespace bizFacade +{ + /// + /// 电子看板信息系统 + /// + public partial class BaseDataSystemMES + { + /// + /// 测量数据项目 + /// 用于B5A项目 + /// + /// + public static DataTable BaseData_tagTable_QualityData_Item_B5A() + { + DataTable dt; + string sql; + sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo,变量特点,变量排序 FROM [MES_基本变量_原始数据] " + + " where (TagID <> 0 ) and " + + " ((变量类型代码 = 9) " + + " or (变量类型代码 = 10) " + + " or (变量类型代码 = 11) " + + " or (变量类型代码 = 80) " + + " or (变量类型代码 = 101) " + + " or (变量类型代码 = 102) " + + + " or (变量类型代码 = 78) " + + " or (变量类型代码 = 79) " + + " or (变量类型代码 = 41) " + + " or (变量类型代码 = 51) " + + " or (变量类型代码 = 8) " + + " or (变量类型代码 = 21) " + + + " or (变量类型代码 = 105)) " + + " and (是否启用 = 1)"; + + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + /// + /// 测量工位 + /// 变量特点=1001需要自动测量工位 + /// + /// + public static DataTable BaseData_tagTable_QualityData_OpName_B5A() + { + DataTable dt; + string sql = "SELECT distinct 工位号 as 工位代码,[工位号] FROM [MES_基本变量_原始数据] " + + " where ((变量类型代码 >= 19 and 变量类型代码 <= 24) or (变量类型代码 = 101) or (变量类型代码 = 102)) and (是否启用 = 1) and (变量特点=1001)"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + /// + /// 变量特点=1001需要自动测量工位 + /// sql = "SELECT TagID,0 as TagValue,TagName,工位号,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo " + /// + " FROM MES_基本变量_原始数据 " + /// + " where 变量类型代码 = 19 and 是否启用 = 1 and 变量特点=8 "; + /// + /// + public static DataTable BaseData_tagTable_QualityData_Read_CF_MIS_B5A() + { + DataTable dt; + string sql; + sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo,变量特点,变量排序 " + + " FROM MES_基本变量_原始数据 " + + " where 变量类型代码 = 19 and 是否启用 = 1 and (变量特点=1001 )"; + // + " and OpcServer_OPNAME='" + opName + "'"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + /// + /// 质量数据保存完数据 20 + /// + /// + public static DataTable BaseData_tagTable_QualityData_Write_CF_B5A() + { + DataTable dt; + string sql; + sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo,变量特点,变量排序 FROM [MES_基本变量_原始数据] where 变量类型代码 = 20 and 是否启用 = 1 and (变量特点=1001) "; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + /// + /// 测量数据项目 + /// 用于B5A项目 + /// + /// + public static DataTable BaseData_tagTable_QualityData_Item_B5A(string opName) + { + DataTable dt; + string sql; + sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo,变量特点,变量排序 FROM [MES_基本变量_原始数据] " + + " where (TagID <> 0 ) and " + + " ((变量类型代码 = 9) " + + " or (变量类型代码 = 10) " + + " or (变量类型代码 = 11) " + + " or (变量类型代码 = 101) " + + " or (变量类型代码 = 102) " + + " or (变量类型代码 = 105)) " + + " and (是否启用 = 1)" + + " and (工位号 = '"+opName+"')"; + + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + /// + /// 测量工位 + /// 变量特点=1001自动测量工位 + /// + /// + public static DataTable BaseData_tagTable_QualityData_OpName_B5A(string opName) + { + DataTable dt; + string sql = "SELECT distinct 工位号 as 工位代码,[工位号] FROM [MES_基本变量_原始数据] " + + " where ((变量类型代码 >= 19 and 变量类型代码 <= 24) or (变量类型代码 = 101) or (变量类型代码 = 102)) and (是否启用 = 1) " + + " and 工位号 = '" + opName+"'"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + /// + /// sql = "SELECT TagID,0 as TagValue,TagName,工位号,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo " + /// + " FROM MES_基本变量_原始数据 " + /// + " where 变量类型代码 = 19 and 是否启用 = 1 and 变量特点=8 "; + /// + /// + public static DataTable BaseData_tagTable_QualityData_Read_CF_MIS_B5A(string opName) + { + DataTable dt; + string sql; + sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo,变量特点,变量排序 " + + " FROM MES_基本变量_原始数据 " + + " where 变量类型代码 = 19 and 是否启用 = 1 " + + " and 工位号 = '" + opName + "'"; + ; + // + " and OpcServer_OPNAME='" + opName + "'"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + /// + /// 质量数据保存完数据 + /// 20 + /// + /// + public static DataTable BaseData_tagTable_QualityData_Write_CF_B5A(string opName) + { + DataTable dt; + string sql; + sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo,变量特点,变量排序 FROM [MES_基本变量_原始数据] where 变量类型代码 = 20 and 是否启用 = 1 " + + " and 工位号 = '" + opName + "'"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.QualityData/vssver2.scc b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.QualityData/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..422e5eb0df1836fcfc2d82522043cfbbec6cbad4 GIT binary patch literal 198 zcmXpJVq~~_m%l5bInsUAj6{**Nns+ZVrq}tGBGePGcYjN0cr1_!R9x1eb;9M^6i2A zubI{_ISjsm`3^w-J;`h_iFgQKMc>ymxI8rpMmd!hXXd3A7rP}UC#Iz8`??0}Ihi`@ l1(qh}WR_IAB$gyHAhE%6$;B8#0g1`kdRWAR6U$OT;s7#DJy-w$ literal 0 HcmV?d00001 diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/OpNameCount.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/OpNameCount.cs new file mode 100644 index 0000000..db84766 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/OpNameCount.cs @@ -0,0 +1,40 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Collections; +using System.Collections.Specialized; +//using SystemFramework; + +namespace bizFacade +{ + /// + /// 电子看板信息系统 + /// + public partial class BaseDataSystemMES + { + /// + /// 计算工位产量 + /// + /// @班次代码 + /// @工位节拍 + /// @当前时间 + /// @工位产量 + static public void OpNameCount(int shiftCode,int opNameTime,DateTime currentTime,out int opNameCount) + { + //exec 电子看板_工作时间与班次_工作时间 1,45,'2011-11-30 13:11:00', @工位产量 out + opNameCount = 0; + string procedureName; + procedureName = "电子看板_工作时间与班次_工作时间"; + SqlParameter[] thisParmsSql = new SqlParameter[4]; + thisParmsSql[0] = new SqlParameter("@班次代码", shiftCode); + thisParmsSql[1] = new SqlParameter("@工位节拍", opNameTime); + thisParmsSql[2] = new SqlParameter("@当前时间", currentTime); + thisParmsSql[3] = new SqlParameter("@工位产量", opNameCount); + thisParmsSql[3].Direction = ParameterDirection.Output; + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParmsSql); + + opNameCount = Convert.ToInt32(thisParmsSql[3].Value); + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/OpNameRepair.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/OpNameRepair.cs new file mode 100644 index 0000000..8003493 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/OpNameRepair.cs @@ -0,0 +1,33 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Collections; +using System.Collections.Specialized; +//using SystemFramework; + +namespace bizFacade +{ + /// + /// + /// + public partial class BaseDataSystemMES + { + /// + /// 测量数据合格_返修工位_查询 + /// + /// + /// + /// + static public void GetOpNameRepairData(string engineID,string opName,out DataTable dt) + { + string procedureName; + procedureName = "测量数据合格_返修工位_查询"; + SqlParameter[] thisParmsSql = new SqlParameter[2]; + thisParmsSql[0] = new SqlParameter("@EngineID", engineID); + thisParmsSql[1] = new SqlParameter("@工位号", opName); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParmsSql, out dt); + + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/ShaftPosition.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/ShaftPosition.cs new file mode 100644 index 0000000..e74de5e --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/ShaftPosition.cs @@ -0,0 +1,203 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Collections; +using System.Collections.Specialized; +//using SystemFramework; + +namespace bizFacade +{ + /// + /// 电子看板信息系统 + /// + public partial class ShaftPosition + { + /// + /// 电子看板_工位机型_质量数据测量位置_查询_工作顺序 + /// + /// + /// + /// + static public void ShaftPosition_Select_WorkingStep(string opName, int engineTypeID, out DataTable dt) + { + dt = null; + + string sql = "exec 电子看板_工位机型_质量数据测量位置_查询_工作顺序 '" + opName + "'," + engineTypeID.ToString(); + DataAccess.ExecuteDataTable(sql, out dt); + } + + /// + /// 电子看板_工位机型_质量数据测量位置_查询 + /// + /// 工位号 + /// 产品型号代码 + /// + static public void ShaftPosition_Select(string opName,int engineTypeID,out DataTable dt) + { + dt = null; + + string sql = "exec 电子看板_工位机型_质量数据测量位置_查询 '" + opName + "'," + engineTypeID.ToString(); + DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// 电子看板_装配零件_查询 + /// + /// 工位号 + /// 产品型号代码 + /// 产品型号代码 + /// + static public void Material_Select(string opName, string engineTypeID, string engineType, out DataTable dt) + { + dt = null; + string sql = "exec 电子看板_装配零件_查询 '" + opName + "'," + engineTypeID.ToString() + ",'" + engineType + "'"; ; + DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// 电子看板_装配零件_查询 + /// + /// 工位号 + /// 产品型号代码 + /// + static public void Material_Select_1(string opName, int engineTypeID, out DataTable dt) + { + dt = null; + + string sql = "exec 电子看板_装配零件_查询 '" + opName + "'," + engineTypeID.ToString() ; + DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// 电子看板_工序内容_查询 + /// + /// 工位号 + /// 产品型号代码 + /// + static public void Process_Select(string opName, int engineTypeID, out DataTable dt) + { + dt = null; + + string sql = "exec 电子看板_工序内容_查询 '" + opName + "'," + engineTypeID.ToString(); + DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// 电子看板_工序内容_查询 + /// + /// 工位号 + /// 产品型号代码 + /// + static public void Process_Select_NeedDealWith(string opName, int engineTypeID, out DataTable dt) + { + dt = null; + + string sql = "exec 电子看板_工序内容_查询_需要处理 '" + opName + "'," + engineTypeID.ToString(); + DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// MES_基本变量_机型代码_查询 + /// + /// + static public void EngineType_Select(out DataTable dt) + { + dt = null; + string sql = "exec MES_基本变量_机型代码_查询"; + DataAccess.ExecuteDataTable(sql, out dt); + } + + /// + /// 电子看板_MES_基本变量_原始数据_更新测量数据 + /// + /// + /// + /// + /// + /// + /// + /// + static public void ShaftDataUpdate(string opName, string engineTypeID, string shaftNo, string value1, string value2, string value3, string value4) + { + + string sql = "exec 电子看板_MES_基本变量_原始数据_更新测量数据 "; + sql = sql + " '" + opName + "',"; + sql = sql + " '" + engineTypeID + "',"; + sql = sql + " " + shaftNo.ToString() + ","; + sql = sql + " '" + value1 + "',"; + sql = sql + " '" + value2 + "',"; + sql = sql + " '" + value3 + "',"; + sql = sql + " " + value4.ToString() +""; + DataAccess.ExecuteSQL(sql); + } + /// + /// 电子看板_MES_基本变量_原始数据_清零测量数据 + /// + /// + static public void ShaftDataClear(string opName) + { + + string sql = "exec 电子看板_MES_基本变量_原始数据_更新测量数据 "; + sql = sql + " '" + opName + "'"; + DataAccess.ExecuteSQL(sql); + } + + /// + /// 电子看板_MES_基本变量_原始数据_增加测量数据 + /// + /// + /// + /// + /// + /// + /// + static public void ShaftDataInsert(string opName, string engineID, string engineType, string engineTypeID, + string isGood, string dateTime) + { + + string sql = "exec 电子看板_MES_基本变量_原始数据_增加测量数据 "; + sql = sql + " '" + opName + "',"; + sql = sql + " '" + engineID + "',"; + sql = sql + " '" + engineType + "',"; + sql = sql + " " + engineTypeID + ","; + sql = sql + " " + isGood + ","; + sql = sql + " '" + dateTime + "'"; + DataAccess.ExecuteSQL(sql); + } + + + /// + /// [电子看板_工位机型_质量数据测量位置_查询_OP3010] 2012-12-13 + /// + /// 工位号 + /// 产品型号代码 + /// + static public void ShaftPosition_Select_OP3010(string opName, int engineTypeID,int IsUsing ,out DataTable dt) + { + dt = null; + + string sql = "exec 电子看板_工位机型_质量数据测量位置_查询_OP3010 '" + opName + "','" + engineTypeID.ToString() + "','" + IsUsing+ "'"; + DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// [电子看板_工位机型_质量数据测量位置_查询_工作顺序_OP3010] 2012-12-13 + /// + /// + /// + /// + static public void ShaftPosition_Select_WorkingStep_OP3010(string opName, int engineTypeID,int IsUsing, out DataTable dt) + { + dt = null; + string sql = "exec 电子看板_工位机型_质量数据测量位置_查询_工作顺序_OP3010 '" + opName + "','" + engineTypeID.ToString() + "','" + IsUsing + "'"; + DataAccess.ExecuteDataTable(sql, out dt); + } + + + /// + /// [MES_操作者_用户_显示_查询] 2013-01-23 王可心 用户名增加用 + /// + /// + static public void UserName_Select(out DataTable dt) + { + dt = null; + string sql = "exec MES_操作者_用户_显示_查询 "; + DataAccess.ExecuteDataTable(sql, out dt); + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/ShaftPositionData.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/ShaftPositionData.cs new file mode 100644 index 0000000..4e86e08 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/ShaftPositionData.cs @@ -0,0 +1,199 @@ +using System; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Collections; +using System.Collections.Specialized; +//using SystemFramework; + +namespace bizFacade +{ + /// + /// 电子看板信息系统 + /// + public partial class ShaftPosition + { + /// + /// 测量数据合格_电子看板_质量数据_临时表_增加_返修工位 + /// @EngineID nvarchar(50)=null, + /// @EngineType nvarchar(50)=null, + /// @EngineTypeID int = null, + /// @工位号 nvarchar(50)=null, + /// @工位号返修工位 nvarchar(50)=null, + /// @订单号 nvarchar(50)=null, + /// @合格标志 int + /// + /// 工件号 + /// 机型 + /// 机型代码 + /// 工位号(被返修的工位号) + /// 工位号返修工位 + /// 订单号 + /// 合格标志 + static public void ShaftPosition_Data_OpNameRepair_Insert(string engineID, string engineType, int engineTypeID, string opName, string opNameRepair,string orderForm, int isOK) + { + string procedureName; + procedureName = "测量数据合格_电子看板_质量数据_临时表_增加_返修工位"; + SqlParameter[] thisParmsSql = new SqlParameter[7]; + thisParmsSql[0] = new SqlParameter("@EngineID", engineID); + thisParmsSql[1] = new SqlParameter("@EngineType", engineType); + thisParmsSql[2] = new SqlParameter("@EngineTypeID", engineTypeID); + thisParmsSql[3] = new SqlParameter("@工位号", opName); + thisParmsSql[4] = new SqlParameter("@工位号返修工位", opNameRepair); + thisParmsSql[5] = new SqlParameter("@订单号", orderForm); + thisParmsSql[6] = new SqlParameter("@合格标志", isOK); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParmsSql); + } + /// + /// 测量数据合格_电子看板_质量数据_临时表_增加 + /// @EngineID nvarchar(50)=null, + /// @EngineType nvarchar(50)=null, + /// @EngineTypeID int = null, + /// @工位号 nvarchar(50)=null, + /// @订单号 nvarchar(50)=null, + /// @合格标志 int + /// + /// 工件号 + /// 机型 + /// 机型代码 + /// 工位号 + /// 订单号 + /// 合格标志 + static public void ShaftPosition_Data_Insert(string engineID, string engineType, int engineTypeID, string opName, string orderForm, int isOK) + { + string procedureName; + procedureName = "测量数据合格_电子看板_质量数据_临时表_增加"; + SqlParameter[] thisParmsSql = new SqlParameter[6]; + thisParmsSql[0] = new SqlParameter("@EngineID", engineID); + thisParmsSql[1] = new SqlParameter("@EngineType", engineType); + thisParmsSql[2] = new SqlParameter("@EngineTypeID", engineTypeID); + thisParmsSql[3] = new SqlParameter("@工位号", opName); + thisParmsSql[4] = new SqlParameter("@订单号", orderForm); + thisParmsSql[5] = new SqlParameter("@合格标志", isOK); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParmsSql); + } + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + static public void ShaftPosition_Data_Insert_RepairOpName(string opName, int shaftStep, string engineID, string engineType, int engineTypeID, int orderBy, string tagValue, int isOK) + { + string procedureName; + procedureName = "电子看板_质量数据_临时表_增加_备用拧紧工位"; + SqlParameter[] thisParmsSql = new SqlParameter[8]; + thisParmsSql[0] = new SqlParameter("@工位号", opName); + thisParmsSql[1] = new SqlParameter("@序号", shaftStep); + thisParmsSql[2] = new SqlParameter("@EngineID", engineID); + thisParmsSql[3] = new SqlParameter("@EngineType", engineType); + thisParmsSql[4] = new SqlParameter("@EngineTypeID", engineTypeID); + thisParmsSql[5] = new SqlParameter("@变量排序", orderBy); + thisParmsSql[6] = new SqlParameter("@测量值", tagValue); + thisParmsSql[7] = new SqlParameter("@合格标志", isOK); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParmsSql); + } + /// + /// 电子看板_质量数据_临时表_增加 + /// + /// 工位号 + /// 序号 + /// 工件号 + /// 机型 + /// 机型代码 + /// 变量代码 + /// 变量值 + /// 合格标志 + static public void ShaftPosition_Data_Insert(string opName,int shaftStep, string engineID,string engineType, int engineTypeID, int tagID,string tagValue, int isOK) + { + string procedureName; + procedureName = "电子看板_质量数据_临时表_增加"; + SqlParameter[] thisParmsSql = new SqlParameter[8]; + thisParmsSql[0] = new SqlParameter("@工位号", opName); + thisParmsSql[1] = new SqlParameter("@序号", shaftStep); + thisParmsSql[2] = new SqlParameter("@EngineID", engineID); + thisParmsSql[3] = new SqlParameter("@EngineType", engineType); + thisParmsSql[4] = new SqlParameter("@EngineTypeID", engineTypeID); + thisParmsSql[5] = new SqlParameter("@TagID", tagID); + thisParmsSql[6] = new SqlParameter("@测量值", tagValue); + thisParmsSql[7] = new SqlParameter("@合格标志", isOK); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParmsSql); + } + /// + /// 电子看板_质量数据_临时表_增加 + /// + /// 工位号 + /// 序号 + /// 工件号 + /// 机型 + /// 机型代码 + /// 变量代码 + /// 变量值 + /// 合格标志 + //static public void ShaftPosition_Data_Insert_Access(string opName, int shaftStep, string engineID, string engineType, + // int engineTypeID, int tagID, string tagValue, int isOK) + //{ + // string sql; + // string sql_Delete; + // sql = "insert into 电子看板_质量数据_临时表(EngineID,EngineType,EngineTypeID,工位号,TagID,测量值,合格标志) "; + // sql = sql+" values("; + // sql = sql + "'" + engineID + "',"; + // sql = sql + "'" + engineType + "',"; + // sql = sql + "" + engineTypeID.ToString() + ","; + // sql = sql + "'" + opName + "',"; + // sql = sql + "" + tagID.ToString() + ","; + // sql = sql + "'" + tagValue + "',"; + // sql = sql + "" + isOK.ToString() + ")"; + + // sql_Delete = "delete from 电子看板_质量数据_临时表"; + // sql_Delete = sql_Delete + " where tagID=" + tagID.ToString(); + // DataAccess.ExecuteSQL_OleDb_Access(sql_Delete); + // DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// 查询[电子看板_质量数据_临时表]数据 + /// + /// 工位号 + /// 合格标志 + //static public void ShaftPosition_Data_Select_Access(string opName, out DataTable dt) + //{ + // string sql; + // sql = "select EngineID,EngineType,EngineTypeID,工位号,TagID,测量值 as TagValue,合格标志 as IsGoodBad"; + // sql=sql+" from 电子看板_质量数据_临时表 "; + // sql = sql+" where 工位号='"+opName+"'"; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + /// + /// 删除[电子看板_质量数据_临时表]数据 + /// + /// 工位号 + //static public void ShaftPosition_Data_Delete_Access(string opName) + //{ + // string sql; + // sql = "delete from 电子看板_质量数据_临时表 "; + // sql = sql + " where 工位号='" + opName + "'"; + // DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// 电子看板_质量数据_临时表_删除 + /// + /// 工位号 + /// 列位置 + /// EngineID + static public void ShaftPosition_Data_Delete(string opName, int shaftStep, string engineID) + { + string procedureName; + procedureName = "电子看板_质量数据_临时表_删除"; + SqlParameter[] thisParmsSql = new SqlParameter[3]; + thisParmsSql[0] = new SqlParameter("@工位号", opName); + thisParmsSql[1] = new SqlParameter("@列位置", shaftStep); + thisParmsSql[2] = new SqlParameter("@EngineID", engineID); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParmsSql); + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/vssver2.scc b/Common/07WebBusinessFacade/BusinessFacade/MES.B5A.ShaftPosition/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..ec4119fd46f4fa7a653542f957d564d6d8fe2ab7 GIT binary patch literal 218 zcmXpJVq~~_m%l5bInsUAj6{**Nns-IgyNSvGBGf)FfcGU0qF&7{nIPfe$!_J@|}VF zz+L>8J2Jk4`7S{IlL9sK6;cqsD@dMk!;~G45Wb4OuV-+1Y7&fcDlN{;OD!&TOH58o zN!9mt4c2oqb<_*aNK7jU$S=+;$;{7V@GtO7%uRL9FU>2_OD=|TgHj6;GmAic6vY?< KE{P?HAVC1bDn$4I literal 0 HcmV?d00001 diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/MES.Biz.TraceTable.Cap.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/MES.Biz.TraceTable.Cap.cs new file mode 100644 index 0000000..a0df331 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/MES.Biz.TraceTable.Cap.cs @@ -0,0 +1,60 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Data.OleDb; + +//using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + ///// + ///// MES_装配数据_发动机号_追踪代码 + ///// 追踪代码 SqlServer和Access + ///// + ///// + ///// + ///// + ///// + //public static bool TraceTable_Select_SqlServerAndAccess(string traceCode, string opName, out DataTable dt) + //{ + // string sql; + // sql = "SELECT top 1 * FROM MES_装配数据_发动机号_追踪代码 " + // + " WHERE 追踪代码 = '" + traceCode + "' and 工位号='" + opName + "' order by 操作时间 desc "; + // if (!SQLCommon.SqlServerConnectionStatus) + // { + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + // } + // else + // { + // return DataAccess.ExecuteDataTable(sql, out dt); + // } + //} + /// + /// MES_装配数据_发动机号_追踪代码 + /// 追踪代码 SqlServer和Access + /// + /// + /// + /// + public static bool TraceTable_Select_SqlServerAndAccess(string traceCode, out DataTable dt) + { + string sql; + sql = "SELECT top 1 * FROM MES_装配数据_发动机号_追踪代码 " + + " WHERE 追踪代码 = '" + traceCode + "' order by 操作时间 desc "; + //if (!SQLCommon.SqlServerConnectionStatus) + //{ + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + //else + { + return DataAccess.ExecuteDataTable(sql, out dt); + } + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/MES.Biz.TraceTable.Cylinder.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/MES.Biz.TraceTable.Cylinder.cs new file mode 100644 index 0000000..c541e81 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/MES.Biz.TraceTable.Cylinder.cs @@ -0,0 +1,388 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Data.OleDb; + +//using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + /// + /// 检测表 [MES_装配数据_发动机号_追踪代码] 中的扫描挂牌码[追踪代码]是否存在 + /// 不存在 返回 true 否则返回 false + ///分线活塞连杆上线工位流程:(活塞连杆OP3800)MachineType=“S”, + ///ScannerType = “1”,OpType=“F103”。每个发动机装配六个活塞连杆。 + ///六个活塞连杆分别放在三个连续的活塞连杆托盘上,每个托盘放两个活塞连杆, + ///每个工位完成一个托盘两个活塞连杆的安装。 + ///三个连续的活塞连杆托盘上的描挂牌码(物料追踪号[追踪代码])相同。 + ///活塞连杆上托盘: + ///1:PLC向MES发送工件到位,开始扫描信号。WorkStart=1 + ///2:扫描挂牌码(物料追踪号[追踪代码]) + ///3:检测表 [MES_装配数据_发动机号_追踪代码] 中的扫描挂牌码[追踪代码]是否存在(是否禁用 + ///3 and追踪代码 = ‘’)。 + ///3.1:如果不存在或存在并且验证完成(是否禁用=3), + ///显示当前生产计划对应的活塞连杆信息(物料表和需要验证的物料表); + ///保存[追踪代码]和[追踪标识](追踪标识=HL+时间标签) + ///到表[MES_装配数据_发动机号_追踪代码]中。[追踪标识]对应表[MES_装配数据_发动机号_追踪代码]的 + ///[发动机号]字段。MES向PLC写入发动机号、机型、机型标志、追踪代码; + ///MES向PLC写入MES激发变量扫描完成,EngineGetOver=1 + ///3.2:如果存在并且验证完成(是否禁用3),使用[MES_装配数据_发动机号_追踪代码], + ///显示扫描挂牌码对应的活塞连杆信息(物料表和需要验证的物料表)。 + ///MES向PLC写入发动机号、机型、机型标志、追踪代码; + ///MES向PLC写入MES激发变量扫描完成,EngineGetOver=1 + ///3.3:如果物料验证完成,追踪代码对应的[是否禁用]=3 + ///(每验证完成一个托盘对应活塞连杆物料增加1)。 + ///3.4:显示每一个托盘对应的验证物料。 + ///4物料验证:每验证完成一个托盘对应活塞连杆物料,如果没有全部完成验证, + ///MaterialVerifyOver=1,不清空表[MES_装配数据_零部件追溯_临时状态]。 + ///PLC向MES发送工件离开信号WorkStart=0,保存数据到信息管理系统, + ///完成工件当日计数和工作开始时间和结束时间。 + ///5:如果全部完成验证,MaterialVerifyOver=1,清空表[MES_装配数据_零部件追溯_临时状态]。 + ///每验证完成一个托盘对应活塞连杆物料,追踪代码对应的[是否禁用]增加1, + ///作为活塞连杆分组验证标识。每验证一个物料,保存数据到表[MES_装配数据_零部件追溯_数据主表] + ///和[MES_装配数据_零部件追溯],发动机号=追踪标识。PLC向MES发送工件离开信号WorkStart=0, + ///保存数据到信息管理系统,完成工件当日计数和工作开始时间和结束时间。 + ///6:通过OpNameMainLine(总线活塞连杆上线工位)工位数据表和本工位的装配指南, + ///获得当前工位的装配指南,订单号、机型、机型标志。 + ///7:显示活塞连杆订单号、活塞连杆、机型、机型标志 + ///-1 不合理 + ///0 没记录 + ///1 验证完成第一组 + ///2 验证完成第二组 + ///3 验证完成第三组 + /// + //public static int TraceTableCheck_F3_New(string opName, string TraceCode) + //{ + // DataTable dt; + // int isFalse; + // string sql; + // //存在,并且没有验证完成条件 + // sql = "SELECT top 1 是否禁用 FROM [MES_装配数据_发动机号_追踪代码] " + // + " where (追踪代码='" + TraceCode + "'" + // + " and 工位号='" + opName + "')" + // +" order by 操作时间 desc "; + // //if (!SQLCommon.SqlServerConnectionStatus) + // //{ + // // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + // //} + // //else + // { + // DataAccess.ExecuteDataTable(sql, out dt); + + // } + // if (dt == null) + // { + // //读[MES_装配数据_发动机号_追踪代码]数据失败 + // isFalse = -1; + // } + // if (dt.Rows.Count > 0) + // { + // isFalse = Convert.ToInt32(dt.Rows[0]["是否禁用"]); + // } + // else + // { + // isFalse = 0; + // } + + // return isFalse; + + //} + ///// + ///// 检测表 [MES_装配数据_发动机号_追踪代码] 中的扫描挂牌码[追踪代码]是否存在 + ///// 不存在 返回 true 否则返回 false + /////分线活塞连杆上线工位流程:(活塞连杆OP3800)MachineType=“S”, + /////ScannerType = “1”,OpType=“F103”。每个发动机装配六个活塞连杆。 + /////六个活塞连杆分别放在三个连续的活塞连杆托盘上,每个托盘放两个活塞连杆, + /////每个工位完成一个托盘两个活塞连杆的安装。 + /////三个连续的活塞连杆托盘上的描挂牌码(物料追踪号[追踪代码])相同。 + /////活塞连杆上托盘: + /////1:PLC向MES发送工件到位,开始扫描信号。WorkStart=1 + /////2:扫描挂牌码(物料追踪号[追踪代码]) + /////3:检测表 [MES_装配数据_发动机号_追踪代码] 中的扫描挂牌码[追踪代码]是否存在(是否禁用 + /////3 and追踪代码 = ‘’)。 + /////3.1:如果不存在或存在并且验证完成(是否禁用=3), + /////显示当前生产计划对应的活塞连杆信息(物料表和需要验证的物料表); + /////保存[追踪代码]和[追踪标识](追踪标识=HL+时间标签) + /////到表[MES_装配数据_发动机号_追踪代码]中。[追踪标识]对应表[MES_装配数据_发动机号_追踪代码]的 + /////[发动机号]字段。MES向PLC写入发动机号、机型、机型标志、追踪代码; + /////MES向PLC写入MES激发变量扫描完成,EngineGetOver=1 + /////3.2:如果存在并且验证完成(是否禁用3),使用[MES_装配数据_发动机号_追踪代码], + /////显示扫描挂牌码对应的活塞连杆信息(物料表和需要验证的物料表)。 + /////MES向PLC写入发动机号、机型、机型标志、追踪代码; + /////MES向PLC写入MES激发变量扫描完成,EngineGetOver=1 + /////3.3:如果物料验证完成,追踪代码对应的[是否禁用]=3 + /////(每验证完成一个托盘对应活塞连杆物料增加1)。 + /////3.4:显示每一个托盘对应的验证物料。 + /////4物料验证:每验证完成一个托盘对应活塞连杆物料,如果没有全部完成验证, + /////MaterialVerifyOver=1,不清空表[MES_装配数据_零部件追溯_临时状态]。 + /////PLC向MES发送工件离开信号WorkStart=0,保存数据到信息管理系统, + /////完成工件当日计数和工作开始时间和结束时间。 + /////5:如果全部完成验证,MaterialVerifyOver=1,清空表[MES_装配数据_零部件追溯_临时状态]。 + /////每验证完成一个托盘对应活塞连杆物料,追踪代码对应的[是否禁用]增加1, + /////作为活塞连杆分组验证标识。每验证一个物料,保存数据到表[MES_装配数据_零部件追溯_数据主表] + /////和[MES_装配数据_零部件追溯],发动机号=追踪标识。PLC向MES发送工件离开信号WorkStart=0, + /////保存数据到信息管理系统,完成工件当日计数和工作开始时间和结束时间。 + /////6:通过OpNameMainLine(总线活塞连杆上线工位)工位数据表和本工位的装配指南, + /////获得当前工位的装配指南,订单号、机型、机型标志。 + /////7:显示活塞连杆订单号、活塞连杆、机型、机型标志 + /////-1 不合理 + /////0 没记录 + /////1 验证完成第一组 + /////2 验证完成第二组 + /////3 验证完成第三组 + ///// + //public static int TraceTableCheck_F3(string opName, string TraceCode) + //{ + // DataTable dt; + // int isFalse; + // string sql; + // //存在,并且没有验证完成条件 + // sql = "SELECT top 1 是否禁用 FROM [MES_装配数据_发动机号_追踪代码] " + // + " where (追踪代码='" + TraceCode + "'" + // + " and 工位号='" + opName + "')" + // +" order by 操作时间 desc "; + // //if (!SQLCommon.SqlServerConnectionStatus) + // //{ + // // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + // //} + // //else + // { + // DataAccess.ExecuteDataTable(sql, out dt); + + // } + // if (dt == null) + // { + // //读[MES_装配数据_发动机号_追踪代码]数据失败 + // isFalse = -1; + // } + // if (dt.Rows.Count > 0) + // { + // isFalse = Convert.ToInt32(dt.Rows[0]["是否禁用"]); + // } + // else + // { + // isFalse = 0; + // } + + // return isFalse; + + //} + ///// + ///// 用于:活塞连杆上线 + ///// 活塞连杆分三组,验证完成一组(包括将验证的物料保存以后), + ///// [MES_装配数据_发动机号_追踪代码] 表中的字段“是否禁用”=1; + ///// 验证完成二组(包括将验证的物料保存以后), + ///// [MES_装配数据_发动机号_追踪代码] 表中的字段“是否禁用”=2; + ///// 验证完成三组(包括将验证的物料保存以后), + ///// [MES_装配数据_发动机号_追踪代码] 表中的字段“是否禁用”=3。 + ///// 当第三组验证完成后,表[MES_计划BOM_发动机号]的字段“是否装配代码”=1, + ///// 表示已经完成一个发动机的活塞连杆装配。 + ///// + ///// + ///// + ///// + ///// + //public static int TraceTableCheck(string opName, string TraceCode, string strConnectionstring) + //{ + // DataTable dt; + // int isFalse; + // string sql; + // //存在,并且没有验证完成条件 + // sql = "SELECT 是否禁用 FROM [MES_装配数据_发动机号_追踪代码] " + // + " where (追踪代码='" + TraceCode + "'" + // + " and 工位号='" + opName + "')"; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, strConnectionstring, out dt); + // if (dt == null) + // { + // isFalse = -1; + // } + // if (dt.Rows.Count > 0) + // { + // isFalse = Convert.ToInt32(dt.Rows[0]["是否禁用"]); + // } + // else + // { + // isFalse = -1; + // } + + // return isFalse; + + //} + ///// + ///// 用于:活塞连杆上线 + ///// 活塞连杆分三组,验证完成一组(包括将验证的物料保存以后), + ///// [MES_装配数据_发动机号_追踪代码] 表中的字段“是否禁用”=1; + ///// 验证完成二组(包括将验证的物料保存以后), + ///// [MES_装配数据_发动机号_追踪代码] 表中的字段“是否禁用”=2; + ///// 验证完成三组(包括将验证的物料保存以后), + ///// [MES_装配数据_发动机号_追踪代码] 表中的字段“是否禁用”=3。 + ///// 当第三组验证完成后,表[MES_计划BOM_发动机号]的字段“是否装配代码”=1, + ///// 表示已经完成一个发动机的活塞连杆装配。 + ///// + ///// + ///// + ///// + //public static int TraceTableCheck(string opName, string TraceCode) + //{ + // DataTable dt; + // int isFalse; + // string sql; + // //存在,并且没有验证完成条件 + // sql = "SELECT 是否禁用 FROM [MES_装配数据_发动机号_追踪代码] " + // + " where (追踪代码='" + TraceCode + "'" + // + " and 工位号='" + opName + "')"; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + // if (dt == null) + // { + // isFalse = -1; + // } + // if (dt.Rows.Count > 0) + // { + // isFalse = Convert.ToInt32(dt.Rows[0]["是否禁用"]); + // } + // else + // { + // isFalse = -1; + // } + + // return isFalse; + + //} + ///// + ///// 更新活塞连杆验证状态(是否禁用加"1") + ///// 是否禁用 =0 开始验证新的活塞连杆 + ///// =1第一组验证完成 + ///// =2第二组验证完成 + ///// =3第三组验证完成 + ///// 6.5 活塞连杆分三组,验证完成一组(包括将验证的物料保存以后), + ///// [MES_装配数据_发动机号_追踪代码] 表中的字段“是否禁用”=1; + ///// 验证完成二组(包括将验证的物料保存以后), + ///// [MES_装配数据_发动机号_追踪代码] 表中的字段“是否禁用”=2; + ///// 验证完成三组(包括将验证的物料保存以后), + ///// [MES_装配数据_发动机号_追踪代码] 表中的字段“是否禁用”=3。 + ///// 当第三组验证完成后, + ///// 表[MES_计划BOM_发动机号]的字段“是否装配代码”=1, + ///// 表示已经完成一个发动机的活塞连杆装配。 + ///// + ///// + ///// + ///// + ///// + //public static bool TraceTableUpdate_AddOne_F3(string opName, string TraceCode, string EngineID) + //{ + // string sql; + // DataTable dt; + // int count; + // sql = "SELECT top 1 是否禁用 FROM [MES_装配数据_发动机号_追踪代码] " + // + " where (追踪代码='" + TraceCode + "'" + // + " and 工位号='" + opName + "')" + // + " order by 操作时间 desc "; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + // if (dt == null) return false; + // if (dt.Rows.Count > 0) + // { + // count = Convert.ToInt32(dt.Rows[0]["是否禁用"]); + // } + // else + // { + // count = 0; + // } + // count = count + 1; + // sql = "UPDATE [MES_装配数据_发动机号_追踪代码] " + // + " SET 是否禁用=" + count.ToString() + // + " where (追踪代码='" + TraceCode + "'" + // + " and 工位号='" + opName + "')"; + // //[MES_计划BOM_发动机号]的字段“是否装配代码”=1, + // if (count == 3) + // { + // try + // { + // BaseDataSystemMES.BaseData_tagTable_EngineID_UpDate(EngineID); + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "更新活塞连杆验证状态"); + // } + // } + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + ///// + ///// 更新活塞连杆验证状态 + ///// 是否禁用 =0 开始验证新的活塞连杆 + ///// =1第一组验证完成 + ///// =2第二组验证完成 + ///// =3第三组验证完成 + ///// + ///// + ///// + ///// + ///// + //public static bool TraceTableUpdate_F3_New(string opName, string TraceCode, int isFalse) + //{ + // string sql; + // sql = "UPDATE [MES_装配数据_发动机号_追踪代码] " + // + " SET 是否禁用=" + isFalse.ToString() + // + " where ( 是否禁用<=2 and 追踪代码='" + TraceCode + "'" + // + " and 工位号='" + opName + "')"; + // //if (!SQLCommon.SqlServerConnectionStatus) + // //{ + // // return DataAccess.ExecuteSQL_OleDb_Access(sql); + // //} + // //else + // { + // return DataAccess.ExecuteSQL(sql); + + // } + //} + ///// + ///// 更新活塞连杆验证状态 + ///// 是否禁用 =0 开始验证新的活塞连杆 + ///// =1第一组验证完成 + ///// =2第二组验证完成 + ///// =3第三组验证完成 + ///// + ///// + ///// + ///// + ///// + //public static bool TraceTableUpdate_F3(string opName, string TraceCode, int isFalse) + //{ + // string sql; + // sql = "UPDATE [MES_装配数据_发动机号_追踪代码] " + // + " SET 是否禁用=" + isFalse.ToString() + // + " where (追踪代码='" + TraceCode + "'" + // + " and 工位号='" + opName + "')"; + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + ///// + ///// 线首,用于物料追踪 + ///// (3.2.2.1)如果表[MES_装配数据_发动机号_追踪代码]中 + ///// 不存在字段“是否禁用” 小于“3”的记录, + ///// 说明活塞连杆工位已经全部验证完成, + ///// 开始全新验证流程。同(2)基本流程。 + ///// + ///// + //public static bool TableTraceSelectIsFalse() + //{ + // DataTable dt; + // string sql = null; + // sql = "SELECT * FROM MES_装配数据_发动机号_追踪代码 WHERE 是否禁用 < 3"; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + // if (dt == null) + // { + // return true; + // } + // if (dt.Rows.Count == 0) + // { + // return true; + // } + // return false; + //} + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/MES.Biz.TraceTable.ToOpName.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/MES.Biz.TraceTable.ToOpName.cs new file mode 100644 index 0000000..390c0df --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/MES.Biz.TraceTable.ToOpName.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using System.Data.OleDb; +using DataLinkMesWork; + +//using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + /// + /// + /// + /// + /// + /// + //public static void GetOpNameByLineType(string lineType,string transferLineType, DataTable dt) + //{ + // dt = null; + // string sql; + // sql = "SELECT * FROM MES_计划BOM_工位与名称 WHERE PC=1 " + // + " AND 线体类型 ='"+transferLineType+"'"; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + + //} + /// + /// 获得上线工位对应线体类型的工位文件列表 + /// + /// + /// + //public static void GetFileNameListByOpName(string opName, out string[] fileNameList) + //{ + // string transferLineType; + // fileNameList = null; + // DataTable dt = null; + // string sql; + // sql = "SELECT 线体类型 FROM MES_计划BOM_工位与名称 WHERE 工位号='" + opName + "'"; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // transferLineType = dt.Rows[0]["线体类型"].ToString(); + // sql = "SELECT 文件名称 FROM MES_计划BOM_工位与名称 WHERE 线体类型 ='" + transferLineType + "'" + // + " AND 工位号<>'" + opName+"'"; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // fileNameList = new string[dt.Rows.Count]; + // for (int i = 0; i < dt.Rows.Count; i++) + // { + // fileNameList[i] = dt.Rows[i]["文件名称"].ToString(); + // } + // } + // } + // } + // } + //} + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/MES.Biz.TraceTable.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/MES.Biz.TraceTable.cs new file mode 100644 index 0000000..4cb2664 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/MES.Biz.TraceTable.cs @@ -0,0 +1,817 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Data.OleDb; + +//using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + + /// + /// 删除[追踪代码] + /// + /// + /// + /// + //public static bool TraceTableDelete(string opName, string TraceCode) + //{ + // string sql; + // sql = "DELETE FROM [MES_装配数据_发动机号_追踪代码] " + // + " where (追踪代码='" + TraceCode + "'" + // + " and 工位号='" + opName + "')"; + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// MES_装配数据_发动机号_追踪代码 + /// 订单号 + /// Access + /// + /// + /// + /// + /// + //public static bool TraceTable_Select(string traceCode, string connectionString_Access,out DataTable dt) + //{ + // string sql; + // sql = "SELECT top 1 * FROM MES_装配数据_发动机号_追踪代码 " + // + " WHERE 追踪代码 = '" + traceCode + "'"; + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, connectionString_Access, out dt); + //} + + /// + /// MES_装配数据_发动机号_追踪代码 + /// Access + /// + /// + /// + /// + public static bool TraceTable_Select(string EngineTraceCode, out DataTable dt) + { + string sql; + //sql = "SELECT * FROM MES_装配数据_发动机号_追踪代码 " + // + " WHERE 发动机号 = '" + EngineTraceCode + "'"; + sql = "SELECT top 1 * FROM MES_装配数据_发动机号_追踪代码 " + + " WHERE 追踪代码 = '" + EngineTraceCode + "'" + +" order by 操作时间 desc "; + //if (!SQLCommon.SqlServerConnectionStatus) + //{ + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + //else + { + return DataAccess.ExecuteDataTable(sql, out dt); + + } + } + /// + /// [MES_装配数据_零部件追溯_发动机号与缸盖号] + /// + private static string GetSqlString_EngineID_CapNumber() + { + string sql = null; + sql = "INSERT INTO [MES_装配数据_零部件追溯_发动机号与缸盖号] " + + "(订单号,发动机号,追踪代码,工位号,到达时间,离开时间,操作者工号,班次代码," + + "[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + + "[发动机数量], [厂牌编号起始号], [客户名称],[投料日期],[文件编号],[集团名称],[通知号]," + + "[功率],[指南文件编号],[装机状态],[适用状态],[物料描述],[计划下达日期],[计划完工日期],[主配厂家],[零件类型])" + + " VALUES (" + //订单号,发动机号,追踪代码,工位号,到达时间,离开时间,操作者工号,班次代码 + + "'" + MaterialData.orderForm + "'," + + "'" + MaterialData.engineNumber + "'," + + "'" + MaterialData.engineTraceCode + "'," + + "'" + MaterialData.opName + "'," + + "'" + MaterialData.arrivedTime.ToString("G") + "'," + + "'" + MaterialData.leavedTime.ToString("G") + "'," + + "'" + MaterialData.operatorCode + "'," + + "'" + MaterialData.operatorShift + "'," + //+ "[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + + + "'" + MaterialData.sAPMaterialNumber + "'," + + "'" + MaterialData.engineNumberType + "'," + + "" + MaterialData.engineNumberCode + ","//int + + "'" + MaterialData.engineNumberBasicType + "'," + //+ "[发动机数量], [厂牌编号起始号], [客户名称],[投料日期],[文件编号],[集团名称],[通知号]," + + + "" + MaterialData.engineCount + ","//int + + "" + MaterialData.engineNumberFirstID + ","//int + + "'" + MaterialData.customesName + "'," + + "'" + MaterialData.prepareMaterialDateTime.ToString("G") + "'," + + "'" + MaterialData.fileCode + "'," + + "'" + MaterialData.groupName + "'," + + "'" + MaterialData.notifyCode + "'," + //+ "[功率],[指南文件编号],[装机状态],[适用状态],[物料描述],[计划下达日期],[计划完工日期],主配厂家,零件类型" + + "'" + MaterialData.n_Force + "'," + + "'" + MaterialData.directFileCode + "'," + + "'" + MaterialData.workEngineStatus + "'," + + "'" + MaterialData.adaptDateTime.ToString("G") + "'," + + "'" + MaterialData.materialDescript + "'," + + "'" + MaterialData.planSendedDateTime.ToString("G") + "'," + + "'" + MaterialData.planFinishDateTime.ToString("G") + "'," + + "'" + MaterialData.mainPruduceFatory + "'," + + "" + MaterialData.partType.ToString() + ") "; + return sql; + } + ///// + ///// 获得增加表[MES_装配数据_发动机号_追踪代码]的SQL语句 + ///// + //private static string GetSqlStringFirstOpNameTableTrace_F2() + //{ + // string sql = null; + // sql = "INSERT INTO [MES_装配数据_零部件追溯_发动机号与缸盖号] " + + // "(订单号,发动机号,追踪代码,工位号,到达时间,离开时间,操作者工号,班次代码," + // + "[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + // + "[发动机数量], [厂牌编号起始号], [客户名称],[投料日期],[文件编号],[集团名称],[通知号]," + // + "[功率],[指南文件编号],[装机状态],[适用状态],[物料描述],[计划下达日期],[计划完工日期],[主配厂家],[零件类型])" + // + " VALUES (" + // //订单号,发动机号,追踪代码,工位号,到达时间,离开时间,操作者工号,班次代码 + // + "'" + MaterialData.orderForm + "'," + // + "'" + MaterialData.engineNumber + "'," + // + "'" + MaterialData.engineTraceCode + "'," + // + "'" + MaterialData.opName + "'," + // + "'" + MaterialData.arrivedTime.ToString("G") + "'," + // + "'" + MaterialData.leavedTime.ToString("G") + "'," + // + "'" + MaterialData.operatorCode + "'," + // + "'" + MaterialData.operatorShift + "'," + // //+ "[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + + // + "'" + MaterialData.sAPMaterialNumber + "'," + // + "'" + MaterialData.engineNumberType + "'," + // + "" + MaterialData.engineNumberCode + ","//int + // + "'" + MaterialData.engineNumberBasicType + "'," + // //+ "[发动机数量], [厂牌编号起始号], [客户名称],[投料日期],[文件编号],[集团名称],[通知号]," + + // + "" + MaterialData.engineCount + ","//int + // + "" + MaterialData.engineNumberFirstID + ","//int + // + "'" + MaterialData.customesName + "'," + // + "'" + MaterialData.prepareMaterialDateTime.ToString("G") + "'," + // + "'" + MaterialData.fileCode + "'," + // + "'" + MaterialData.groupName + "'," + // + "'" + MaterialData.notifyCode + "'," + // //+ "[功率],[指南文件编号],[装机状态],[适用状态],[物料描述],[计划下达日期],[计划完工日期],主配厂家,零件类型" + // + "'" + MaterialData.n_Force + "'," + // + "'" + MaterialData.directFileCode + "'," + // + "'" + MaterialData.workEngineStatus + "'," + // + "'" + MaterialData.adaptDateTime.ToString("G") + "'," + // + "'" + MaterialData.materialDescript + "'," + // + "'" + MaterialData.planSendedDateTime.ToString("G") + "'," + // + "'" + MaterialData.planFinishDateTime.ToString("G") + "'," + // + "'" + MaterialData.mainPruduceFatory + "'," + // + "" + MaterialData.partType.ToString() + ") "; + // return sql; + //} + /// + /// 线首,用于物料追踪 + /// 传递到总线上线工位的数据成功,更新isOK=1 + /// MES_装配数据_发动机号_物料追踪 + /// SELECT * FROM [MES_装配数据_发动机号_追踪代码] WHERE IsOK = 0 + /// + /// 上线工位追溯代码 + /// + //public static bool TableTraceUpdate(int firstOpNameTraceCode) + //{ + // string sql = null; + // sql = "UPDATE MES_装配数据_发动机号_追踪代码 SET IsOK = 1 WHERE 上线工位追溯代码 = " + firstOpNameTraceCode.ToString(); + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// 线首,用于物料追踪 + /// 查询没有被传递到总线上线工位的数据 + /// MES_装配数据_发动机号_追踪代码 + /// SELECT * FROM [MES_装配数据_发动机号_追踪代码] WHERE IsOK = 0 + /// + /// + //public static bool TableTraceSelect(out DataTable dt) + //{ + // string sql = null; + // sql = "SELECT * FROM MES_装配数据_发动机号_追踪代码 WHERE IsOK = 0"; + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + + /// + /// 总线上线工位,用于物料追踪 + /// 增加数据到Access数据库 + /// MES_装配数据_发动机号_追踪代码 + /// INSERT INTO [MES_装配数据_发动机号_追踪代码] + /// + /// 零件类型(1缸体)(2缸盖)(3活塞连杆) + /// + //public static bool TableTraceInsert_MainLine(string connectionString_Access_OpNameMainLine) + //{ + // // + // // 上线工位追溯代码 + // // + // int firstOpNameTraceCode; + // string sql = null; + // string sql2 = null; + // DataTable dt; + // DataRow dr; + // try + // { + // // 测试 connectionString_Access_OpNameMainLine 文件是否存在? + // if (!File.Exists(connectionString_Access_OpNameMainLine)) + // { + // ////ApplicationLog.WriteLog("file not exists filename=:" + connectionString_Access_OpNameMainLine); + // return false; + // } + + // // 线首,用于物料追踪 + // // 查询没有被传递到总线上线工位的数据 + // // MES_装配数据_发动机号_追踪代码 + // // SELECT * FROM [MES_装配数据_发动机号_追踪代码] WHERE IsOK = 0 + // TableTraceSelect(out dt); + // if (dt == null) return false; + // for (int i = 0; i < dt.Rows.Count; i++) + // { + // dr = dt.Rows[i]; + // sql = GetSqlString_TableTraceInsert_MainLine(dr); + // if (sql != null) + // { + // string engineTraceCode = dr[MaterialData.EngineTraceCodeField].ToString(); + // sql2 = "DELETE FROM MES_装配数据_发动机号_追踪代码 WHERE 追踪代码='" + engineTraceCode + "'"; + // DataAccess.ExecuteSQL_OleDb_Access(connectionString_Access_OpNameMainLine, sql2); + // if (DataAccess.ExecuteSQL_OleDb_Access(connectionString_Access_OpNameMainLine, sql)) + // { + // if (!Convert.IsDBNull(dr[MaterialData.FirstOpNameTraceCodeField])) + // { + // firstOpNameTraceCode = Convert.ToInt32(dr[MaterialData.FirstOpNameTraceCodeField]); + // TableTraceUpdate(firstOpNameTraceCode); + // } + // } + // } + // } + // return true; + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err.Message); + // return false; + // } + //} + /// + /// 线首,用于物料追踪 + /// 增加数据到Access数据库 + /// MES_装配数据_发动机号_追踪代码 + /// INSERT INTO [MES_装配数据_发动机号_追踪代码] + /// + /// + //public static bool TableTraceInsert() + //{ + // string sql = null; + // sql = GetSqlString_TableTraceInsert(); + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// 线首,用于物料追踪 + /// 增加数据到SqlServer数据库 + /// MES_装配数据_发动机号_追踪代码 + /// INSERT INTO [MES_装配数据_发动机号_追踪代码] + /// + /// + public static bool TableTraceInsert_SqlServer() + { + string sql = null; + sql = GetSqlString_TableTraceInsert(); + return DataAccess.ExecuteSQL(sql); + } + /// + /// 应用于总线上线工位 + /// 获得增加表[MES_装配数据_发动机号_追踪代码]的SQL语句 + /// + private static string GetSqlString_TableTraceInsert_MainLine(DataRow dr) + { + // + // 上线工位追溯代码 + // + int firstOpNameTraceCode; + // + // 订单号 + // + string orderForm; + // + // 主配厂家 + // + string mainPruduceFatory; + // + // 发动号 + // + string engineNumber; + // + // 订单计划发动机号 + // + string engineNumber_OrderPlan; + // + // 追踪代码 + // + string engineTraceCode; + // + // 主物料号 + // + string mainMaterialNumber; + // + // 工位号 + // + string opName; + // + // 到达时间 + // + DateTime arrivedTime; + // + // 离开时间 + // + DateTime leavedTime; + // + // 操作者工号 + // + string operatorCode; + // + // 班次代码 + // + string operatorShift; + // + // SAP物料号 + // + string sAPMaterialNumber; + // + // 发动机型号 + // + string engineNumberType; + // + // 发动机型号代码 + // + int engineNumberCode; + // + // 发动机机型 + // + string engineNumberBasicType; + // + // 发动机数量 + // + string engineCount; + // + // 厂牌编号起始号 + // + string engineNumberFirstID; + // + // 客户名称 + // + string customesName; + // + // 投料日期 + // + DateTime prepareMaterialDateTime; + // + // 文件编号 + // + string fileCode; + // + // 集团名称 + // + string groupName; + // + // 通知号 + // + string notifyCode; + // + // 功率 + // + string n_Force; + // + // 指南文件编号 + // + string directFileCode; + // + // 装机状态 + // + string workEngineStatus; + // + // 适用状态 + // + DateTime adaptDateTime; + // + // 物料描述 + // + string materialDescript; + // + // 计划下达日期 + // + DateTime planSendedDateTime; + // + // 计划完工日期 + // + DateTime planFinishDateTime; + // + // 零件类型 + // + int partType; + + string sql = null; + try + { + if (Convert.IsDBNull(dr[MaterialData.FirstOpNameTraceCodeField])) + { + firstOpNameTraceCode = 0; + } + else + { + firstOpNameTraceCode = Convert.ToInt32(dr[MaterialData.FirstOpNameTraceCodeField]); + } + + if (Convert.IsDBNull(dr[MaterialData.OrderFormField])) + { + orderForm = ""; + } + else + { + orderForm = dr[MaterialData.OrderFormField].ToString(); + } + + // + if (Convert.IsDBNull(dr[MaterialData.EngineNumber_OrderPlanField])) + { + engineNumber_OrderPlan = ""; + } + else + { + engineNumber_OrderPlan = dr[MaterialData.EngineNumber_OrderPlanField].ToString(); + } + if (Convert.IsDBNull(dr[MaterialData.EngineNumberField])) + { + engineNumber = ""; + } + else + { + engineNumber = dr[MaterialData.EngineNumberField].ToString(); + } + if (Convert.IsDBNull(dr[MaterialData.EngineTraceCodeField])) + { + engineTraceCode = ""; + } + else + { + engineTraceCode = dr[MaterialData.EngineTraceCodeField].ToString(); + } + + if (Convert.IsDBNull(dr[MaterialData.MainMaterialNumberField])) + { + mainMaterialNumber = ""; + } + else + { + mainMaterialNumber = dr[MaterialData.MainMaterialNumberField].ToString(); + } + + + if (Convert.IsDBNull(dr[MaterialData.OpNameField])) + { + opName = ""; + } + else + { + opName = dr[MaterialData.OpNameField].ToString(); + } + + + if (Convert.IsDBNull(dr[MaterialData.ArrivedTimeField])) + { + arrivedTime = DateTime.Now; + } + else + { + arrivedTime = Convert.ToDateTime(dr[MaterialData.ArrivedTimeField]); + } + + + if (Convert.IsDBNull(dr[MaterialData.LeavedTimeField])) + { + leavedTime = DateTime.Now; + } + else + { + leavedTime = Convert.ToDateTime(dr[MaterialData.LeavedTimeField]); + } + + + if (Convert.IsDBNull(dr[MaterialData.OperatorCodeField])) + { + operatorCode = ""; + } + else + { + operatorCode = dr[MaterialData.OperatorCodeField].ToString(); + } + + if (Convert.IsDBNull(dr[MaterialData.OperatorShiftField])) + { + operatorShift = ""; + } + else + { + operatorShift = dr[MaterialData.OperatorShiftField].ToString(); + } + + //+ "[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + + + if (Convert.IsDBNull(dr[MaterialData.SAPMaterialNumberField])) + { + sAPMaterialNumber = ""; + } + else + { + sAPMaterialNumber = dr[MaterialData.SAPMaterialNumberField].ToString(); + } + + + if (Convert.IsDBNull(dr[MaterialData.EngineNumberTypeField])) + { + engineNumberType = ""; + } + else + { + engineNumberType = dr[MaterialData.EngineNumberTypeField].ToString(); + } + + if (Convert.IsDBNull(dr[MaterialData.EngineNumberCodeField])) + { + engineNumberCode = 1; + } + else + { + engineNumberCode = Convert.ToInt32(dr[MaterialData.EngineNumberCodeField]); + } + + + if (Convert.IsDBNull(dr[MaterialData.EngineNumberBasicTypeField])) + { + engineNumberBasicType = ""; + } + else + { + engineNumberBasicType = dr[MaterialData.EngineNumberBasicTypeField].ToString(); + } + + //+ "[发动机数量], [厂牌编号起始号], [客户名称],[投料日期],[文件编号],[集团名称],[通知号]," + + if (Convert.IsDBNull(dr[MaterialData.EngineCountField])) + { + engineCount = ""; + } + else + { + engineCount = dr[MaterialData.EngineCountField].ToString(); + } + + if (Convert.IsDBNull(dr[MaterialData.EngineNumberFirstIDField])) + { + engineNumberFirstID = ""; + } + else + { + engineNumberFirstID = dr[MaterialData.EngineNumberFirstIDField].ToString(); + } + + if (Convert.IsDBNull(dr[MaterialData.CustomesNameField])) + { + customesName = ""; + } + else + { + customesName = dr[MaterialData.CustomesNameField].ToString(); + } + + + if (Convert.IsDBNull(dr[MaterialData.PrepareMaterialDateTimeField])) + { + prepareMaterialDateTime = DateTime.Now; + } + else + { + prepareMaterialDateTime = Convert.ToDateTime(dr[MaterialData.PrepareMaterialDateTimeField]); + } + + + if (Convert.IsDBNull(dr[MaterialData.EngineCountField])) + { + fileCode = ""; + } + else + { + fileCode = dr[MaterialData.EngineCountField].ToString(); + } + + + if (Convert.IsDBNull(dr[MaterialData.GroupNameField])) + { + groupName = ""; + } + else + { + groupName = dr[MaterialData.GroupNameField].ToString(); + } + + + if (Convert.IsDBNull(dr[MaterialData.NotifyCodeField])) + { + notifyCode = ""; + } + else + { + notifyCode = dr[MaterialData.NotifyCodeField].ToString(); + } + + //+ "[功率],[指南文件编号],[装机状态],[适用状态],[物料描述],[计划下达日期],[计划完工日期],主配厂家,零件类型" + + if (Convert.IsDBNull(dr[MaterialData.N_ForceField])) + { + n_Force = ""; + } + else + { + n_Force = dr[MaterialData.N_ForceField].ToString(); + } + + if (Convert.IsDBNull(dr[MaterialData.DirectFileCodeField])) + { + directFileCode = ""; + } + else + { + directFileCode = dr[MaterialData.DirectFileCodeField].ToString(); + } + + + if (Convert.IsDBNull(dr[MaterialData.WorkEngineStatusField])) + { + workEngineStatus = ""; + } + else + { + workEngineStatus = dr[MaterialData.WorkEngineStatusField].ToString(); + } + + + if (Convert.IsDBNull(dr[MaterialData.AdaptDateTimeField])) + { + adaptDateTime = DateTime.Now; + } + else + { + adaptDateTime = Convert.ToDateTime(dr[MaterialData.AdaptDateTimeField]); + } + + if (Convert.IsDBNull(dr[MaterialData.MaterialDescriptField])) + { + materialDescript = ""; + } + else + { + materialDescript = dr[MaterialData.MaterialDescriptField].ToString(); + } + + if (Convert.IsDBNull(dr[MaterialData.PlanSendedDateTimeField])) + { + planSendedDateTime = DateTime.Now; + } + else + { + planSendedDateTime = Convert.ToDateTime(dr[MaterialData.PlanSendedDateTimeField]); + } + + + if (Convert.IsDBNull(dr[MaterialData.PlanFinishDateTimeField])) + { + planFinishDateTime = DateTime.Now; + } + else + { + planFinishDateTime = Convert.ToDateTime(dr[MaterialData.PlanFinishDateTimeField]); + } + + + if (Convert.IsDBNull(dr[MaterialData.MainPruduceFatoryField])) + { + mainPruduceFatory = ""; + } + else + { + mainPruduceFatory = dr[MaterialData.MainPruduceFatoryField].ToString(); + } + + + if (Convert.IsDBNull(dr[MaterialData.PartTypeField])) + { + partType = 1; + } + else + { + partType = Convert.ToInt32(dr[MaterialData.PartTypeField]); + } + + sql = "INSERT INTO [MES_装配数据_发动机号_追踪代码] " + + "(订单号,订单计划发动机号,发动机号,追踪代码,工位号,到达时间,离开时间,操作者工号,班次代码," + + "[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + + "[发动机数量], [厂牌编号起始号], [客户名称],[投料日期],[文件编号],[集团名称],[通知号]," + + "[功率],[指南文件编号],[装机状态],[适用状态],[物料描述],[计划下达日期],[计划完工日期],[主配厂家],[零件类型])" + + " VALUES (" + //上线工位追溯代码,订单号,发动机号,追踪代码,工位号,到达时间,离开时间,操作者工号,班次代码 + //+ "" + firstOpNameTraceCode + "," + + "'" + orderForm + "'," + + "'" + engineNumber_OrderPlan + "'," + + "'" + engineNumber + "'," + + "'" + engineTraceCode + "'," + + "'" + opName + "'," + + "'" + arrivedTime.ToString("G") + "'," + + "'" + leavedTime.ToString("G") + "'," + + "'" + operatorCode + "'," + + "'" + operatorShift + "'," + //+ "[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + + + "'" + sAPMaterialNumber + "'," + + "'" + engineNumberType + "'," + + "" + engineNumberCode + ","//int + + "'" + engineNumberBasicType + "'," + //+ "[发动机数量], [厂牌编号起始号], [客户名称],[投料日期],[文件编号],[集团名称],[通知号]," + + + "" + engineCount + ","//int + + "'" + engineNumberFirstID + "'," + + "'" + customesName + "'," + + "'" + prepareMaterialDateTime.ToString("G") + "'," + + "'" + fileCode + "'," + + "'" + groupName + "'," + + "'" + notifyCode + "'," + //+ "[功率],[指南文件编号],[装机状态],[适用状态],[物料描述],[计划下达日期],[计划完工日期],主配厂家,零件类型" + + "'" + n_Force + "'," + + "'" + directFileCode + "'," + + "'" + workEngineStatus + "'," + + "'" + adaptDateTime.ToString("G") + "'," + + "'" + materialDescript + "'," + + "'" + planSendedDateTime.ToString("G") + "'," + + "'" + planFinishDateTime.ToString("G") + "'," + + "'" + mainPruduceFatory + "'," + + "" + partType.ToString() + ") "; + return sql; + } + catch { return null; } + } + /// + /// 应用于分线上线工位 + /// 获得增加表[MES_装配数据_发动机号_追踪代码]的SQL语句 + /// + private static string GetSqlString_TableTraceInsert() + { + string sql = null; + sql = "INSERT INTO [MES_装配数据_发动机号_追踪代码] " + + "(订单号,订单计划发动机号,发动机号,追踪代码,主物料号,工位号,到达时间,离开时间,操作者工号,班次代码," + + "[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + + "[发动机数量], [厂牌编号起始号], [客户名称],[投料日期],[文件编号],[集团名称],[通知号]," + + "[功率],[指南文件编号],[装机状态],[适用状态],[物料描述],[计划下达日期],[计划完工日期],[主配厂家],[零件类型])" + + " VALUES (" + //订单号,发动机号,追踪代码,工位号,到达时间,离开时间,操作者工号,班次代码 + + "'" + MaterialData.orderForm + "'," + + "'" + MaterialData.engineNumber_OrderPlan + "'," + + "'" + MaterialData.engineNumber + "'," + + "'" + MaterialData.engineTraceCode + "'," + + "'" + MaterialData.mainMaterialNumber + "'," + + "'" + MaterialData.opName + "'," + + "'" + MaterialData.arrivedTime.ToString("G") + "'," + + "'" + MaterialData.leavedTime.ToString("G") + "'," + + "'" + MaterialData.operatorCode + "'," + + "'" + MaterialData.operatorShift + "'," + //+ "[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + + + "'" + MaterialData.sAPMaterialNumber + "'," + + "'" + MaterialData.engineNumberType + "'," + + "" + MaterialData.engineNumberCode + ","//int + + "'" + MaterialData.engineNumberBasicType + "'," + //+ "[发动机数量], [厂牌编号起始号], [客户名称],[投料日期],[文件编号],[集团名称],[通知号]," + + + "" + MaterialData.engineCount + ","//int + + "'" + MaterialData.engineNumberFirstID + "'," + + "'" + MaterialData.customesName + "'," + + "'" + MaterialData.prepareMaterialDateTime.ToString("G") + "'," + + "'" + MaterialData.fileCode + "'," + + "'" + MaterialData.groupName + "'," + + "'" + MaterialData.notifyCode + "'," + //+ "[功率],[指南文件编号],[装机状态],[适用状态],[物料描述],[计划下达日期],[计划完工日期],主配厂家,零件类型" + + "'" + MaterialData.n_Force + "'," + + "'" + MaterialData.directFileCode + "'," + + "'" + MaterialData.workEngineStatus + "'," + + "'" + MaterialData.adaptDateTime.ToString("G") + "'," + + "'" + MaterialData.materialDescript + "'," + + "'" + MaterialData.planSendedDateTime.ToString("G") + "'," + + "'" + MaterialData.planFinishDateTime.ToString("G") + "'," + + "'" + MaterialData.mainPruduceFatory + "'," + + "" + MaterialData.partType.ToString() + ") "; + return sql; + } + + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/vssver2.scc b/Common/07WebBusinessFacade/BusinessFacade/MES.Biz.TraceTable/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..c0b85a3764ed5ac6089c30a0af03c3e962d011f6 GIT binary patch literal 256 zcmXpJVq~~_m%l5bInsUAj6{**Nns)hz5k2dm>3vX7#JAbf%K-?7i&8*zUngq`5r+2 zRu_lw8o^({d`}=>NOiMK#&-zc3&?*m^{@oTLI__)-`6v^JT(bMIh7V?=A{-FyCo(k zrljiox(4exWmf5h6eT97h9oBCq%vR%={YAB=p`3plff?PT$z)Zmy%k9LsLk;e}P|O IZYoF`0CMh88~^|S literal 0 HcmV?d00001 diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.Data.GetData/GetOpNameOrderForm.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.Data.GetData/GetOpNameOrderForm.cs new file mode 100644 index 0000000..3c2d9b8 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.Data.GetData/GetOpNameOrderForm.cs @@ -0,0 +1,281 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; + +using System.Data.OleDb; +using DataLinkMesWork; +//using SystemFramework; + +namespace bizFacade +{ + /// + /// 关键零部件追溯 + /// + public partial class BaseDataSystemMES + { + /// + /// 根据工位号,将计划下达到工位PC + /// [MES_计划BOM_订单计划下达_执行顺序] + /// [MES_计划BOM_发动机号] + /// [MES_计划BOM_发动机装配指南] + /// + /// + //public static void GetOrderForm(string opName) + //{ + // //订单号 + // string orderForm; + // //1:获得需要下达的订单列表 + // DataTable dt_orderForm; + // OrderFormOpName_Select(opName, out dt_orderForm); + // if (dt_orderForm != null) + // { + // for (int i = 0; i < dt_orderForm.Rows.Count; i++) + // { + // try + // { + // orderForm = dt_orderForm.Rows[i]["订单号"].ToString(); + // //2:根据订单号,工位号,获得[MES_计划BOM_订单计划下达_执行顺序] + // //[MES_计划BOM_发动机号] + // //[MES_计划BOM_发动机装配指南] + // DataTable dt_OrderFormOrderBy; + // DataTable dt_EngineID; + // DataTable dt_OperationGuid; + // GetOrderPlanEngineNumber_OrderForm(orderForm, out dt_OrderFormOrderBy); + // GetOrderPlanEngineNumberToPcStation(orderForm, out dt_EngineID); + // GetOperationGuid(orderForm, opName, out dt_OperationGuid); + + // //3将数据导入到工位PC + + // if (!GetOrderPlanEngineNumberToPcStation_OrderForm_Delete(orderForm)) continue; + // if(!GetOrderPlanEngineNumberToPcStation_Delete(orderForm)) continue; + // if(!GetOperationGuidToPcStation_Delete(orderForm)) continue; + + // if(!GetOrderPlanEngineNumberToPcStation_OrderForm(dt_OrderFormOrderBy)) continue; + // if(!GetOrderPlanEngineNumberToPcStation(dt_EngineID)) continue; + // if(!GetOperationGuidToPcStation(dt_OperationGuid)) continue; + + // OrderFormOpName_Update(orderForm, opName); + // } + // catch (Exception err) + // { + // //ApplicationLog.WriteLog(err,err.Message); + // } + + // } + // } + //} + /// + /// "delete from [MES_计划BOM_订单计划下达_执行顺序] where 订单号='" + orderForm + "'"; + /// + /// + //private static bool GetOrderPlanEngineNumberToPcStation_OrderForm_Delete(string orderForm) + //{ + // string sql; + // sql = "delete from [MES_计划BOM_订单计划下达_执行顺序] where 订单号='" + orderForm + "'"; + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// "delete from [MES_计划BOM_发动机号] where 订单号='" + orderForm + "'"; + /// + /// + //private static bool GetOrderPlanEngineNumberToPcStation_Delete(string orderForm) + //{ + // string sql; + // sql = "delete from [MES_计划BOM_发动机号] where 订单号='" + orderForm + "'"; + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// "delete from [MES_计划BOM_订单计划下达_执行顺序] where 订单号='" + orderForm + "'"; + /// + /// + //private static bool GetOperationGuidToPcStation_Delete(string orderForm) + //{ + // string sql; + // sql = "delete from [MES_计划BOM_发动机装配指南] where 订单号='" + orderForm + "'"; + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// exec MES_计划BOM_发动机订单计划_下达工位_修改 + /// set 同步状态=1,同步日期=getdate() + /// + /// + /// + public static void OrderFormOpName_Update(string orderForm,string opName) + { + string sql; + sql = "exec MES_计划BOM_发动机订单计划_下达工位_修改 '"+orderForm+"','"+opName+"'"; + DataAccess.ExecuteSQL(sql); + } + /// + /// 获得工位对应的订单号 + /// MES_计划BOM_发动机订单计划_下达工位 + /// + /// + /// + public static void OrderFormOpName_Select(string opName, out DataTable dt) + { + string sql; + + + + sql = "select 订单号 from MES_计划BOM_发动机订单计划_下达工位 " + + " where 同步状态 = 0 and 工位号='" + opName + "'"; + DataAccess.ExecuteDataTable(sql, out dt); + + + + } + /// + /// 下达装配BOM到工位Access文件 INSERT INTO [MES_计划BOM_发动机装配指南] + /// + /// + //static public bool GetOperationGuidToPcStation(DataTable dt) + //{ + // string sql; + // sql = + // "INSERT INTO [MES_计划BOM_发动机装配指南]" + + // "([订单号], [主配厂家],[工位号], [工位名称], [物料号], [零件图号], [零件名称]," + + // " [零件数量],[是否扫描],[扫描方式],[是否主物料],[厂家代码], [生产厂家],[操作指导] )" + + // "VALUES(@订单号,@主配厂家,@工位号,@工位名称,@物料号,@零件图号,@零件名称," + + // "@零件数量,@是否扫描,@扫描方式,@是否主物料,@厂家代码,@生产厂家,@操作指导)"; + // OleDbParameter[] thisParms = new OleDbParameter[14]; + // thisParms[0] = new OleDbParameter("@订单号", OleDbType.VarChar, 50, "订单号"); + // thisParms[1] = new OleDbParameter("@主配厂家", OleDbType.VarChar, 50, "主配厂家"); + // thisParms[2] = new OleDbParameter("@工位号", OleDbType.VarChar, 50, "工位号"); + // thisParms[3] = new OleDbParameter("@工位名称", OleDbType.VarChar, 255, "工位名称"); + // thisParms[4] = new OleDbParameter("@物料号", OleDbType.VarChar, 50, "物料号"); + // thisParms[5] = new OleDbParameter("@零件图号", OleDbType.VarChar, 50, "零件图号"); + // thisParms[6] = new OleDbParameter("@零件名称", OleDbType.VarChar, 255, "零件名称"); + // thisParms[7] = new OleDbParameter("@零件数量", OleDbType.Integer, 4, "零件数量"); + // thisParms[8] = new OleDbParameter("@是否扫描", OleDbType.Integer, 4, "是否扫描"); + // thisParms[9] = new OleDbParameter("@扫描方式", OleDbType.Integer, 4, "扫描方式"); + // thisParms[10] = new OleDbParameter("@是否主物料", OleDbType.Integer, 4, "是否主物料"); + // thisParms[11] = new OleDbParameter("@厂家代码", OleDbType.VarChar, 255, "厂家代码"); + // thisParms[12] = new OleDbParameter("@生产厂家", OleDbType.VarChar, 255, "生产厂家"); + // thisParms[13] = new OleDbParameter("@操作指导", OleDbType.VarChar, 255, "操作指导"); + + // return DataAccess.ExecuteDataTable_OleDb_Insert_Access(sql, dt, ref thisParms); + + //} + /// + /// 下达装配BOM的发动机号到工位Access文件 INSERT INTO [MES_计划BOM_发动机号] + /// + /// + //static public bool GetOrderPlanEngineNumberToPcStation(DataTable dt) + //{ + // string sql; + // sql = + // "INSERT INTO [MES_计划BOM_发动机号]" + + // "([发动机号], [订单号], [SAP物料号], [发动机型号], [发动机型号代码], [发动机机型]," + + // "[发动机数量], [厂牌编号起始号], [客户名称], [投料日期], [文件编号], [集团名称], [通知号], " + + // "[功率], [指南文件编号], [装机状态], [适用状态], [物料描述],[计划下达日期])" + + // "VALUES(@发动机号,@订单号,@SAP物料号,@发动机型号,@发动机型号代码,@发动机机型," + + // "@发动机数量,@厂牌编号起始号,@客户名称,@投料日期,@文件编号,@集团名称,@通知号," + + // "@功率,@指南文件编号,@装机状态,@适用状态,@物料描述,@计划下达日期)"; + // OleDbParameter[] thisParms = new OleDbParameter[19]; + // thisParms[0] = new OleDbParameter("@发动机号", OleDbType.VarChar, 50, "发动机号"); + // thisParms[1] = new OleDbParameter("@订单号", OleDbType.VarChar, 50, "订单号"); + // thisParms[2] = new OleDbParameter("@SAP物料号", OleDbType.VarChar, 50, "SAP物料号"); + // thisParms[3] = new OleDbParameter("@发动机型号", OleDbType.VarChar, 50, "发动机型号"); + // thisParms[4] = new OleDbParameter("@发动机型号代码", OleDbType.Integer, 4, "发动机型号代码"); + // thisParms[5] = new OleDbParameter("@发动机机型", OleDbType.VarChar, 50, "发动机机型"); + + // thisParms[6] = new OleDbParameter("@发动机数量", OleDbType.Integer, 4, "发动机数量"); + // thisParms[7] = new OleDbParameter("@厂牌编号起始号", OleDbType.VarChar, 50, "厂牌编号起始号"); + // thisParms[8] = new OleDbParameter("@客户名称", OleDbType.VarChar, 255, "客户名称"); + // thisParms[9] = new OleDbParameter("@投料日期", OleDbType.DBDate, 8, "投料日期"); + // thisParms[10] = new OleDbParameter("@文件编号", OleDbType.VarChar, 50, "文件编号"); + // thisParms[11] = new OleDbParameter("@集团名称", OleDbType.VarChar, 255, "集团名称"); + // thisParms[12] = new OleDbParameter("@通知号", OleDbType.VarChar, 50, "通知号"); + + // thisParms[13] = new OleDbParameter("@功率", OleDbType.VarChar, 50, "功率"); + // thisParms[14] = new OleDbParameter("@指南文件编号", OleDbType.VarChar, 50, "指南文件编号"); + // thisParms[15] = new OleDbParameter("@装机状态", OleDbType.VarChar, 50, "装机状态"); + // thisParms[16] = new OleDbParameter("@适用状态", OleDbType.VarChar, 50, "适用状态"); + // thisParms[17] = new OleDbParameter("@物料描述", OleDbType.VarChar, 255, "物料描述"); + // thisParms[18] = new OleDbParameter("@计划下达日期", OleDbType.DBDate, 8, "计划下达日期"); + + // return DataAccess.ExecuteDataTable_OleDb_Insert_Access(sql, dt, ref thisParms); + + //} + /// + /// 下达装配BOM的发动机号到工位Access文件 INSERT INTO [MES_计划BOM_订单计划下达_执行顺序] + /// + /// + //static public bool GetOrderPlanEngineNumberToPcStation_OrderForm(DataTable dt) + //{ + // string sql; + // sql = + // "INSERT INTO [MES_计划BOM_订单计划下达_执行顺序]" + + // "([订单号],[执行顺序],[SAP物料号], [发动机型号], [发动机型号代码], [发动机机型]," + + // "[发动机数量], [厂牌编号起始号], [客户名称], [投料日期], [文件编号], [集团名称], [通知号], " + + // "[功率], [指南文件编号], [装机状态], [适用状态], [物料描述],[计划下达日期])" + + // "VALUES(@订单号,@执行顺序,@SAP物料号,@发动机型号,@发动机型号代码,@发动机机型," + + // "@发动机数量,@厂牌编号起始号,@客户名称,@投料日期,@文件编号,@集团名称,@通知号," + + // "@功率,@指南文件编号,@装机状态,@适用状态,@物料描述,@计划下达日期)"; + // OleDbParameter[] thisParms = new OleDbParameter[19]; + // thisParms[0] = new OleDbParameter("@订单号", OleDbType.VarChar, 50, "订单号"); + // thisParms[1] = new OleDbParameter("@执行顺序", OleDbType.Integer, 4, "执行顺序"); + // thisParms[2] = new OleDbParameter("@SAP物料号", OleDbType.VarChar, 50, "SAP物料号"); + // thisParms[3] = new OleDbParameter("@发动机型号", OleDbType.VarChar, 50, "发动机型号"); + // thisParms[4] = new OleDbParameter("@发动机型号代码", OleDbType.Integer, 4, "发动机型号代码"); + // thisParms[5] = new OleDbParameter("@发动机机型", OleDbType.VarChar, 50, "发动机机型"); + + // thisParms[6] = new OleDbParameter("@发动机数量", OleDbType.Integer, 4, "发动机数量"); + // thisParms[7] = new OleDbParameter("@厂牌编号起始号", OleDbType.VarChar, 50, "厂牌编号起始号"); + // thisParms[8] = new OleDbParameter("@客户名称", OleDbType.VarChar, 255, "客户名称"); + // thisParms[9] = new OleDbParameter("@投料日期", OleDbType.DBDate, 8, "投料日期"); + // thisParms[10] = new OleDbParameter("@文件编号", OleDbType.VarChar, 50, "文件编号"); + // thisParms[11] = new OleDbParameter("@集团名称", OleDbType.VarChar, 255, "集团名称"); + // thisParms[12] = new OleDbParameter("@通知号", OleDbType.VarChar, 50, "通知号"); + + // thisParms[13] = new OleDbParameter("@功率", OleDbType.VarChar, 50, "功率"); + // thisParms[14] = new OleDbParameter("@指南文件编号", OleDbType.VarChar, 50, "指南文件编号"); + // thisParms[15] = new OleDbParameter("@装机状态", OleDbType.VarChar, 50, "装机状态"); + // thisParms[16] = new OleDbParameter("@适用状态", OleDbType.VarChar, 50, "适用状态"); + // thisParms[17] = new OleDbParameter("@物料描述", OleDbType.VarChar, 255, "物料描述"); + // thisParms[18] = new OleDbParameter("@计划下达日期", OleDbType.DBDate, 8, "计划下达日期"); + + // return DataAccess.ExecuteDataTable_OleDb_Insert_Access(sql, dt, ref thisParms); + + //} + /// + /// 根据订单号,工位号获得[MES_计划BOM_发动机装配指南] + /// + /// 订单号 + /// 工位号 + /// MES_计划BOM_发动机装配指南 + /// + static public bool GetOperationGuid(string orderForm,string opName,out DataTable dt) + { + string sql; + sql = "exec MES_计划BOM_发动机装配指南_查询_下达到工位 '" + orderForm + "','" + opName + "'"; + return DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// 根据订单号 [MES_计划BOM_订单计划下达_执行顺序] + /// + /// 订单号 + /// [MES_计划BOM_订单计划下达_执行顺序] + static public bool GetOrderPlanEngineNumber_OrderForm(string orderForm, out DataTable dt) + { + string sql; + sql = "exec MES_计划BOM_发动机订单计划_查询_下达到工位 '" + orderForm + "'"; + return DataAccess.ExecuteDataTable(sql, out dt); + + } + /// + /// 根据订单号 [MES_计划BOM_发动机号] + /// + /// 订单号 + /// [MES_计划BOM_发动机号] + static public bool GetOrderPlanEngineNumberToPcStation(string orderForm, out DataTable dt) + { + string sql; + sql = "exec MES_计划BOM_发动机号_查询_下达到工位 '" + orderForm + "'"; + return DataAccess.ExecuteDataTable(sql, out dt); + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.Data.GetData/MES.Biz.TraceTable.GetData.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.Data.GetData/MES.Biz.TraceTable.GetData.cs new file mode 100644 index 0000000..d5a4b1d --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.Data.GetData/MES.Biz.TraceTable.GetData.cs @@ -0,0 +1,86 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using System.Data.OleDb; + +//using SystemFramework; +using DataLinkMesWork; +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + + /// + /// 从数据库服务器获得[数据MES_装配数据_发动机号_追踪代码_下达工位]数据, + /// 保存到Access中,同时更新[是否同步]标志。 + /// + /// 线首工位 + /// 当前工位 + /// + //public static void GetTraceCodeDataTableFromSqlServer_OpName_InsertIntoAccess(string opNameTraceCode, string opName) + //{ + // DataTable dt; + // if (GetTraceCodeDataTableFromSqlServer_OpName(opNameTraceCode, opName, out dt)) + // { + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // if (TableTraceInsert_Access(dt)) + // { + // GetTraceCodeDataTableFromSqlServer_OpName_Update(opNameTraceCode, opName); + // } + // } + // } + // } + //} + /// + /// 上线工位的[MES_装配数据_发动机号_追踪代码]数据 + /// 从数据库服务器 + /// + /// + private DataTable GetTraceCodeDataTableFromSqlServer(string opName) + { + DataTable dt; + string sql; + sql = "select 订单号,订单计划发动机号,发动机号,追踪代码,主物料号,工位号,操作者工号,班次代码,SAP物料号,发动机型号,发动机型号代码,发动机机型" + + " from MES_装配数据_发动机号_追踪代码 where IsOK=0 and 工位号='" + opName + "'"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + /// + /// 从数据库服务器获得[数据MES_装配数据_发动机号_追踪代码_下达工位]数据 + /// + /// 线首工位 + /// 当前工位 + /// + /// + private static bool GetTraceCodeDataTableFromSqlServer_OpName(string opNameTraceCode, string opName, out DataTable dt) + { + string sql; + sql = "select 订单号,订单计划发动机号,发动机号,追踪代码,主物料号,工位号,操作者工号,班次代码,SAP物料号,发动机型号,发动机型号代码,发动机机型" + + " from MES_装配数据_发动机号_追踪代码_下达工位 where 是否同步=0 " + " and 下达工位='" + opName + "'"; + return DataAccess.ExecuteDataTable(sql, out dt); + } + + + /// + /// 从数据库服务器获得[数据MES_装配数据_发动机号_追踪代码_下达工位]数据 + /// update 数据MES_装配数据_发动机号_追踪代码_下达工位 set 是否同步=1 + /// + /// 线首工位 + /// 当前工位 + /// + private static bool GetTraceCodeDataTableFromSqlServer_OpName_Update(string opNameTraceCode, string opName) + { + string sql; + sql = "update MES_装配数据_发动机号_追踪代码_下达工位 set 是否同步=1 where 是否同步=0 and 工位号='" + opNameTraceCode + "' and 下达工位='" + opName + "'"; + return DataAccess.ExecuteSQL(sql); + } + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.Data.GetData/OpNameGuid.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.Data.GetData/OpNameGuid.cs new file mode 100644 index 0000000..a0b1324 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.Data.GetData/OpNameGuid.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; + +using System.Data.OleDb; +using DataLinkMesWork; +//using SystemFramework; + +namespace bizFacade +{ + /// + /// MES_计划BOM_工位操作指南 + /// + public partial class BaseDataSystemMES + { + /// + /// + /// + public static void TestConnection() + { + //SQLCommon.TestConnection(); + } + /// + /// 更新 "update [MES_计划BOM_工位操作指南] set 工位操作指导=?,工位指导图片=? where 发动机型号代码=? + /// + /// + //public static void OpNameGuidPic_Update(string opName) + //{ + // DataTable dt; + // OpNameGuidPic_Select(opName, out dt); + // OpNameGuidPic_Update(opName, dt); + //} + /// + /// 更新 MES_计划BOM_工位与名称 工位基本指导图片 + /// + /// + //public static void OpNameGuidBasicPic_Update(string opName) + //{ + // DataTable dt; + // OpNameGuidBasicPic_Select(opName, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // OpNameGuidBasicPic_Update(opName, dt); + // } + // } + //} + /// + /// select 工位基本指导图片 MES_计划BOM_工位与名称 + /// + /// + /// + public static void OpNameGuidBasicPic_Select(string opName, out DataTable dt) + { + string sql; + sql = "select 工位基本指导图片 from MES_计划BOM_工位与名称 where 工位号='" + opName + "'"; + //如果与SqlServer数据库通讯正常(同步通讯) + //if (SQLCommon.SqlServerConnectionStatus) + { + if (!DataAccess.ExecuteDataTable(sql, out dt)) + { + //DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + + } + + } + ////如果与SqlServer数据库通讯不正常(异步通讯) + //else + //{ + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + } + + /// + /// update [MES_计划BOM_工位与名称] set 工位基本指导图片=@工位基本指导图片 where 工位号 + /// + /// + /// + //static public bool OpNameGuidBasicPic_Update(string opName, DataTable dt) + //{ + // string sql; + // sql = + // "update [MES_计划BOM_工位与名称] set 工位基本指导图片=? where 工位号='" + opName + "'"; + // OleDbParameter[] thisParms = new OleDbParameter[1]; + // //thisParms[0] = new OleDbParameter("@工位基本指导图片", dt.Rows[0]["工位基本指导图片"]); + // thisParms[0] = new OleDbParameter("@工位基本指导图片", OleDbType.Binary, 0, "工位基本指导图片"); + // return DataAccess.ExecuteDataTable_OleDb_Update(sql, dt, ref thisParms); + + //} + + /// + /// select 工位基本指导图片 MES_计划BOM_工位与名称 + /// + /// + /// + public static void OpNameGuidPic_Select(string opName, out DataTable dt) + { + string sql; + sql = "select 发动机型号代码,工位操作指导,工位指导图片 from [MES_计划BOM_工位操作指南] where 工位号='" + opName + "'"; + DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// update [MES_计划BOM_工位与名称] set 工位基本指导图片=@工位基本指导图片 where 工位号 + /// + /// + /// + //static public bool OpNameGuidPic_Update(string opName, DataTable dt) + //{ + // string sql; + // sql = "update [MES_计划BOM_工位操作指南] set 工位操作指导=?,工位指导图片=? where 发动机型号代码=? and 工位号='" + opName + "'"; + // OleDbParameter[] thisParms = new OleDbParameter[3]; + // //thisParms[0] = new OleDbParameter("@工位基本指导图片", dt.Rows[0]["工位基本指导图片"]); + // thisParms[0] = new OleDbParameter("@工位操作指导", OleDbType.VarChar, 255, "工位操作指导"); + // thisParms[1] = new OleDbParameter("@工位指导图片", OleDbType.Binary, 0, "工位指导图片"); + // thisParms[2] = new OleDbParameter("@发动机型号代码", OleDbType.Integer, 4, "发动机型号代码"); + + // return DataAccess.ExecuteDataTable_OleDb_Update(sql, dt, ref thisParms); + + //} + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.Data.GetData/vssver2.scc b/Common/07WebBusinessFacade/BusinessFacade/MES.Data.GetData/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..6d844a535e8557596b362c995ded19d60eb41207 GIT binary patch literal 194 zcmXpJVq~~_m%l5bInsUAj6{**Nns*hKik>7nHU(D85kIRfV6aNYBtBhFZzr?zAupP zmY2c|mleI1HWhDFr%d6=7dIp!LCc!AD(&Eg#)Z${d#N@=3RDEC9U_F<_l0-fC z)DjTQ0Hpm3{1S6h{fkmki`?>ya`lpn89>UMGOP4LiV~AkLlTp6QehfEvJegKrI{%p F9sncaI`IGi literal 0 HcmV?d00001 diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.Data.SaveData/MES.Biz.Material.SaveData.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.Data.SaveData/MES.Biz.Material.SaveData.cs new file mode 100644 index 0000000..17abc84 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.Data.SaveData/MES.Biz.Material.SaveData.cs @@ -0,0 +1,338 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using System.Data.OleDb; + +//using SystemFramework; +using DataLinkMesWork; +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + /// + /// MES_装配数据_零部件追溯_数据主表 + /// + /// + static public void AssemblyPartIndexTableInsert(out long traceID) + { + traceID = 0; + try + { + string sql = GetSqlStringAssemblyPartIndexTable(); + //if (SQLCommon.SqlServerConnectionStatus) + { + DataAccess.ExecuteNonQuery_newID(sql, out traceID); + + } + //if (!SQLCommon.SqlServerConnectionStatus) + //{ + // DataAccess.ExecuteNonQuery_newID_OleDb(sql, out traceID); + //} + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + } + } + /// + /// MES_装配数据_零部件追溯_增加 + /// + /// + /// + public static void VerifyAssemblyPartTableInsert(DataTable dt) + { + + //if (SQLCommon.SqlServerConnectionStatus) + { + //如果与SQL Server 数据库通讯失败,ApplicationConfig.connectionStringPIS_NEW_Value = "0" + VerifyAssemblyPartTableInsert_SqlServer(dt); + } + //if (!SQLCommon.SqlServerConnectionStatus) + //{ + // VerifyAssemblyPartTableInsert_Access(dt); + //} + + } + /// + /// 同步通讯方式 + /// MES_装配数据_零部件追溯_增加 + /// SQL Server 数据库 + /// + /// + /// + public static bool VerifyAssemblyPartTableInsert_SqlServer(DataTable dt) + { + string sql; + sql = "INSERT INTO [MES_装配数据_零部件追溯]" + + "([追溯代码],[订单号],[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + + "[发动机数量], [厂牌编号起始号], [客户名称],[投料日期],[文件编号],[集团名称],[通知号]," + + "[功率],[指南文件编号],[装机状态],[适用状态],[物料描述],[计划下达日期],[计划完工日期]," + + "[主配厂家],[工位号], [工位名称],[物料号], [零件图号], [零件名称], [零件数量]," + + "[是否扫描],[扫描方式代码], [扫描方式], [是否主物料],[厂家代码],[生产厂家], " + + "[操作指导],[发动机号],[追踪代码],[主物料号],[物料号表索引号],[零件数量验证]," + + "[物料条码], [物料条码物料号], [物料条码批次],[验证结果], [操作者工号], [操作者姓名], [班次代码], " + + "物料来源代码,物料来源,是否禁用代码,是否禁用,被强制验证物料号," + + "更改代码,更改原因,零件类型,操作时间)" + + + "VALUES(@追溯代码,@订单号,@SAP物料号,@发动机型号,@发动机型号代码,@发动机机型," + + "@发动机数量,@厂牌编号起始号,@客户名称,@投料日期,@文件编号,@集团名称,@通知号," + + "@功率,@指南文件编号,@装机状态,@适用状态,@物料描述,@计划下达日期,@计划完工日期," + + "@主配厂家,@工位号,@工位名称,@物料号,@零件图号,@零件名称,@零件数量," + + " @是否扫描,@扫描方式代码,@扫描方式,@是否主物料,@厂家代码,@生产厂家," + + "@操作指导,@发动机号,@追踪代码,@主物料号,@物料号表索引号,@零件数量验证," + + "@物料条码,@物料条码物料号,@物料条码批次,@验证结果,@操作者工号,@操作者姓名,@班次代码," + + "@物料来源代码,@物料来源,@是否禁用代码,@是否禁用,@被强制验证物料号," + + "@更改代码,@更改原因,@零件类型,@操作时间)"; + + + + SqlParameter[] thisParmsSql = new SqlParameter[55]; + // + "([订单号],[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + thisParmsSql[0] = new SqlParameter("@追溯代码", SqlDbType.Int, 4, "追溯代码"); + thisParmsSql[1] = new SqlParameter("@订单号", SqlDbType.NVarChar, 50, "订单号"); + thisParmsSql[2] = new SqlParameter("@SAP物料号", SqlDbType.NVarChar, 50, "SAP物料号"); + thisParmsSql[3] = new SqlParameter("@发动机型号", SqlDbType.NVarChar, 50, "发动机型号"); + thisParmsSql[4] = new SqlParameter("@发动机型号代码", SqlDbType.Int, 4, "发动机型号代码"); + thisParmsSql[5] = new SqlParameter("@发动机机型", SqlDbType.NVarChar, 50, "发动机机型"); + + // + "@发动机数量,@厂牌编号起始号,@客户名称,@投料日期,@文件编号,@集团名称,@通知号," + thisParmsSql[6] = new SqlParameter("@发动机数量", SqlDbType.Int, 4, "发动机数量"); + thisParmsSql[7] = new SqlParameter("@厂牌编号起始号", SqlDbType.Int, 4, "厂牌编号起始号"); + thisParmsSql[8] = new SqlParameter("@客户名称", SqlDbType.NVarChar, 50, "客户名称"); + thisParmsSql[9] = new SqlParameter("@投料日期", SqlDbType.DateTime, 8, "投料日期"); + thisParmsSql[10] = new SqlParameter("@文件编号", SqlDbType.NVarChar, 50, "文件编号"); + thisParmsSql[11] = new SqlParameter("@集团名称", SqlDbType.NVarChar, 50, "集团名称"); + thisParmsSql[12] = new SqlParameter("@通知号", SqlDbType.NVarChar, 50, "通知号"); + + // + "@功率,@指南文件编号,@装机状态,@适用状态,@物料描述,@计划下达日期,@计划完工日期," + thisParmsSql[13] = new SqlParameter("@功率", SqlDbType.NVarChar, 50, "功率"); + thisParmsSql[14] = new SqlParameter("@指南文件编号", SqlDbType.NVarChar, 50, "指南文件编号"); + thisParmsSql[15] = new SqlParameter("@装机状态", SqlDbType.NVarChar, 50, "装机状态"); + thisParmsSql[16] = new SqlParameter("@适用状态", SqlDbType.DateTime, 8, "适用状态"); + thisParmsSql[17] = new SqlParameter("@物料描述", SqlDbType.NVarChar, 255, "物料描述"); + thisParmsSql[18] = new SqlParameter("@计划下达日期", SqlDbType.DateTime, 8, "计划下达日期"); + thisParmsSql[19] = new SqlParameter("@计划完工日期", SqlDbType.DateTime, 8, "计划完工日期"); + + // + "@主配厂家,@工位号,@工位名称,@物料号,@零件图号,@零件名称,@零件数量," + + thisParmsSql[20] = new SqlParameter("@主配厂家", SqlDbType.NVarChar, 50, "主配厂家"); + thisParmsSql[21] = new SqlParameter("@工位号", SqlDbType.NVarChar, 50, "工位号"); + thisParmsSql[22] = new SqlParameter("@工位名称", SqlDbType.NVarChar, 50, "工位名称"); + thisParmsSql[23] = new SqlParameter("@物料号", SqlDbType.NVarChar, 50, "物料号"); + thisParmsSql[24] = new SqlParameter("@零件图号", SqlDbType.NVarChar, 50, "零件图号"); + thisParmsSql[25] = new SqlParameter("@零件名称", SqlDbType.NVarChar, 50, "零件名称"); + thisParmsSql[26] = new SqlParameter("@零件数量", SqlDbType.Int, 4, "零件数量"); + + // +"[是否扫描],扫描方式代码, [扫描方式], [厂家代码],[生产厂家], " + + thisParmsSql[27] = new SqlParameter("@是否扫描", SqlDbType.Int, 4, "是否扫描"); + thisParmsSql[28] = new SqlParameter("@扫描方式代码", SqlDbType.Int, 4, "扫描方式代码"); + thisParmsSql[29] = new SqlParameter("@扫描方式", SqlDbType.NVarChar, 50, "扫描方式"); + thisParmsSql[30] = new SqlParameter("@是否主物料", SqlDbType.Int, 4, "是否主物料"); + thisParmsSql[31] = new SqlParameter("@厂家代码", SqlDbType.NVarChar, 50, "厂家代码"); + thisParmsSql[32] = new SqlParameter("@生产厂家", SqlDbType.NVarChar, 50, "生产厂家"); + + //+ "@操作指导,@发动机号,@物料号表索引号,@零件数量验证," + + thisParmsSql[33] = new SqlParameter("@操作指导", SqlDbType.NVarChar, 255, "操作指导"); + thisParmsSql[34] = new SqlParameter("@发动机号", SqlDbType.NVarChar, 50, "发动机号"); + thisParmsSql[35] = new SqlParameter("@追踪代码", SqlDbType.NVarChar, 50, "追踪代码"); + thisParmsSql[36] = new SqlParameter("@主物料号", SqlDbType.NVarChar, 50, "主物料号"); + thisParmsSql[37] = new SqlParameter("@物料号表索引号", SqlDbType.Int, 4, "物料号表索引号"); + thisParmsSql[38] = new SqlParameter("@零件数量验证", SqlDbType.Int, 4, "零件数量验证"); + + // +"[物料条码], [物料条码物料号], [物料条码批次],@验证结果, [操作者工号], [操作者姓名], [班次代码], " + thisParmsSql[39] = new SqlParameter("@物料条码", SqlDbType.NVarChar, 50, "物料条码"); + thisParmsSql[40] = new SqlParameter("@物料条码物料号", SqlDbType.NVarChar, 50, "物料条码物料号"); + thisParmsSql[41] = new SqlParameter("@物料条码批次", SqlDbType.NVarChar, 50, "物料条码批次"); + thisParmsSql[42] = new SqlParameter("@验证结果", SqlDbType.Int, 4, "验证结果"); + thisParmsSql[43] = new SqlParameter("@操作者工号", SqlDbType.NVarChar, 50, "操作者工号"); + thisParmsSql[44] = new SqlParameter("@操作者姓名", SqlDbType.NVarChar, 50, "操作者姓名"); + thisParmsSql[45] = new SqlParameter("@班次代码", SqlDbType.NVarChar, 50, "班次代码"); + + // +"物料来源代码,物料来源,是否禁用代码,是否禁用,被强制验证物料号,更改代码,更改原因)" + + thisParmsSql[46] = new SqlParameter("@物料来源代码", SqlDbType.Int, 4, "物料来源代码"); + thisParmsSql[47] = new SqlParameter("@物料来源", SqlDbType.NVarChar, 50, "物料来源"); + thisParmsSql[48] = new SqlParameter("@是否禁用代码", SqlDbType.Int, 4, "是否禁用代码"); + thisParmsSql[49] = new SqlParameter("@是否禁用", SqlDbType.NVarChar, 50, "是否禁用"); + thisParmsSql[50] = new SqlParameter("@被强制验证物料号", SqlDbType.NVarChar, 50, "被强制验证物料号"); + thisParmsSql[51] = new SqlParameter("@更改代码", SqlDbType.NVarChar, 50, "更改代码"); + thisParmsSql[52] = new SqlParameter("@更改原因", SqlDbType.NVarChar, 255, "更改原因"); + thisParmsSql[53] = new SqlParameter("@零件类型", SqlDbType.Int, 4, "零件类型"); + thisParmsSql[54] = new SqlParameter("@操作时间", SqlDbType.DateTime, 8, "操作时间"); + if (dt == null) return false; + //如果与SQL Server 数据库通讯失败,ApplicationConfig.connectionStringPIS_NEW_Value = "0" + + return DataAccess.ExecuteSQL(sql, ref thisParmsSql, dt); + + + + } + /// + /// 异步通讯方式 + /// 增加数据到Access数据库 + /// MES_装配数据_零部件追溯 + /// INSERT INTO [MES_装配数据_零部件追溯] + /// + /// + /// + //public static bool VerifyAssemblyPartTableInsert_Access(DataTable dt) + //{ + // string sql; + // sql = "INSERT INTO [MES_装配数据_零部件追溯]" + // + "([追溯代码],[订单号],[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + // + "[发动机数量], [厂牌编号起始号], [客户名称],[投料日期],[文件编号],[集团名称],[通知号]," + // + "[功率],[指南文件编号],[装机状态],[适用状态],[物料描述],[计划下达日期],[计划完工日期]," + // + "[主配厂家],[工位号], [工位名称],[物料号], [零件图号], [零件名称], [零件数量]," + // + "[是否扫描],[扫描方式代码], [扫描方式], [是否主物料],[厂家代码],[生产厂家], " + // + "[操作指导],[发动机号],[追踪代码],[主物料号],[物料号表索引号],[零件数量验证]," + // + "[物料条码], [物料条码物料号], [物料条码批次],[验证结果], [操作者工号], [操作者姓名], [班次代码], " + // + "物料来源代码,物料来源,是否禁用代码,是否禁用,被强制验证物料号,更改代码,更改原因,零件类型,操作时间)" + + // + "VALUES(@追溯代码,@订单号,@SAP物料号,@发动机型号,@发动机型号代码,@发动机机型," + // + "@发动机数量,@厂牌编号起始号,@客户名称,@投料日期,@文件编号,@集团名称,@通知号," + // + "@功率,@指南文件编号,@装机状态,@适用状态,@物料描述,@计划下达日期,@计划完工日期," + // + "@主配厂家,@工位号,@工位名称,@物料号,@零件图号,@零件名称,@零件数量," + // + " @是否扫描,@扫描方式代码,@扫描方式,@是否主物料,@厂家代码,@生产厂家," + // + "@操作指导,@发动机号,@追踪代码,@主物料号,@物料号表索引号,@零件数量验证," + // + "@物料条码,@物料条码物料号,@物料条码批次,@验证结果,@操作者工号,@操作者姓名,@班次代码," + // + "@物料来源代码,@物料来源,@是否禁用代码,@是否禁用,@被强制验证物料号," + // + "@更改代码,@更改原因,@零件类型,@操作时间)"; + + + // OleDbParameter[] thisParms1 = new OleDbParameter[55]; + // // + "([追溯代码],[订单号],[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + // thisParms1[0] = new OleDbParameter("@追溯代码", OleDbType.Integer, 4, "追溯代码"); + // thisParms1[1] = new OleDbParameter("@订单号", OleDbType.VarChar, 50, "订单号"); + // thisParms1[2] = new OleDbParameter("@SAP物料号", OleDbType.VarChar, 50, "SAP物料号"); + // thisParms1[3] = new OleDbParameter("@发动机型号", OleDbType.VarChar, 50, "发动机型号"); + // thisParms1[4] = new OleDbParameter("@发动机型号代码", OleDbType.Integer, 4, "发动机型号代码"); + // thisParms1[5] = new OleDbParameter("@发动机机型", OleDbType.VarChar, 50, "发动机机型"); + + // // + "@发动机数量,@厂牌编号起始号,@客户名称,@投料日期,@文件编号,@集团名称,@通知号," + // thisParms1[6] = new OleDbParameter("@发动机数量", OleDbType.Integer, 4, "发动机数量"); + // thisParms1[7] = new OleDbParameter("@厂牌编号起始号", OleDbType.Integer, 4, "厂牌编号起始号"); + // thisParms1[8] = new OleDbParameter("@客户名称", OleDbType.VarChar, 50, "客户名称"); + // thisParms1[9] = new OleDbParameter("@投料日期", OleDbType.DBDate, 8, "投料日期"); + // thisParms1[10] = new OleDbParameter("@文件编号", OleDbType.VarChar, 50, "文件编号"); + // thisParms1[11] = new OleDbParameter("@集团名称", OleDbType.VarChar, 50, "集团名称"); + // thisParms1[12] = new OleDbParameter("@通知号", OleDbType.VarChar, 50, "通知号"); + + // // + "@功率,@指南文件编号,@装机状态,@适用状态,@物料描述,@计划下达日期,@计划完工日期," + // thisParms1[13] = new OleDbParameter("@功率", OleDbType.VarChar, 50, "功率"); + // thisParms1[14] = new OleDbParameter("@指南文件编号", OleDbType.VarChar, 50, "指南文件编号"); + // thisParms1[15] = new OleDbParameter("@装机状态", OleDbType.VarChar, 50, "装机状态"); + // thisParms1[16] = new OleDbParameter("@适用状态", OleDbType.DBDate, 8, "适用状态"); + // thisParms1[17] = new OleDbParameter("@物料描述", OleDbType.VarChar, 255, "物料描述"); + // thisParms1[18] = new OleDbParameter("@计划下达日期", OleDbType.DBDate, 8, "计划下达日期"); + // thisParms1[19] = new OleDbParameter("@计划完工日期", OleDbType.DBDate, 8, "计划完工日期"); + + // // + "@主配厂家,@工位号,@工位名称,@物料号,@零件图号,@零件名称,@零件数量," + + // thisParms1[20] = new OleDbParameter("@主配厂家", OleDbType.VarChar, 50, "主配厂家"); + // thisParms1[21] = new OleDbParameter("@工位号", OleDbType.VarChar, 50, "工位号"); + // thisParms1[22] = new OleDbParameter("@工位名称", OleDbType.VarChar, 50, "工位名称"); + // thisParms1[23] = new OleDbParameter("@物料号", OleDbType.VarChar, 50, "物料号"); + // thisParms1[24] = new OleDbParameter("@零件图号", OleDbType.VarChar, 50, "零件图号"); + // thisParms1[25] = new OleDbParameter("@零件名称", OleDbType.VarChar, 50, "零件名称"); + // thisParms1[26] = new OleDbParameter("@零件数量", OleDbType.Integer, 4, "零件数量"); + + // // +"[是否扫描],扫描方式代码, [扫描方式], [厂家代码],[生产厂家], " + + // thisParms1[27] = new OleDbParameter("@是否扫描", OleDbType.Integer, 4, "是否扫描"); + // thisParms1[28] = new OleDbParameter("@扫描方式代码", OleDbType.Integer, 4, "扫描方式代码"); + // thisParms1[29] = new OleDbParameter("@扫描方式", OleDbType.VarChar, 50, "扫描方式"); + // thisParms1[30] = new OleDbParameter("@是否主物料", OleDbType.Integer, 4, "是否主物料"); + // thisParms1[31] = new OleDbParameter("@厂家代码", OleDbType.VarChar, 50, "厂家代码"); + // thisParms1[32] = new OleDbParameter("@生产厂家", OleDbType.VarChar, 50, "生产厂家"); + + // //+ "@操作指导,@发动机号,@物料号表索引号,@零件数量验证," + + // thisParms1[33] = new OleDbParameter("@操作指导", OleDbType.VarChar, 255, "操作指导"); + // thisParms1[34] = new OleDbParameter("@发动机号", OleDbType.VarChar, 50, "发动机号"); + // thisParms1[35] = new OleDbParameter("@追踪代码", OleDbType.VarChar, 50, "追踪代码"); + // thisParms1[36] = new OleDbParameter("@主物料号", OleDbType.VarChar, 50, "主物料号"); + // thisParms1[37] = new OleDbParameter("@物料号表索引号", OleDbType.Integer, 4, "物料号表索引号"); + // thisParms1[38] = new OleDbParameter("@零件数量验证", OleDbType.Integer, 4, "零件数量验证"); + + // // +"[物料条码], [物料条码物料号], [物料条码批次],@验证结果, [操作者工号], [操作者姓名], [班次代码], " + // thisParms1[39] = new OleDbParameter("@物料条码", OleDbType.VarChar, 50, "物料条码"); + // thisParms1[40] = new OleDbParameter("@物料条码物料号", OleDbType.VarChar, 50, "物料条码物料号"); + // thisParms1[41] = new OleDbParameter("@物料条码批次", OleDbType.VarChar, 50, "物料条码批次"); + // thisParms1[42] = new OleDbParameter("@验证结果", OleDbType.Integer, 4, "验证结果"); + // thisParms1[43] = new OleDbParameter("@操作者工号", OleDbType.VarChar, 50, "操作者工号"); + // thisParms1[44] = new OleDbParameter("@操作者姓名", OleDbType.VarChar, 50, "操作者姓名"); + // thisParms1[45] = new OleDbParameter("@班次代码", OleDbType.VarChar, 50, "班次代码"); + + // // +"物料来源代码,物料来源,是否禁用代码,是否禁用,被强制验证物料号,更改代码,更改原因)" + + // thisParms1[46] = new OleDbParameter("@物料来源代码", OleDbType.Integer, 4, "物料来源代码"); + // thisParms1[47] = new OleDbParameter("@物料来源", OleDbType.VarChar, 50, "物料来源"); + // thisParms1[48] = new OleDbParameter("@是否禁用代码", OleDbType.Integer, 4, "是否禁用代码"); + // thisParms1[49] = new OleDbParameter("@是否禁用", OleDbType.VarChar, 50, "是否禁用"); + // thisParms1[50] = new OleDbParameter("@被强制验证物料号", OleDbType.VarChar, 50, "被强制验证物料号"); + // thisParms1[51] = new OleDbParameter("@更改代码", OleDbType.VarChar, 50, "更改代码"); + // thisParms1[52] = new OleDbParameter("@更改原因", OleDbType.VarChar, 255, "更改原因"); + // thisParms1[53] = new OleDbParameter("@零件类型", OleDbType.Integer, 4, "零件类型"); + // thisParms1[54] = new OleDbParameter("@操作时间", OleDbType.DBTimeStamp, 8, "操作时间"); + + // return DataAccess.ExecuteDataTable_OleDb_Insert_Access(sql, dt, ref thisParms1); + //} + /// + /// 获得增加表[MES_装配数据_零部件追溯_数据主表]的SQL语句 + /// + private static string GetSqlStringAssemblyPartIndexTable() + { + string sql = null; + sql = "INSERT INTO [MES_装配数据_零部件追溯_数据主表] " + + "(订单号,订单计划发动机号,发动机号,追踪代码,主物料号,工位号,到达时间,离开时间,操作者工号,班次代码," + + "[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + + "[发动机数量], [厂牌编号起始号], [客户名称],[投料日期],[文件编号],[集团名称],[通知号]," + + "[功率],[指南文件编号],[装机状态],[适用状态],[物料描述],[计划下达日期],[计划完工日期],[主配厂家],[零件类型],[是否禁用],[返修标志])" + + " VALUES (" + //订单号,发动机号,追踪代码,工位号,到达时间,离开时间,操作者工号,班次代码 + + "'" + MaterialData.orderForm + "'," + + "'" + MaterialData.engineNumber_OrderPlan + "'," + + "'" + MaterialData.engineNumber + "'," + + "'" + MaterialData.engineTraceCode + "'," + + "'" + MaterialData.mainMaterialNumber + "'," + + "'" + MaterialData.opName + "'," + + "'" + MaterialData.arrivedTime.ToString("G") + "'," + + "'" + MaterialData.leavedTime.ToString("G") + "'," + + "'" + MaterialData.operatorCode + "'," + + "'" + MaterialData.operatorShift + "'," + //+ "[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + + + "'" + MaterialData.sAPMaterialNumber + "'," + + "'" + MaterialData.engineNumberType + "'," + + "" + MaterialData.engineNumberCode + ","//int + + "'" + MaterialData.engineNumberBasicType + "'," + //+ "[发动机数量], [厂牌编号起始号], [客户名称],[投料日期],[文件编号],[集团名称],[通知号]," + + + "" + MaterialData.engineCount + ","//int + + "'" + MaterialData.engineNumberFirstID + "',"//int + + "'" + MaterialData.customesName + "'," + + "'" + MaterialData.prepareMaterialDateTime.ToString("G") + "'," + + "'" + MaterialData.fileCode + "'," + + "'" + MaterialData.groupName + "'," + + "'" + MaterialData.notifyCode + "'," + //+ "[功率],[指南文件编号],[装机状态],[适用状态],[物料描述],[计划下达日期],[计划完工日期],主配厂家,零件类型,是否禁用,返修标志" + + "'" + MaterialData.n_Force + "'," + + "'" + MaterialData.directFileCode + "'," + + "'" + MaterialData.workEngineStatus + "'," + + "'" + MaterialData.adaptDateTime.ToString("G") + "'," + + "'" + MaterialData.materialDescript + "'," + + "'" + MaterialData.planSendedDateTime.ToString("G") + "'," + + "'" + MaterialData.planFinishDateTime.ToString("G") + "'," + + "'" + MaterialData.mainPruduceFatory + "'," + + "" + MaterialData.partType.ToString() + "," + + "" + MaterialData.isMainMaterial.ToString() + "," + + "" + MaterialData.isRepairID.ToString() + ") "; + return sql; + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.Data.SaveData/MES.Biz.TraceTable.SaveData.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.Data.SaveData/MES.Biz.TraceTable.SaveData.cs new file mode 100644 index 0000000..e64eafd --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.Data.SaveData/MES.Biz.TraceTable.SaveData.cs @@ -0,0 +1,222 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using System.Data.OleDb; + +//using SystemFramework; +using DataLinkMesWork; +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + /// + /// 保存[MES_装配数据_发动机号_追踪代码] + /// 与SqlServer连接正常,保存到SqlServer数据库中; + /// 与SqlServer连接不正常,保存到SqlServer数据库中; + /// + public static void TableTraceInsert_SaveData() + { + DataTable dt; + dt = TraceCodeDataTableUpdate_Access(); + //if (!SQLCommon.SqlServerConnectionStatus) + //{ + // TableTraceInsert_Access(dt); + //} + //else + { + TableTraceInsert_SqlServer(dt); + } + } + + + /// + /// [MES_装配数据_发动机号_追踪代码]数据保存到本地PC的Access数据库中 + /// + //private static bool TableTraceInsert_Access(DataTable dt) + //{ + // string sql = null; + // sql = + // "INSERT INTO [MES_装配数据_发动机号_追踪代码] " + + // "(订单号,订单计划发动机号,发动机号,追踪代码,主物料号,工位号,操作者工号,班次代码," + + // "[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型])" + + // "VALUES(@订单号,@订单计划发动机号,@发动机号,@追踪代码,@主物料号,@工位号,@操作者工号,@班次代码," + + // "@SAP物料号,@发动机型号,@发动机型号代码,@发动机机型)"; + // OleDbParameter[] thisParms = new OleDbParameter[12]; + // thisParms[0] = new OleDbParameter("@订单号", OleDbType.VarChar, 50, "订单号"); + // thisParms[1] = new OleDbParameter("@订单计划发动机号", OleDbType.VarChar, 50, "订单计划发动机号"); + // thisParms[2] = new OleDbParameter("@发动机号", OleDbType.VarChar, 50, "发动机号"); + // thisParms[3] = new OleDbParameter("@追踪代码", OleDbType.VarChar, 50, "追踪代码"); + // thisParms[4] = new OleDbParameter("@主物料号", OleDbType.VarChar, 50, "主物料号"); + // thisParms[5] = new OleDbParameter("@工位号", OleDbType.VarChar, 50, "工位号"); + // thisParms[6] = new OleDbParameter("@操作者工号", OleDbType.VarChar, 50, "操作者工号"); + // thisParms[7] = new OleDbParameter("@班次代码", OleDbType.VarChar, 50, "班次代码"); + // thisParms[8] = new OleDbParameter("@SAP物料号", OleDbType.VarChar, 50, "SAP物料号"); + // thisParms[9] = new OleDbParameter("@发动机型号", OleDbType.VarChar, 50, "发动机型号"); + // thisParms[10] = new OleDbParameter("@发动机型号代码", OleDbType.Integer, 4, "发动机型号代码"); + // thisParms[11] = new OleDbParameter("@发动机机型", OleDbType.VarChar, 50, "发动机机型"); + // return DataAccess.ExecuteDataTable_OleDb_Insert_Access(sql, dt, ref thisParms); + //} + /// + /// [MES_装配数据_发动机号_追踪代码]保存到SqlServer数据库服务器 + /// + /// + /// + private static bool TableTraceInsert_SqlServer(DataTable dt) + { + string sql = null; + sql = + "INSERT INTO [MES_装配数据_发动机号_追踪代码] " + + "(订单号,订单计划发动机号,发动机号,追踪代码,主物料号,工位号,操作者工号,班次代码," + + "[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型])" + + "VALUES(@订单号,@订单计划发动机号,@发动机号,@追踪代码,@主物料号,@工位号,@操作者工号,@班次代码," + + "@SAP物料号,@发动机型号,@发动机型号代码,@发动机机型)"; + SqlParameter[] thisParms = new SqlParameter[12]; + thisParms[0] = new SqlParameter("@订单号", SqlDbType.NVarChar, 50, "订单号"); + thisParms[1] = new SqlParameter("@订单计划发动机号", SqlDbType.NVarChar, 50, "订单计划发动机号"); + thisParms[2] = new SqlParameter("@发动机号", SqlDbType.NVarChar, 50, "发动机号"); + thisParms[3] = new SqlParameter("@追踪代码", SqlDbType.NVarChar, 50, "追踪代码"); + thisParms[4] = new SqlParameter("@主物料号", SqlDbType.NVarChar, 50, "主物料号"); + thisParms[5] = new SqlParameter("@工位号", SqlDbType.NVarChar, 50, "工位号"); + thisParms[6] = new SqlParameter("@操作者工号", SqlDbType.NVarChar, 50, "操作者工号"); + thisParms[7] = new SqlParameter("@班次代码", SqlDbType.NVarChar, 50, "班次代码"); + thisParms[8] = new SqlParameter("@SAP物料号", SqlDbType.NVarChar, 50, "SAP物料号"); + thisParms[9] = new SqlParameter("@发动机型号", SqlDbType.NVarChar, 50, "发动机型号"); + thisParms[10] = new SqlParameter("@发动机型号代码", SqlDbType.Int, 4, "发动机型号代码"); + thisParms[11] = new SqlParameter("@发动机机型", SqlDbType.NVarChar, 50, "发动机机型"); + return DataAccess.ExecuteSQL(sql, ref thisParms, dt); + //OleDbParameter[] thisParms = new OleDbParameter[12]; + //thisParms[0] = new OleDbParameter("@订单号", OleDbType.VarChar, 50, "订单号"); + //thisParms[1] = new OleDbParameter("@订单计划发动机号", OleDbType.VarChar, 50, "订单计划发动机号"); + //thisParms[2] = new OleDbParameter("@发动机号", OleDbType.VarChar, 50, "发动机号"); + //thisParms[3] = new OleDbParameter("@追踪代码", OleDbType.VarChar, 50, "追踪代码"); + //thisParms[4] = new OleDbParameter("@主物料号", OleDbType.VarChar, 50, "主物料号"); + //thisParms[5] = new OleDbParameter("@工位号", OleDbType.VarChar, 50, "工位号"); + //thisParms[6] = new OleDbParameter("@操作者工号", OleDbType.VarChar, 50, "操作者工号"); + //thisParms[7] = new OleDbParameter("@班次代码", OleDbType.VarChar, 50, "班次代码"); + //thisParms[8] = new OleDbParameter("@SAP物料号", OleDbType.VarChar, 50, "SAP物料号"); + //thisParms[9] = new OleDbParameter("@发动机型号", OleDbType.VarChar, 50, "发动机型号"); + //thisParms[10] = new OleDbParameter("@发动机型号代码", OleDbType.Integer, 4, "发动机型号代码"); + //thisParms[11] = new OleDbParameter("@发动机机型", OleDbType.VarChar, 50, "发动机机型"); + //return DataAccess.ExecuteDataTable_OleDb_Insert_SqlServer(sql, dt, ref thisParms); + } + /// + /// 创建临时表[MES_装配数据_发动机号_追踪代码] + /// + /// + private static DataTable CreateEngineTraceCodeDataTable() + { + DataTable dt; + dt = new DataTable(); + dt.Columns.Add("订单号", typeof(string)); + dt.Columns.Add("订单计划发动机号", typeof(string)); + dt.Columns.Add("发动机号", typeof(string)); + dt.Columns.Add("追踪代码", typeof(string)); + dt.Columns.Add("主物料号", typeof(string)); + dt.Columns.Add("工位号", typeof(string)); + dt.Columns.Add("操作者工号", typeof(string)); + dt.Columns.Add("班次代码", typeof(string)); + dt.Columns.Add("SAP物料号", typeof(string)); + dt.Columns.Add("发动机型号", typeof(string)); + dt.Columns.Add("发动机型号代码", typeof(int)); + dt.Columns.Add("发动机机型", typeof(string)); + return dt; + } + /// + /// 上线工位的[MES_装配数据_发动机号_追踪代码]数据 + /// + /// + private DataTable GetTraceCodeDataTable() + { + DataTable dt; + dt = CreateEngineTraceCodeDataTable(); + DataRow dr; + dr = dt.NewRow(); + dr["订单号"] = MaterialData.orderForm; + dr["订单计划发动机号"] = MaterialData.engineNumber_OrderPlan; + dr["发动机号"] = MaterialData.engineNumber; + dr["追踪代码"] = MaterialData.engineTraceCode; + dr["主物料号"] = MaterialData.mainMaterialNumber; + dr["工位号"] = MaterialData.opName; + dr["操作者工号"] = MaterialData.operatorCode; + dr["班次代码"] = MaterialData.operatorShift; + dr["SAP物料号"] = MaterialData.sAPMaterialNumber; + dr["发动机型号"] = MaterialData.engineNumberType; + dr["发动机型号代码"] = MaterialData.engineNumberCode; + dr["发动机机型"] = MaterialData.engineNumberBasicType; + dt.Rows.Add(dr); + return dt; + } + /// + /// 上线工位的[MES_装配数据_发动机号_追踪代码]数据 + /// 从本工位 + /// + /// + //public static bool GetTraceCodeDataTableFromAccess(string opName, out DataTable dt) + //{ + // string sql; + // sql = "select 订单号,订单计划发动机号,发动机号,追踪代码,主物料号,工位号,操作者工号,班次代码,SAP物料号,发动机型号,发动机型号代码,发动机机型" + // + " from MES_装配数据_发动机号_追踪代码 where IsOK=0 and 工位号='" + opName + "'"; + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + /// + /// 更新IsOK = 1 [MES_装配数据_发动机号_追踪代码]数据 + /// + /// + //public static bool GetTraceCodeDataTableFromAccess_Update(string opName) + //{ + // string sql; + // sql = "update MES_装配数据_发动机号_追踪代码 set IsOK = 1 where IsOK=0 and 工位号='" + opName + "'"; + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + + /// + /// 数据库同步,应用于分装线线首工位 + /// [数据MES_装配数据_发动机号_追踪代码_下达工位] + /// 从到Access中获得[数据MES_装配数据_发动机号_追踪代码_下达工位]数据, + /// 保存SqlServer数据库服务器,同时更新[是否同步]标志。 + /// + /// 当前工位 + /// + //public static void GetTraceCodeDataTableFromAccess_OpName_InsertIntoSqlServer(string opName) + //{ + // DataTable dt; + // if (GetTraceCodeDataTableFromAccess(opName, out dt)) + // { + // if (TableTraceInsert_SqlServer(dt)) + // { + // GetTraceCodeDataTableFromAccess_Update(opName); + // } + // } + //} + /// + /// 上线工位的[MES_装配数据_发动机号_追踪代码] + /// 对于分线上线工位,要将IsOK=0的行上传到分装部件的总线上线工位;上传后,该值置1。 + /// + /// + private static DataTable TraceCodeDataTableUpdate_Access() + { + + DataTable dt; + dt = CreateEngineTraceCodeDataTable(); + DataRow dr; + dr = dt.NewRow(); + dr["订单号"] = MaterialData.orderForm; + dr["订单计划发动机号"] = MaterialData.engineNumber_OrderPlan; + dr["发动机号"] = MaterialData.engineNumber; + dr["追踪代码"] = MaterialData.engineTraceCode; + dr["主物料号"] = MaterialData.mainMaterialNumber; + dr["工位号"] = MaterialData.opName; + dr["操作者工号"] = MaterialData.operatorCode; + dr["班次代码"] = MaterialData.operatorShift; + dr["SAP物料号"] = MaterialData.sAPMaterialNumber; + dr["发动机型号"] = MaterialData.engineNumberType; + dr["发动机型号代码"] = MaterialData.engineNumberCode; + dr["发动机机型"] = MaterialData.engineNumberBasicType; + dt.Rows.Add(dr); + return dt; + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.Data.SaveData/vssver2.scc b/Common/07WebBusinessFacade/BusinessFacade/MES.Data.SaveData/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..c778a5a64bd3e52c01f69a511fda5d14f57f4959 GIT binary patch literal 173 zcmXpJVq~~_m%l5bInsUAj6{**Nns)xflE96nHU&=h#>$-EN+)JoWbx*pApCp1o9Vg zF`7$Q{si+?^nE>p%TtqJlv8POW?pJ>v0GwtVoIvMuWPWLOJYf)UT|VrDu}@V5^>6` g((_F$NiE7u%z?}3B^SdbLy8iUQ$rGya#B&G0o~O!V*mgE literal 0 HcmV?d00001 diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.HL/MesFunctions.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.HL/MesFunctions.cs new file mode 100644 index 0000000..20a938f --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.HL/MesFunctions.cs @@ -0,0 +1,83 @@ +using DataLinkMesWork; +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace bizFacade +{ + public class MesFunctions + { + /// + /// 工件入站 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool EnginePart_Incoming(string OpName, int EngineTypeID, string EngineType, int PartPallet_Code, string EngineID, string Big_EnginTypeID, int MES_QualityMask, string OrderForm) + { + var procedureName = "MES_合装控制_工件入站"; + var sqlParameters = new SqlParameter[] + { + new SqlParameter("@OP_Name", OpName), + new SqlParameter("@Engine_TypeID", EngineTypeID), + new SqlParameter("@Engine_Type", EngineType), + new SqlParameter("@Pallet_Code", PartPallet_Code), + new SqlParameter("@Product_Code", EngineID), + new SqlParameter("@Big_EnginTypeID", int.Parse(Big_EnginTypeID)), + new SqlParameter("@Product_QualityOK", MES_QualityMask), + new SqlParameter("@OrderForm", OrderForm) + }; + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters); + } + /// + /// 工件出站 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool EnginePart_OutStation(string OpName, string EngineID, int MES_QualityMask) + { + var procedureName = "MES_合装控制_工件出站"; + var sqlParameters = new SqlParameter[] + { + new SqlParameter("@OP_Name", OpName), + new SqlParameter("@Product_Code", EngineID), + new SqlParameter("@Product_QualityOK", MES_QualityMask) + }; + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters); + } + /// + /// Condition_Type:1、判断该工位是否在业务范围内(停用);2、机型匹配,3、获取OPA90的匹配结果 + /// + /// + /// + public static int GetCondition_AssemblyControl(int Condition_Type) + { + //Condition_Type:1、判断该工位是否在业务范围内;2、根据OPA90第一个入站工件进行机型判断;3、获取报警信息 + string procedureName = "MES_合装控制_控制条件"; + var sqlParameters = new SqlParameter[] + { + new SqlParameter("@Condition_Type", Condition_Type), + new SqlParameter("@OP_Name", "OPA90") + }; + var result = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out DataTable dt); + return int.Parse(dt.Rows[0][0].ToString()); + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.Material/Materials.cs b/Common/07WebBusinessFacade/BusinessFacade/MES.Material/Materials.cs new file mode 100644 index 0000000..3cc5395 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES.Material/Materials.cs @@ -0,0 +1,1042 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; + +using System.Data.OleDb; + + +using DataLinkMesWork; + +//using SystemFramework; +namespace bizFacade +{ + public class MobyTagType + { + /// + /// 配方号 + /// + public static string PLCRcipe = "配方号"; + /// + /// 工位号 + /// + public static string OpName = "工位号"; + /// + /// 订单号 + /// + public static string OrderForm = "订单号"; + /// + /// 订单号 + /// + public static string OrderForm_MES = "订单号_MES"; + /// + /// 产品型号代码 + /// + public static string EngineTypeID = "产品型号代码"; + /// + /// 变速器序列号 + /// 变速器序列号 + public static string EngineID = "变速器序列号"; + + /// + /// 发动机型号 + /// + public static string EngineType = "发动机型号"; + /// + /// 机型基本代码 + /// + public static string EngineTypeBasicID = "机型基本代码"; + /// + /// 机型基本代码 + /// + public static string EngineTypeBasic = "基本机型"; + /// + /// 变速器总成号 + /// + public static string EngineIDPrinte = "变速器总成号"; + /// + /// 托盘号 + /// + public static string PartPallet_Code = "托盘号"; + /// + /// 产品型号代码_MES + /// + public static string EngineTypeID_MES = "产品型号代码_MES"; + /// + /// 变速器序列号_MES + /// + public static string EngineID_MES = "变速器序列号_MES"; + /// + /// 发动机型号_MES + /// + public static string EngineType_MES = "发动机型号_MES"; + /// + /// 到达时间线外工位 + /// + public static string WorkStartOutSideIn = "到达时间线外工位"; + /// + /// 离开时间线外工位 + /// + public static string WorkStartOutSideOut = "离开时间线外工位"; + /// + /// 到达时间 + /// + public static string WorkStartIn = "到达时间"; + /// + /// 离开时间 + /// + public static string WorkStartOut = "离开时间"; + /// + /// 持续时间 + /// + public static string WorkStartTime = "持续时间"; + /// + /// 扫描条码 + /// + public static string BarCode = "扫描条码"; + /// + /// 工件到位 2 + /// + public static string WorkStart = "工件到位"; + /// + /// 传递机型 44 + /// + public static string EngineTypeGetOverPLC = "传递机型"; + /// + /// 申请上件 43 + /// + public static string PartLoad = "申请上件"; + /// + /// 允许保存 19 + /// + public static string MesRead = "允许保存"; + /// + /// 保存完成 20 + /// + public static string MesReadOver = "保存完成"; + + + + + /// [机床上电],[循环开始],[机床故障],[上料无件],[下料堵塞],[工件到位] + /// [传递机型],[申请上件],[允许保存],[保存完成],[合格标志],[前序合格] + /// [工号],[班次],[是否返修件],[合格放行],[不合格放行] + /// [到达时间],[离开时间],[持续时间] + // engineTypeID = Convert.ToInt32(thisParms[2].Value); + //engineType = thisParms[3].Value.ToString(); + //engineID = thisParms[4].Value.ToString(); + //palletCode = thisParms[5].Value.ToString(); + } + public partial class BaseDataSystemMES + { + /// + /// 测量数据工位_监控系统_MOBY_查询 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool OpName_MIS_Moby_Select(string opName, + out string orderForm, out int engineTypeID, out string engineType, + out string engineID, out string palletCode, out int isRepair, out string repairCode) + { + orderForm = ""; + engineTypeID = 0; + engineType = ""; + engineID = ""; + palletCode = ""; + isRepair = 0; + repairCode = ""; + + string produceName = "测量数据工位_监控系统_MOBY_查询"; + SqlParameter[] thisParms = new SqlParameter[8]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", SqlDbType.NVarChar, 50); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@产品型号代码", SqlDbType.Int, 4); + thisParms[2].Direction = ParameterDirection.Output; + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", SqlDbType.NVarChar, 50); + thisParms[3].Direction = ParameterDirection.Output; + thisParms[4] = new System.Data.SqlClient.SqlParameter("@发动机号", SqlDbType.NVarChar, 50); + thisParms[4].Direction = ParameterDirection.Output; + thisParms[5] = new System.Data.SqlClient.SqlParameter("@托盘号", SqlDbType.NVarChar, 50); + thisParms[5].Direction = ParameterDirection.Output; + thisParms[6] = new System.Data.SqlClient.SqlParameter("@拆解标志", SqlDbType.Int, 4); + thisParms[6].Direction = ParameterDirection.Output; + thisParms[7] = new System.Data.SqlClient.SqlParameter("@拆解返修条码", SqlDbType.NVarChar, 50); + thisParms[7].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + orderForm = thisParms[1].Value.ToString(); + engineTypeID = Convert.ToInt32(thisParms[2].Value); + engineType = thisParms[3].Value.ToString(); + engineID = thisParms[4].Value.ToString(); + palletCode = thisParms[5].Value.ToString(); + isRepair = Convert.ToInt32(thisParms[6].Value); + repairCode = thisParms[7].Value.ToString(); + return true; + } + return false; + } + + /// + /// 测量数据工位_获得订单_查询 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool OrderFormByOpName_Select(string opName, + out string orderForm, out int engineTypeID, out string engineType, + out string engineID, out string palletCode, out int isRepair, out string repairCode) + { + orderForm = ""; + engineTypeID = 0; + engineType = ""; + engineID = ""; + palletCode = ""; + isRepair = 0; + repairCode = ""; + + string produceName = "测量数据工位_获得订单_查询"; + SqlParameter[] thisParms = new SqlParameter[8]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", SqlDbType.NVarChar, 50); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@产品型号代码", SqlDbType.Int, 4); + thisParms[2].Direction = ParameterDirection.Output; + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", SqlDbType.NVarChar, 50); + thisParms[3].Direction = ParameterDirection.Output; + thisParms[4] = new System.Data.SqlClient.SqlParameter("@发动机号", SqlDbType.NVarChar, 50); + thisParms[4].Direction = ParameterDirection.Output; + thisParms[5] = new System.Data.SqlClient.SqlParameter("@托盘号", SqlDbType.NVarChar, 50); + thisParms[5].Direction = ParameterDirection.Output; + thisParms[6] = new System.Data.SqlClient.SqlParameter("@拆解标志", SqlDbType.Int, 4); + thisParms[6].Direction = ParameterDirection.Output; + thisParms[7] = new System.Data.SqlClient.SqlParameter("@拆解返修条码", SqlDbType.NVarChar, 50); + thisParms[7].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + orderForm = thisParms[1].Value.ToString(); + engineTypeID = Convert.ToInt32(thisParms[2].Value); + engineType = thisParms[3].Value.ToString(); + engineID = thisParms[4].Value.ToString(); + palletCode = thisParms[5].Value.ToString(); + isRepair = Convert.ToInt32(thisParms[6].Value); + repairCode = thisParms[7].Value.ToString(); + return true; + } + return false; + } + + /// + /// 北汽福田工位状态监控MOBY_增加 + /// 工位号],[订单号],[产品型号代码],[变速器序列号],[发动机型号],[机型基本代码],[变速器总成号] ,[托盘号] + /// [产品型号代码_MES],[变速器序列号_MES],[发动机型号_MES] + /// [机床上电],[循环开始],[机床故障],[上料无件],[下料堵塞],[工件到位] + /// [传递机型],[申请上件],[允许保存],[保存完成],[合格标志],[前序合格] + /// [工号],[班次],[是否返修件],[合格放行],[不合格放行],[扫描条码] + /// [到达时间],[离开时间],[持续时间] + /// + /// + /// + /// + /// + public static bool OpName_MIS_MOBY_Insert(string opName, string tagType, string tagValue) + { + string produceName = "北汽福田工位状态监控MOBY_增加"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@变量类型", tagType); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@变量值", tagValue); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + + } + + + + /// + /// 测量数据工位_监控系统_MOBY_增加 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool OpName_MIS_MOBY_Insert(string opName, string orderForm, + int engineTypeID, string engineType, string engineID, int palletCode, int repairCode, int Is_repairBarcode, string repairBarcode) + { + string produceName = "测量数据工位_监控系统_MOBY_增加"; + SqlParameter[] thisParms = new SqlParameter[9]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", orderForm); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@产品型号代码", engineTypeID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@托盘号", palletCode); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@返修标志", repairCode); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@拆解标志", Is_repairBarcode); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@拆解返修条码", repairBarcode); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + public static bool OpName_MIS_MOBY_Insert_FirstOpName(string opName, + int engineTypeID, string engineType, string engineID, int palletCode, int repairCode, int Is_repairBarcode, string repairBarcode) + { + string produceName = "测量数据工位_监控系统_MOBY_线首_增加"; + SqlParameter[] thisParms = new SqlParameter[8]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@产品型号代码", engineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@托盘号", palletCode); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@返修标志", repairCode); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@拆解标志", Is_repairBarcode); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@拆解返修条码", repairBarcode); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 测量数据工位_监控系统_订单号_增加 + /// + /// + /// + /// + public static bool OpName_MIS_OrderForm_Insert(string opName, string orderForm) + { + string produceName = "测量数据工位_监控系统_订单号_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", orderForm); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 测量数据工位_监控系统_操作者工号_增加 + /// + /// + /// + /// + public static bool OpName_MIS_Operator_Insert(string opName, string opperatorCode) + { + string produceName = "AMES_物料拉动_测量数据工位_监控系统_操作者工号_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@操作者工号", opperatorCode); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 测量数据工位_监控系统_发动机号_增加 + /// + /// + /// + /// + public static bool OpName_MIS_EngineID_Insert(string opName, string engineID) + { + string produceName = "测量数据工位_监控系统_发动机号_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + /// + /// 测量数据工位_监控系统_订单号_发动机型号_修改 + /// + /// + /// + /// + /// + /// + public static bool OpName_MIS_OrderForm_EngineType_Update(string opName, int engineTypeID, string engineType, string engineID) + { + string produceName = "测量数据工位_监控系统_订单号_发动机型号_修改"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@产品型号代码", engineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + /// + /// 测量数据工位_监控系统_发动机型号_增加 + /// + /// + /// + /// + /// + public static bool OpName_MIS_EngineType_Insert(string opName, int engineTypeID, string engineType) + { + string produceName = "测量数据工位_监控系统_发动机型号_增加"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@产品型号代码", engineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 测量数据工位_监控系统_托盘号_增加 + /// + /// + /// + /// + public static bool OpName_MIS_PalletCode_Insert(string opName, int palletCode) + { + string produceName = "测量数据工位_监控系统_托盘号_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@托盘号", palletCode); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 测量数据工位_监控系统_返修_增加 + /// + /// + /// + /// + /// + public static bool OpName_MIS_Repair_Insert(string opName, int repairCode, int Is_repairBarcode, string repairBarcode) + { + string produceName = "测量数据工位_监控系统_返修_增加"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修标志", repairCode); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@拆解标志", Is_repairBarcode); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@拆解返修条码", repairBarcode); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 电子看板_装配零件_临时表_增加 + /// + /// + /// + public static bool MesServer_Process_EngineTypeOver(string opName) + { + string produceName = "电子看板_装配零件_临时表_增加"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + /// + /// [电子看板_装配零件_临时表_增加_北汽] + /// + /// + /// + public static bool MesServer_Process_EngineTypeOverBQ(string opName) + { + string produceName = "电子看板_装配零件_临时表_增加_北汽"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// [电子看板_工序内容_转入临时] + /// + /// + /// + public static bool ProcessDataToTemp(string opName,int EngineTypeID,string OrderForm,string EngineID) + { + string produceName = "电子看板_工序内容_转入临时"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@机型代码", EngineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@工件编号", OrderForm); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@订单号", EngineID); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + /// + /// [电子看板_装配零件_临时表_增加_北汽线首] + /// + /// + /// + public static bool MesServer_Process_EngineTypeOver_BQ_FirstOP(string opName) + { + string produceName = "电子看板_装配零件_临时表_增加_北汽线首"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + /// + /// 自制件条码记录_创建 + /// + /// + /// + public static DataTable Create_OutLineBarCode(string EngineID, string OrderForm) + { + DataTable dt; + string produceName = "自制件条码记录_创建"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总成号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", OrderForm); + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt); + return dt; + } + + /// + /// 合力_OPA90是否允许工作_判断 如果允许工作则将两个轮毂状态设为待匹配 + /// + /// + /// + /// + /// + /// + /// + /// + public static bool OP50_OPA90_MatchResult(int EngineTypeID, int EngineTypeID_QiaoKe, string EngineID, string OrderForm, out int MatchResult, out string MatchResultStr) + { + DataTable dt = new DataTable(); + MatchResult = 3;// 默认是报警 程序出错 + MatchResultStr = "默认是报警 程序出错";// 默认是报警 程序出错 + string produceName = "合力_OPA90是否允许工作_判断"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@轮毂机型", EngineTypeID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@轮毂总成号", EngineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@桥壳_机型", EngineTypeID_QiaoKe); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@订单号", OrderForm); + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt)) + { + if (dt.Rows.Count > 0) + { + MatchResult = Convert.ToInt32(dt.Rows[0]["最终结果"]); + MatchResultStr = dt.Rows[0]["最终结果说明"].ToString(); + return true; + } + } + return false; + } + + public static bool OP051_OP050_NeedWork(string EngineID, string opName, string orderForm, out int MatchResult, out string resultMsg) + { + DataTable dt = new DataTable(); + MatchResult = 0; + resultMsg = ""; + + string produceName = "合力_OP050前停判断_下工位是否需要工作"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@桥壳总成号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@订单号", orderForm); + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt)) + { + if (dt.Rows.Count > 0) + { + MatchResult = Convert.ToInt32(dt.Rows[0]["是否需要工作"]); + resultMsg = dt.Rows[0]["msg"].ToString(); + return true; + } + } + return false; + } + + public static bool OP051_OP050_NeedWork_Save(string EngineID, int MatchResult, string Cause) + { + + string produceName = "合力_OP050是否需要工作_插入"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@桥壳总成号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@是否需要工作", MatchResult); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@原因", Cause); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 合力_工位报警记录表_增加 + /// + /// + /// + public static bool HeLi_OoNameAlarmRecord_Add(string opName, string EngineID, string alarmText) + { + string produceName = "合力_工位报警记录表_增加"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@总成号", EngineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@报警内容", alarmText); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 电子看板_装配零件_临时表_线首_增加 + /// + /// + /// + public static bool MesServer_Process_EngineTypeOver_FirstOpName(string opName) + { + string produceName = "电子看板_装配零件_临时表_线首_增加"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + public static bool GetEngineTypeByEngineID(string engineID, out DataTable dt) + { + string procedureName = "测量数据发动机在线状态_下线工位_是否存在_查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@EngineID", engineID); + //return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + + + } + //测量数据发动机在线状态_下线工位_是否存在_查询 + + + /// + /// 测量数据发动机在线状态_跟踪发动机条码状态_增加 + /// + /// + /// + public static bool MaterialPush_EngineIDStatus_Insert(string opName) + { + string produceName = "测量数据发动机在线状态_跟踪发动机条码状态_增加"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 物料拉动_电子看板_装配零件_修改 + /// + /// + /// + public static bool PartMaterialUseNum_Update(string opName) + { + string produceName = "物料拉动_电子看板_装配零件_修改"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 电子看板_装配零件_临时表_判断_是否允许工作 + /// + /// + /// + /// + public static bool MesServer_Judge_IsCanWork(string opName, out int IsAllowWork) + { + IsAllowWork = 0; + string produceName = "电子看板_装配零件_临时表_判断_是否允许工作"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@是否允许工作", IsAllowWork); + thisParms[1].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + IsAllowWork = Convert.ToInt32(thisParms[1].Value); + return true; + } + return false; + } + /// + ///[北汽福田工位J07MA40_验证线外工位零件是否与工位J07MA20匹配] @EngineID nvarchar(50),@BarCode nvarchar(50) + /// + /// + /// + /// + /// + public static bool MesServer_J07MA20_Judge_IsCanWork(string EngineID, string BarCode, out int IsAllowWork) + { + IsAllowWork = 0; + string produceName = "北汽福田工位J07MA40_验证线外工位零件是否与工位J07MA20匹配"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@EngineID", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@BarCode", BarCode); + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out DataTable dt)) + { + IsAllowWork = Convert.ToInt32(dt.Rows[0][0]); + return true; + } + return false; + } + + /// + /// 条码扫描_判断条码类型 + /// + /// + /// + /// + /// + public static bool GetBarcodeType(string opName, string barCode, out string barCodeType) + { + barCodeType = ""; + string produceName = "条码扫描_判断条码类型"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@条码", barCode); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@条码类型", barCodeType); + thisParms[2].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + barCodeType = thisParms[2].Value.ToString(); + return true; + } + return false; + } + + /// + /// 物料拉动_线边库存_修改 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool ReceiveCard_Update(string OpName, string barcode, + out bool MaterialIsExsit, out bool BarCodeIsExsit, out bool IsBillOk, out bool IsCanUpdateBetch, out bool IsScaningMulti, out bool IsMultiPC) + { + MaterialIsExsit = true;//@物料是否存在 + BarCodeIsExsit = true;//@条码是否存在 + IsBillOk = true;//@扫描是否符合订单 + IsCanUpdateBetch = true;//@是否可以更新批次 + IsScaningMulti = false;//@是否重复扫描 + IsMultiPC = false;//是否多箱追踪批次 + + + string produceName = "物料拉动_线边库存_修改"; + SqlParameter[] thisParms = new SqlParameter[8]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@卡片条码", barcode); + + thisParms[2] = new System.Data.SqlClient.SqlParameter("@物料是否存在", MaterialIsExsit); + thisParms[2].Direction = ParameterDirection.Output; + thisParms[3] = new System.Data.SqlClient.SqlParameter("@条码是否存在", BarCodeIsExsit); + thisParms[3].Direction = ParameterDirection.Output; + thisParms[4] = new System.Data.SqlClient.SqlParameter("@扫描是否符合订单", IsBillOk); + thisParms[4].Direction = ParameterDirection.Output; + thisParms[5] = new System.Data.SqlClient.SqlParameter("@是否可以更新批次", IsCanUpdateBetch); + thisParms[5].Direction = ParameterDirection.Output; + thisParms[6] = new System.Data.SqlClient.SqlParameter("@是否重复扫描", IsScaningMulti); + thisParms[6].Direction = ParameterDirection.Output; + thisParms[7] = new System.Data.SqlClient.SqlParameter("@是否多箱消耗", IsMultiPC); + thisParms[7].Direction = ParameterDirection.Output; + + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + MaterialIsExsit = Convert.ToBoolean(thisParms[2].Value); + BarCodeIsExsit = Convert.ToBoolean(thisParms[3].Value); + IsBillOk = Convert.ToBoolean(thisParms[4].Value); + IsCanUpdateBetch = Convert.ToBoolean(thisParms[5].Value); + IsScaningMulti = Convert.ToBoolean(thisParms[6].Value); + IsMultiPC = Convert.ToBoolean(thisParms[7].Value); + return true; + } + return false; + } + + /// + /// 电子看板_装配零件_临时表_修改_零件条码 + /// + /// + /// + /// + /// + public static bool PartMaterial_DM_Update(string opName, string barCode, out bool IsSuccess) + { + IsSuccess = false; + string produceName = "电子看板_装配零件_临时表_修改_零件条码"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@条码", barCode); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@条码是否符合", IsSuccess); + thisParms[2].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + IsSuccess = Convert.ToBoolean(thisParms[2].Value); + return true; + } + return false; + } + + /// + /// 北汽福田_总分线对应表_验证 + /// + /// + /// + /// + /// + public static bool BusPartLine_Check(string PartCode, string OpName, string orderForm, out bool IsSuccess) + { + IsSuccess = false; + string produceName = "北汽福田_总分线对应表_验证"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@分线总成号", PartCode); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@订单号", orderForm); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@Count", IsSuccess); + thisParms[3].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + IsSuccess = Convert.ToBoolean(thisParms[3].Value); + return true; + } + return false; + } + + /// + /// 北汽福田_总分线对应表_增加 + /// + /// + /// + /// + /// + public static void BusPartLine_Add(string BusCode, string PartCode, string opName, string orderForm, string EngineID) + { + string produceName = "北汽福田_总分线对应表_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@主线总成号", BusCode); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@分线总成号", PartCode); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@订单号", orderForm); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@机型号", EngineID); + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// AMES_MES_装配数据_零部件追溯_增加 + /// + /// + /// + /// + public static bool Material_Insert(string opName, int m_ConfirmOkGo) + { + string produceName = "MES_装配数据_零部件追溯_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@放行方式", m_ConfirmOkGo); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + /// + /// 北汽福田工位BOM换型比对 + /// + /// + /// 新零件号(机型) + /// + public static DataTable EngineTypeChange(string opName, string engineType) + { + DataTable dt = new DataTable(); + string produceName = "北汽福田工位BOM换型比对"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@新零件号", engineType); + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt); + return dt; + } + + /// + /// 测量数据发动机在线状态_查询_是否已工作 + /// + /// + /// 新零件号(机型) + /// + public static DataTable EngineIsTwoWork(string opName, string OrderForm, string EngineID) + { + DataTable dt = new DataTable(); + string produceName = "测量数据发动机在线状态_查询_是否已工作"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", OrderForm); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@总成号", EngineID); + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt); + return dt; + } + + /// + /// 北汽福田_TCU_增加 + /// + /// + /// + /// + /// + /// + public static DataTable TCU_Add(string opName, string nameplate, string EngineID, string EngineTypeID) + { + DataTable dt = new DataTable(); + string produceName = "北汽福田_TCU_增加"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@变速器总成码", EngineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@物料码", nameplate); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@机型代码", EngineTypeID); + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt); + return dt; + } + // + /// + /// MES_装配数据_零部件追溯_增加 + /// + /// + /// + public static bool Material_Insert(string opName) + { + string produceName = "MES_装配数据_零部件追溯_增加"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + + /// + /// 电子看板_工位机型_质量数据测量位置_临时表_增加 + /// + /// + /// + public static bool MesServer_ShaftPosition_EngineTypeOver(string opName) + { + string produceName = "电子看板_工位机型_质量数据测量位置_临时表_增加"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 电子看板_工位机型_质量数据测量位置_临时表_查询_完成情况 + /// + /// + /// + /// + /// + /// + public static bool MesServer_ShaftPosition_Select_FinishResult(string opName, out int workGroupIndex, out string BoltCode, out bool sn_WorkingStepIsOver) + { + workGroupIndex = 0; + BoltCode = ""; + sn_WorkingStepIsOver = true; + + string produceName = "电子看板_工位机型_质量数据测量位置_临时表_查询_完成情况"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@组号", SqlDbType.Int, 4); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@套筒号", SqlDbType.NVarChar, 50); + thisParms[2].Direction = ParameterDirection.Output; + thisParms[3] = new System.Data.SqlClient.SqlParameter("@是否全部完成", SqlDbType.Int, 4); + thisParms[3].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + workGroupIndex = Convert.ToInt32(thisParms[1].Value); + BoltCode = thisParms[2].Value.ToString(); + sn_WorkingStepIsOver = Convert.ToBoolean(thisParms[3].Value); + return true; + } + return false; + } + + + /// + /// 电子看板_工位机型_质量数据测量位置_临时表_修改 + /// + /// + /// + /// + /// + /// + public static bool MesServer_ShaftPosition_Update(string opName, int workGroupIndex, int IsOK, out bool IsFinish) + { + IsFinish = true; + string produceName = "电子看板_工位机型_质量数据测量位置_临时表_修改"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@组号", workGroupIndex); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@合格标志", IsOK); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@是否全部完成", SqlDbType.Int, 4); + thisParms[3].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + IsFinish = Convert.ToBoolean(thisParms[3].Value); + return true; + } + return false; + } + + + /// + /// MES界面显示_弹窗消息_增加 + /// + /// + /// + /// + public static bool Web_Notice_Insert(string opName, string notice) + { + string produceName = "MES界面显示_弹窗消息_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@Notice", notice); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 生产计划_派工订单_工件追溯_校验 + /// + /// + /// + /// + public static DataTable WorkOrderCheck(string opName, string EngineID,string OrderFrom,string EngineType) + { + string produceName = "生产计划_派工订单_工件追溯_校验"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工件编号", EngineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@订单号", OrderFrom); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@机型", EngineType); + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms,out DataTable dt); + return dt; + } + + /// + /// 生产计划_派工订单_工件追溯_工位完工 + /// + /// + /// + /// + public static bool WorkOrderOpWorkOver(string opName, string EngineID, string OrderFrom) + { + string produceName = "生产计划_派工订单_工件追溯_工位完工"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", OrderFrom); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@工件编号", EngineID); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 生产计划_派工订单_工件追溯_工件下线 + /// + /// + /// + /// + public static bool WorkOrderOpWorkOutLine(string EngineID, string OrderFrom) + { + string produceName = "生产计划_派工订单_工件追溯_工件下线"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@订单号", OrderFrom); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工件编号", EngineID); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES.Material/vssver2.scc b/Common/07WebBusinessFacade/BusinessFacade/MES.Material/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..ab96d346ef3e5d83f65bfb117099885dea684a3f GIT binary patch literal 105 zcmXpJVq~~_m%l5bInsUAj6{**Nns)!vWLC~F)=VOGB7X%1L@TF1!rIA|I!EXRrGy5 tgUeHsV3bp7ab{j>aj{!sa$-uVzOQSro^N7FYEfol4g-u)te0HO008BIA|e0) literal 0 HcmV?d00001 diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.AssemblyPartTrace.Repair.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.AssemblyPartTrace.Repair.cs new file mode 100644 index 0000000..3f13871 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.AssemblyPartTrace.Repair.cs @@ -0,0 +1,509 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; + +using System.Data.OleDb; +using DataLinkMesWork; + + +//using SystemFramework; + +namespace bizFacade +{ + /// + /// 关键零部件追溯 + /// + public partial class BaseDataSystemMES + { + /// + /// 向数据库写入返修数据 + /// + /// + /// + /// + public static bool UpdateRepairStatusTo_SQL(string opname, string status) + { + string produceName = "测量数据_返修工位_工位状态_修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", status); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 返修上线_返修工位及返修路径_增加 + /// + /// + /// + /// + public static bool RepairStatusInsert(string engineID, string RepairStatus, string RepairMethod, string engineType) + { + string produceName = "返修上线_返修工位及返修路径_增加"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总成编号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", RepairStatus); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@返修路径", RepairMethod); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 上传数据 + /// MES_装配数据_零部件追溯_返修工位_数据主表 + /// 一般情况追踪代码等于发动机号() + /// + /// 订单号 + /// 发动机号 + /// 追踪代码 + /// 工位号 + /// 人员代码 + /// 返修原因代码 + /// 返修原因内容 + /// 返修内容 + /// 操作时间 + static public bool AssemblyPartTraceMainTableRepairInsert_OnlySqlServer(string orderForm, + string engineNumber, string engineTraceCode, string opName, + string operatorCode, string reasonCode, string reason, string repareContent,string operationTime) + { + string sql_Insert; + sql_Insert = "INSERT INTO [MES_装配数据_零部件追溯_返修工位_数据主表] " + + "(订单号,发动机号,追踪代码,工位号,人员代码, 返修原因代码, 返修原因内容, 返修内容,操作时间)" + + " VALUES (" + + "'" + orderForm + "'," + + "'" + engineNumber + "'," + + "'" + engineTraceCode + "'," + + "'" + opName + "'," + + "'" + operatorCode + "'," + + "'" + reasonCode + "'," + + "'" + reason + "'," + + "'" + repareContent + "'," + + "'" + operationTime + "') "; + + return DataAccess.ExecuteSQL(sql_Insert); + + } + /// + /// 数据上传 + /// 删除数据 + /// MES_装配数据_零部件追溯_返修工位_数据主表 + /// + /// 追溯代码 + //static public bool PartTraceTableRepareDelete(long traceID) + //{ + // string sql; + // sql = "DELETE FROM [MES_装配数据_零部件追溯_返修工位_数据主表] " + // + " WHERE 追溯代码=" + traceID.ToString(); + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// 数据上传 + /// 查询数据 + /// MES_装配数据_零部件追溯_返修工位_数据主表 + /// + //static public bool PartTraceMainTableRepareSelect(out DataTable dt) + //{ + // string sql; + // dt = null; + // sql = "SELECT * FROM [MES_装配数据_零部件追溯_返修工位_数据主表] "; + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + + + /// + /// 查询返修原因代码,返修内容 + /// + /// 追踪代码 + /// 工位号 + /// + /// + static public bool AssemblyPartTraceTableRepairSelect(string engineTraceCode, string opName, out DataTable dt) + { + string sql; + dt = null; + sql = "SELECT 返修原因代码,返修内容 FROM [MES_装配数据_零部件追溯_返修工位_数据主表] " + + " where 追踪代码='" + engineTraceCode + "'" + + " and 工位号 = '" + opName + "'" + + " and 返修状态 = 0"; + //if (SQLCommon.SqlServerConnectionStatus) + { + return DataAccess.ExecuteDataTable(sql, out dt); + } + //if (!SQLCommon.SqlServerConnectionStatus) + //{ + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + //return false; + } + + /// + /// 测试是否填写返修原因数据 + /// 已经填写,返回true + /// 没有填写,返回false + /// + /// + /// + /// + /// + static public bool AssemblyPartTraceTableRepairIsSave(string orderForm,string engineTraceCode, string opName) + { + string sql_Count; + int count = 0; + sql_Count = "SELECT COUNT (*) FROM [MES_装配数据_零部件追溯_返修工位_数据主表] " + + " where 追踪代码='" + engineTraceCode + "'" + + " and 工位号 = '" + opName + "'" + + " and 返修状态 = 0"; + //if (SQLCommon.SqlServerConnectionStatus) + { + DataAccess.ExecuteOutNum(sql_Count, out count); + } + //if (!SQLCommon.SqlServerConnectionStatus) + //{ + // DataAccess.ExecuteOutNum_OleDb_Access(sql_Count, out count); + //} + if (count == 0) + { + return false; + } + else + { + return true; + } + } + + + /// + /// + /// + /// + /// + //static public bool AssemblyPartTraceTableRepairReasonSelect(out DataTable dt) + //{ + // string sql; + // sql = "SELECT 返修原因代码,返修原因内容 FROM MES_基本数据_返修原因"; + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + + + /// + /// 同步通讯方式 + /// 增加数据,返回自动编号 + /// MES_装配数据_零部件追溯_返修工位_数据主表 + /// 一般情况追踪代码等于发动机号() + /// + /// 订单号 + /// 发动机号 + /// 追踪代码 + /// 工位号 + /// 人员代码 + /// 返修原因代码 + /// 返修原因内容 + /// 返修内容 + static public bool AssemblyPartTraceMainTableRepairInsert(string orderForm, + string engineNumber, string engineTraceCode, string opName, + string operatorCode, string reasonCode, string reason,string repareContent) + { + string sql_Insert; + string sql_Update; + string sql_Count; + sql_Insert = "INSERT INTO [MES_装配数据_零部件追溯_返修工位_数据主表] " + + "(订单号,发动机号,追踪代码,工位号,人员代码, 返修原因代码, 返修原因内容, 返修内容)" + + " VALUES (" + + "'" + orderForm + "'," + + "'" + engineNumber + "'," + + "'" + engineTraceCode + "'," + + "'" + opName + "'," + + "'" + operatorCode + "'," + + "'" + reasonCode + "'," + + "'" + reason + "'," + + "'" + repareContent + "') "; + sql_Update = "UPDATE [MES_装配数据_零部件追溯_返修工位_数据主表] " + + "SET 人员代码 ='" + operatorCode + "'," + + " 返修原因代码 ='" + reasonCode + "'," + + " 返修原因内容 ='" + reason + "'," + + " 返修内容 ='" + repareContent + "'" + + " where 追踪代码='" + engineTraceCode + "'" + + " and 工位号 = '" + opName + "'" + + " and 返修状态 = 0"; + + sql_Count = "SELECT COUNT (*) FROM [MES_装配数据_零部件追溯_返修工位_数据主表] " + + " where 追踪代码='" + engineTraceCode + "'" + + " and 工位号 = '" + opName + "'" + + " and 返修状态 = 0"; + + int count=0; + //if (SQLCommon.SqlServerConnectionStatus) + { + DataAccess.ExecuteOutNum(sql_Count, out count); + if (count == 0) + { + return DataAccess.ExecuteSQL(sql_Insert); + } + else + //MES_装配数据_零部件追溯_返修工位_数据主表 + //存在发动机号,工位号 + { + return DataAccess.ExecuteSQL(sql_Update); + } + } + //if (!SQLCommon.SqlServerConnectionStatus) + //{ + // DataAccess.ExecuteOutNum_OleDb_Access(sql_Count, out count); + // if (count == 0) + // { + // return DataAccess.ExecuteSQL_OleDb_Access(sql_Insert); + // } + // else + // //MES_装配数据_零部件追溯_返修工位_数据主表 + // //存在发动机号,工位号 + // { + // return DataAccess.ExecuteSQL_OleDb_Access(sql_Update); + // } + //} + //return false; + + } + + /// + ///MES_装配数据_零部件追溯_返修工位 + ///INSERT INTO [MES_装配数据_零部件追溯_返修工位] + ///增加数据, + /// + /// + /// + public static void VerifyAssemblyPartTableRepairInsert(DataTable dt) + { + //if (ApplicationConfig.connectionStringPIS_NEW_Value == "1") + //{ + // //如果与SQL Server 数据库通讯失败,ApplicationConfig.connectionStringPIS_NEW_Value = "0" + // VerifyAssemblyPartTableRepairInsert_SqlServer(dt); + //} + //if (ApplicationConfig.connectionStringPIS_NEW_Value == "0") + //{ + // VerifyAssemblyPartTableRepairInsert_Access(dt); + //} + + } + /// + /// 同步操作方式 + ///MES_装配数据_零部件追溯_返修工位 + ///INSERT INTO [MES_装配数据_零部件追溯_返修工位] + ///增加数据, + /// + /// + /// + public static void VerifyAssemblyPartTableRepairInsert_SqlServer(DataTable dt) + { + string sql; + sql = "INSERT INTO [MES_装配数据_零部件追溯_返修工位]" + + "([追溯代码],[订单号],[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + + "[发动机数量], [厂牌编号起始号], [客户名称],[投料日期],[文件编号],[集团名称],[通知号]," + + "[功率],[指南文件编号],[装机状态],[适用状态],[物料描述],[计划下达日期],[计划完工日期]," + + "[主配厂家],[工位号], [工位名称],[物料号], [零件图号], [零件名称], [零件数量]," + + "[是否扫描],[扫描方式代码], [扫描方式], [厂家代码],[生产厂家], " + + "[操作指导],[发动机号],[追踪代码],[物料号表索引号],[零件数量验证]," + + "[物料条码], [物料条码物料号], [物料条码批次],[验证结果], [操作者工号], [操作者姓名], [班次代码], " + + "物料来源代码,物料来源,是否禁用代码,是否禁用,被强制验证物料号," + +"更改代码,更改原因,操作时间)" + + + "VALUES(@追溯代码,@订单号,@SAP物料号,@发动机型号,@发动机型号代码,@发动机机型," + + "@发动机数量,@厂牌编号起始号,@客户名称,@投料日期,@文件编号,@集团名称,@通知号," + + "@功率,@指南文件编号,@装机状态,@适用状态,@物料描述,@计划下达日期,@计划完工日期," + + "@主配厂家,@工位号,@工位名称,@物料号,@零件图号,@零件名称,@零件数量," + + " @是否扫描,@扫描方式代码,@扫描方式,@厂家代码,@生产厂家," + + "@操作指导,@发动机号,@追踪代码,@物料号表索引号,@零件数量验证," + + "@物料条码,@物料条码物料号,@物料条码批次,@验证结果,@操作者工号,@操作者姓名,@班次代码," + + "@物料来源代码,@物料来源,@是否禁用代码,@是否禁用,@被强制验证物料号," + +"@更改代码,@更改原因,@操作时间)"; + + + + SqlParameter[] thisParmsSql = new SqlParameter[52]; + // + "([订单号],[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + thisParmsSql[0] = new SqlParameter("@追溯代码", SqlDbType.Int, 4, "追溯代码"); + thisParmsSql[1] = new SqlParameter("@订单号", SqlDbType.NVarChar, 50, "订单号"); + thisParmsSql[2] = new SqlParameter("@SAP物料号", SqlDbType.NVarChar, 50, "SAP物料号"); + thisParmsSql[3] = new SqlParameter("@发动机型号", SqlDbType.NVarChar, 50, "发动机型号"); + thisParmsSql[4] = new SqlParameter("@发动机型号代码", SqlDbType.Int, 4, "发动机型号代码"); + thisParmsSql[5] = new SqlParameter("@发动机机型", SqlDbType.NVarChar, 50, "发动机机型"); + + // + "@发动机数量,@厂牌编号起始号,@客户名称,@投料日期,@文件编号,@集团名称,@通知号," + thisParmsSql[6] = new SqlParameter("@发动机数量", SqlDbType.Int, 4, "发动机数量"); + thisParmsSql[7] = new SqlParameter("@厂牌编号起始号", SqlDbType.Int, 4, "厂牌编号起始号"); + thisParmsSql[8] = new SqlParameter("@客户名称", SqlDbType.NVarChar, 50, "客户名称"); + thisParmsSql[9] = new SqlParameter("@投料日期", SqlDbType.DateTime, 8, "投料日期"); + thisParmsSql[10] = new SqlParameter("@文件编号", SqlDbType.NVarChar, 50, "文件编号"); + thisParmsSql[11] = new SqlParameter("@集团名称", SqlDbType.NVarChar, 50, "集团名称"); + thisParmsSql[12] = new SqlParameter("@通知号", SqlDbType.NVarChar, 50, "通知号"); + + // + "@功率,@指南文件编号,@装机状态,@适用状态,@物料描述,@计划下达日期,@计划完工日期," + thisParmsSql[13] = new SqlParameter("@功率", SqlDbType.NVarChar, 50, "功率"); + thisParmsSql[14] = new SqlParameter("@指南文件编号", SqlDbType.NVarChar, 50, "指南文件编号"); + thisParmsSql[15] = new SqlParameter("@装机状态", SqlDbType.NVarChar, 50, "装机状态"); + thisParmsSql[16] = new SqlParameter("@适用状态", SqlDbType.DateTime, 8, "适用状态"); + thisParmsSql[17] = new SqlParameter("@物料描述", SqlDbType.NVarChar, 255, "物料描述"); + thisParmsSql[18] = new SqlParameter("@计划下达日期", SqlDbType.DateTime, 8, "计划下达日期"); + thisParmsSql[19] = new SqlParameter("@计划完工日期", SqlDbType.DateTime, 8, "计划完工日期"); + + // + "@主配厂家,@工位号,@工位名称,@物料号,@零件图号,@零件名称,@零件数量," + + thisParmsSql[20] = new SqlParameter("@主配厂家", SqlDbType.NVarChar, 50, "主配厂家"); + thisParmsSql[21] = new SqlParameter("@工位号", SqlDbType.NVarChar, 50, "工位号"); + thisParmsSql[22] = new SqlParameter("@工位名称", SqlDbType.NVarChar, 50, "工位名称"); + thisParmsSql[23] = new SqlParameter("@物料号", SqlDbType.NVarChar, 50, "物料号"); + thisParmsSql[24] = new SqlParameter("@零件图号", SqlDbType.NVarChar, 50, "零件图号"); + thisParmsSql[25] = new SqlParameter("@零件名称", SqlDbType.NVarChar, 50, "零件名称"); + thisParmsSql[26] = new SqlParameter("@零件数量", SqlDbType.Int, 4, "零件数量"); + + // +"[是否扫描],扫描方式代码, [扫描方式], [厂家代码],[生产厂家], " + + thisParmsSql[27] = new SqlParameter("@是否扫描", SqlDbType.Int, 4, "是否扫描"); + thisParmsSql[28] = new SqlParameter("@扫描方式代码", SqlDbType.Int, 4, "扫描方式代码"); + thisParmsSql[29] = new SqlParameter("@扫描方式", SqlDbType.NVarChar, 50, "扫描方式"); + thisParmsSql[30] = new SqlParameter("@厂家代码", SqlDbType.NVarChar, 50, "厂家代码"); + thisParmsSql[31] = new SqlParameter("@生产厂家", SqlDbType.NVarChar, 50, "生产厂家"); + + //+ "@操作指导,@发动机号,@物料号表索引号,@零件数量验证," + + thisParmsSql[32] = new SqlParameter("@操作指导", SqlDbType.NVarChar, 255, "操作指导"); + thisParmsSql[33] = new SqlParameter("@发动机号", SqlDbType.NVarChar, 50, "发动机号"); + thisParmsSql[34] = new SqlParameter("@追踪代码", SqlDbType.NVarChar, 50, "追踪代码"); + thisParmsSql[35] = new SqlParameter("@物料号表索引号", SqlDbType.Int, 4, "物料号表索引号"); + thisParmsSql[36] = new SqlParameter("@零件数量验证", SqlDbType.Int, 4, "零件数量验证"); + + // +"[物料条码], [物料条码物料号], [物料条码批次],@验证结果, [操作者工号], [操作者姓名], [班次代码], " + thisParmsSql[37] = new SqlParameter("@物料条码", SqlDbType.NVarChar, 50, "物料条码"); + thisParmsSql[38] = new SqlParameter("@物料条码物料号", SqlDbType.NVarChar, 50, "物料条码物料号"); + thisParmsSql[39] = new SqlParameter("@物料条码批次", SqlDbType.NVarChar, 50, "物料条码批次"); + thisParmsSql[40] = new SqlParameter("@验证结果", SqlDbType.Int, 4, "验证结果"); + thisParmsSql[41] = new SqlParameter("@操作者工号", SqlDbType.NVarChar, 50, "操作者工号"); + thisParmsSql[42] = new SqlParameter("@操作者姓名", SqlDbType.NVarChar, 50, "操作者姓名"); + thisParmsSql[43] = new SqlParameter("@班次代码", SqlDbType.NVarChar, 50, "班次代码"); + + // +"物料来源代码,物料来源,是否禁用代码,是否禁用,被强制验证物料号,更改代码,更改原因)" + + thisParmsSql[44] = new SqlParameter("@物料来源代码", SqlDbType.Int, 4, "物料来源代码"); + thisParmsSql[45] = new SqlParameter("@物料来源", SqlDbType.NVarChar, 50, "物料来源"); + thisParmsSql[46] = new SqlParameter("@是否禁用代码", SqlDbType.Int, 4, "是否禁用代码"); + thisParmsSql[47] = new SqlParameter("@是否禁用", SqlDbType.NVarChar, 50, "是否禁用"); + thisParmsSql[48] = new SqlParameter("@被强制验证物料号", SqlDbType.NVarChar, 50, "被强制验证物料号"); + thisParmsSql[49] = new SqlParameter("@更改代码", SqlDbType.NVarChar, 50, "更改代码"); + thisParmsSql[50] = new SqlParameter("@更改原因", SqlDbType.NVarChar, 255, "更改原因"); + thisParmsSql[51] = new SqlParameter("@操作时间", SqlDbType.DateTime, 8, "操作时间"); + + DataAccess.ExecuteSQL(sql, ref thisParmsSql, dt); + + } + /// + /// 异步操作方式 + /// _Access + ///MES_装配数据_零部件追溯_返修工位 + ///INSERT INTO [MES_装配数据_零部件追溯_返修工位] + ///增加数据, + /// + /// + /// + //public static void VerifyAssemblyPartTableRepairInsert_Access(DataTable dt) + //{ + // string sql; + // sql = "INSERT INTO [MES_装配数据_零部件追溯_返修工位]" + // + "([追溯代码],[订单号],[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + // + "[发动机数量], [厂牌编号起始号], [客户名称],[投料日期],[文件编号],[集团名称],[通知号]," + // + "[功率],[指南文件编号],[装机状态],[适用状态],[物料描述],[计划下达日期],[计划完工日期]," + // + "[主配厂家],[工位号], [工位名称],[物料号], [零件图号], [零件名称], [零件数量]," + // + "[是否扫描],[扫描方式代码], [扫描方式], [厂家代码],[生产厂家], " + // + "[操作指导],[发动机号],[追踪代码],[物料号表索引号],[零件数量验证]," + // + "[物料条码], [物料条码物料号], [物料条码批次],[验证结果], [操作者工号], [操作者姓名], [班次代码], " + // + "物料来源代码,物料来源,是否禁用代码,是否禁用,被强制验证物料号," + // +"更改代码,更改原因,操作时间)" + + // + "VALUES(@追溯代码,@订单号,@SAP物料号,@发动机型号,@发动机型号代码,@发动机机型," + // + "@发动机数量,@厂牌编号起始号,@客户名称,@投料日期,@文件编号,@集团名称,@通知号," + // + "@功率,@指南文件编号,@装机状态,@适用状态,@物料描述,@计划下达日期,@计划完工日期," + // + "@主配厂家,@工位号,@工位名称,@物料号,@零件图号,@零件名称,@零件数量," + // + " @是否扫描,@扫描方式代码,@扫描方式,@厂家代码,@生产厂家," + // + "@操作指导,@发动机号,@追踪代码,@物料号表索引号,@零件数量验证," + // + "@物料条码,@物料条码物料号,@物料条码批次,@验证结果,@操作者工号,@操作者姓名,@班次代码," + // + "@物料来源代码,@物料来源,@是否禁用代码,@是否禁用,@被强制验证物料号," + // +"@更改代码,@更改原因,@操作时间)"; + + + // OleDbParameter[] thisParms1 = new OleDbParameter[52]; + // // + "([追溯代码],[订单号],[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + // thisParms1[0] = new OleDbParameter("@追溯代码", OleDbType.Integer, 4, "追溯代码"); + // thisParms1[1] = new OleDbParameter("@订单号", OleDbType.VarChar, 50, "订单号"); + // thisParms1[2] = new OleDbParameter("@SAP物料号", OleDbType.VarChar, 50, "SAP物料号"); + // thisParms1[3] = new OleDbParameter("@发动机型号", OleDbType.VarChar, 50, "发动机型号"); + // thisParms1[4] = new OleDbParameter("@发动机型号代码", OleDbType.Integer, 4, "发动机型号代码"); + // thisParms1[5] = new OleDbParameter("@发动机机型", OleDbType.VarChar, 50, "发动机机型"); + + // // + "@发动机数量,@厂牌编号起始号,@客户名称,@投料日期,@文件编号,@集团名称,@通知号," + // thisParms1[6] = new OleDbParameter("@发动机数量", OleDbType.Integer, 4, "发动机数量"); + // thisParms1[7] = new OleDbParameter("@厂牌编号起始号", OleDbType.Integer, 4, "厂牌编号起始号"); + // thisParms1[8] = new OleDbParameter("@客户名称", OleDbType.VarChar, 50, "客户名称"); + // thisParms1[9] = new OleDbParameter("@投料日期", OleDbType.DBDate, 8, "投料日期"); + // thisParms1[10] = new OleDbParameter("@文件编号", OleDbType.VarChar, 50, "文件编号"); + // thisParms1[11] = new OleDbParameter("@集团名称", OleDbType.VarChar, 50, "集团名称"); + // thisParms1[12] = new OleDbParameter("@通知号", OleDbType.VarChar, 50, "通知号"); + + // // + "@功率,@指南文件编号,@装机状态,@适用状态,@物料描述,@计划下达日期,@计划完工日期," + // thisParms1[13] = new OleDbParameter("@功率", OleDbType.VarChar, 50, "功率"); + // thisParms1[14] = new OleDbParameter("@指南文件编号", OleDbType.VarChar, 50, "指南文件编号"); + // thisParms1[15] = new OleDbParameter("@装机状态", OleDbType.VarChar, 50, "装机状态"); + // thisParms1[16] = new OleDbParameter("@适用状态", OleDbType.DBDate, 8, "适用状态"); + // thisParms1[17] = new OleDbParameter("@物料描述", OleDbType.VarChar, 255, "物料描述"); + // thisParms1[18] = new OleDbParameter("@计划下达日期", OleDbType.DBDate, 8, "计划下达日期"); + // thisParms1[19] = new OleDbParameter("@计划完工日期", OleDbType.DBDate, 8, "计划完工日期"); + + // // + "@主配厂家,@工位号,@工位名称,@物料号,@零件图号,@零件名称,@零件数量," + + // thisParms1[20] = new OleDbParameter("@主配厂家", OleDbType.VarChar, 50, "主配厂家"); + // thisParms1[21] = new OleDbParameter("@工位号", OleDbType.VarChar, 50, "工位号"); + // thisParms1[22] = new OleDbParameter("@工位名称", OleDbType.VarChar, 50, "工位名称"); + // thisParms1[23] = new OleDbParameter("@物料号", OleDbType.VarChar, 50, "物料号"); + // thisParms1[24] = new OleDbParameter("@零件图号", OleDbType.VarChar, 50, "零件图号"); + // thisParms1[25] = new OleDbParameter("@零件名称", OleDbType.VarChar, 50, "零件名称"); + // thisParms1[26] = new OleDbParameter("@零件数量", OleDbType.Integer, 4, "零件数量"); + + // // +"[是否扫描],扫描方式代码, [扫描方式], [厂家代码],[生产厂家], " + + // thisParms1[27] = new OleDbParameter("@是否扫描", OleDbType.Integer, 4, "是否扫描"); + // thisParms1[28] = new OleDbParameter("@扫描方式代码", OleDbType.Integer, 4, "扫描方式代码"); + // thisParms1[29] = new OleDbParameter("@扫描方式", OleDbType.VarChar, 50, "扫描方式"); + // thisParms1[30] = new OleDbParameter("@厂家代码", OleDbType.VarChar, 50, "厂家代码"); + // thisParms1[31] = new OleDbParameter("@生产厂家", OleDbType.VarChar, 50, "生产厂家"); + + // //+ "@操作指导,@发动机号,@物料号表索引号,@零件数量验证," + + // thisParms1[32] = new OleDbParameter("@操作指导", OleDbType.VarChar, 255, "操作指导"); + // thisParms1[33] = new OleDbParameter("@发动机号", OleDbType.VarChar, 50, "发动机号"); + // thisParms1[34] = new OleDbParameter("@追踪代码", OleDbType.VarChar, 50, "追踪代码"); + // thisParms1[35] = new OleDbParameter("@物料号表索引号", OleDbType.Integer, 4, "物料号表索引号"); + // thisParms1[36] = new OleDbParameter("@零件数量验证", OleDbType.Integer, 4, "零件数量验证"); + + // // +"[物料条码], [物料条码物料号], [物料条码批次],@验证结果, [操作者工号], [操作者姓名], [班次代码], " + // thisParms1[37] = new OleDbParameter("@物料条码", OleDbType.VarChar, 50, "物料条码"); + // thisParms1[38] = new OleDbParameter("@物料条码物料号", OleDbType.VarChar, 50, "物料条码物料号"); + // thisParms1[39] = new OleDbParameter("@物料条码批次", OleDbType.VarChar, 50, "物料条码批次"); + // thisParms1[40] = new OleDbParameter("@验证结果", OleDbType.Integer, 4, "验证结果"); + // thisParms1[41] = new OleDbParameter("@操作者工号", OleDbType.VarChar, 50, "操作者工号"); + // thisParms1[42] = new OleDbParameter("@操作者姓名", OleDbType.VarChar, 50, "操作者姓名"); + // thisParms1[43] = new OleDbParameter("@班次代码", OleDbType.VarChar, 50, "班次代码"); + + // // +"物料来源代码,物料来源,是否禁用代码,是否禁用,被强制验证物料号,更改代码,更改原因)" + + // thisParms1[44] = new OleDbParameter("@物料来源代码", OleDbType.Integer, 4, "物料来源代码"); + // thisParms1[45] = new OleDbParameter("@物料来源", OleDbType.VarChar, 50, "物料来源"); + // thisParms1[46] = new OleDbParameter("@是否禁用代码", OleDbType.Integer, 4, "是否禁用代码"); + // thisParms1[47] = new OleDbParameter("@是否禁用", OleDbType.VarChar, 50, "是否禁用"); + // thisParms1[48] = new OleDbParameter("@被强制验证物料号", OleDbType.VarChar, 50, "被强制验证物料号"); + // thisParms1[49] = new OleDbParameter("@更改代码", OleDbType.VarChar, 50, "更改代码"); + // thisParms1[50] = new OleDbParameter("@更改原因", OleDbType.VarChar, 255, "更改原因"); + // thisParms1[51] = new OleDbParameter("@操作时间", OleDbType.DBTimeStamp, 8, "操作时间"); + + // DataAccess.ExecuteDataTable_OleDb_Insert_Access(sql, dt, ref thisParms1); + //} + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.AssemblyPartTrace.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.AssemblyPartTrace.cs new file mode 100644 index 0000000..1952886 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.AssemblyPartTrace.cs @@ -0,0 +1,687 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using System.Data.OleDb; +using DataLinkMesWork; +//using SystemFramework; + +namespace bizFacade +{ + /// + /// 关键零部件追溯 + /// + public partial class BaseDataSystemMES + { + + /// + /// 数据上传 + /// 删除数据 + /// MES_装配数据_零部件追溯 + /// + /// 追溯代码 + //static public bool PartTraceTableDelete(long traceID) + //{ + // string sql; + // sql = "DELETE FROM [MES_装配数据_零部件追溯] " + // + " WHERE 追溯代码=" + traceID.ToString(); + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// 数据上传 + /// 删除数据 + /// MES_装配数据_零部件追溯_数据主表 + /// + /// 追溯代码 + //static public bool PartTraceMainTableDelete(long traceID) + //{ + // string sql; + // sql = "DELETE FROM [MES_装配数据_零部件追溯_数据主表] " + // + " WHERE 追溯代码=" + traceID.ToString(); + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// 数据上传 + /// 查询数据 + /// MES_装配数据_零部件追溯 + /// + /// 追溯代码 + /// + //static public bool PartTraceTableSelect(long traceID, out DataTable dt) + //{ + // string sql; + // dt = null; + // sql = "SELECT * FROM [MES_装配数据_零部件追溯] " + // + " WHERE 追溯代码=" + traceID.ToString(); + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + + /// + /// 数据上传 + /// 查询数据 + /// MES_装配数据_零部件追溯_数据主表 + /// + //static public bool PartTraceMainTableSelect(out DataTable dt) + //{ + // string sql; + // dt = null; + // sql = "SELECT * FROM [MES_装配数据_零部件追溯_数据主表] "; + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + /// + /// 数据上传 + /// 查询数据 + /// [MES_装配数据_零部件追溯_发动机号与缸盖号] + /// + //static public bool EngineID_CapNumber_Select(out DataTable dt) + //{ + // string sql; + // dt = null; + // sql = "SELECT * FROM [MES_装配数据_零部件追溯_发动机号与缸盖号] "; + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + /// + /// 数据上传 + /// 删除数据 + /// [MES_装配数据_零部件追溯_发动机号与缸盖号] + /// + //static public bool EngineID_CapNumber_Delete(int traceID) + //{ + // string sql; + // sql = "DELETE FROM [MES_装配数据_零部件追溯_发动机号与缸盖号] " + // + " WHERE 追溯代码=" + traceID.ToString()+""; + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + + /// + /// 数据上传 + /// MES_装配数据_零部件追溯_增加 + /// + /// + /// + public static bool VerifyAssemblyPartTableInsert_OnlySqlServer(DataTable dt) + { + return VerifyAssemblyPartTableInsert_SqlServer(dt); + } + /// + /// 数据上传 + /// 增加数据 + /// MES_装配数据_零部件追溯_数据主表 + /// 工件到达时间离开时间 + /// 返回“追溯代码” + /// + static public bool AssemblyPartIndexTableInsert_OnlySqlServer(out long traceID) + { + traceID = 0; + string sql = GetSqlStringAssemblyPartIndexTable(); + //if (SQLCommon.SqlServerConnectionStatus) + { + return DataAccess.ExecuteNonQuery_newID(sql, out traceID); + } + //return false; + } + + /// + /// 数据上传 + /// MES_装配数据_零部件追溯_增加 + /// + /// + /// + //public static bool VerifyAssemblyPartTableInsert_OnlyAccess(DataTable dt) + //{ + // return VerifyAssemblyPartTableInsert_Access(dt); + //} + + + /// + /// 分装线物料追踪 + /// 增加数据 + /// MES_装配数据_零部件追溯_数据主表 + /// 工件到达时间离开时间 + /// 返回“追溯代码” + /// + /// + /// + //static public bool AssemblyPartIndexTableInsert_OnlyAccess(out long traceID) + //{ + // traceID = 0; + // string sql = GetSqlStringAssemblyPartIndexTable(); + // DataAccess.ExecuteNonQuery_newID_OleDb(sql, out traceID); + // return false; + //} + + /// + /// MES_装配数据_零部件追溯_数据主表 + /// 删除物料数据 + /// + /// + /// + static public void AssemblyPartIndexTableDelete(string opName,string engineID) + { + DataTable dt; + int traceID = 0; + try + { + //获得 traceID; + + string sql; + sql = "SELECT top 1 追溯代码 From [MES_装配数据_零部件追溯_数据主表]" + + " WHERE 工位号='" + opName+"'" + + " and 发动机号 = '" + engineID+"'"; + + //if (SQLCommon.SqlServerConnectionStatus) + { + DataAccess.ExecuteDataTable( sql, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + traceID = Convert.ToInt32(dt.Rows[0]["追溯代码"]); + sql = " DELETE FROM MES_装配数据_零部件追溯 " + + " WHERE 追溯代码 = " + traceID.ToString(); + DataAccess.ExecuteSQL(sql); + sql = " DELETE FROM MES_装配数据_零部件追溯_数据主表 " + + " WHERE 追溯代码 = " + traceID.ToString(); + DataAccess.ExecuteSQL(sql); + } + } + } + //if (!SQLCommon.SqlServerConnectionStatus) + //{ + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // traceID = Convert.ToInt32(dt.Rows[0]["追溯代码"]); + // sql = " DELETE FROM MES_装配数据_零部件追溯 " + // + " WHERE 追溯代码 = " + traceID.ToString(); + // DataAccess.ExecuteSQL_OleDb_Access(sql); + // sql = " DELETE FROM MES_装配数据_零部件追溯_数据主表 " + // + " WHERE 追溯代码 = " + traceID.ToString(); + // DataAccess.ExecuteSQL_OleDb_Access(sql); + // } + // } + //} + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + } + } + + + + + /// + /// 获得增加表[MES_装配数据_工位返修]的SQL语句 + /// [订单号], [发动机号], [工位号], [操作者工号], [班次代码], + ///[返修原因代码], [返修原因内容] + /// 1:设备返修 2:MES放行 + /// + private static string GetSqlStringRepairReasonTable() + { + string sql = null; + sql = "INSERT INTO [MES_装配数据_工位返修] " + + "(订单号,发动机号,发动机型号代码,工位号,操作者工号,班次代码,返修原因代码,返修原因内容)" + + " VALUES (" + + "'" + MaterialData.orderForm + "'," + + "'" + MaterialData.engineNumber + "'," + + "" + MaterialData.engineNumberCode + "," + + "'" + MaterialData.opName + "'," + + "'" + MaterialData.operatorCode + "'," + + "'" + MaterialData.operatorShift + "'," + + + "" + MaterialData.RepairReasonID.ToString() + "," + + "'" + MaterialData.RepairReasonText.ToString() + "') "; + return sql; + } + /// + /// MES_装配数据_工位返修 + /// + static public void AssemblyRepairReasonTableInsert() + { + try + { + string sql = GetSqlStringRepairReasonTable(); + //if (SQLCommon.SqlServerConnectionStatus) + { + DataAccess.ExecuteSQL(sql); + + } + //if (!SQLCommon.SqlServerConnectionStatus) + //{ + // DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + } + } + + /// + /// MES_装配数据_零部件追溯_删除 + /// + /// + /// + /// + public static void VerifyAssemblyPartTableDelete(string opName, string engineID) + { + + string sql; + sql = "DELETE FROM [MES_装配数据_零部件追溯]" + + " where 工位号='" + opName + "'" + + " and 发动机号='" + engineID + "'"; + + //if (SQLCommon.SqlServerConnectionStatus) + { + DataAccess.ExecuteSQL(sql); + + } + //if (!SQLCommon.SqlServerConnectionStatus) + //{ + // DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + } + + + /// + /// MES_装配数据_零部件追溯_返修工位 + /// + /// + /// + public static void VerifyAssemblyPartTableInsert_Repair(DataTable dt) + { + + //if (SQLCommon.SqlServerConnectionStatus) + { + //如果与SQL Server 数据库通讯失败,ApplicationConfig.connectionStringPIS_NEW_Value = "0" + VerifyAssemblyPartTableInsert_SqlServer_Repair(dt); + } + //if (!SQLCommon.SqlServerConnectionStatus) + //{ + // VerifyAssemblyPartTableInsert_Access_Repair(dt); + //} + + } + + /// + /// 同步通讯方式 + /// MES_装配数据_零部件追溯_返修工位 + /// SQL Server 数据库 + /// + /// + /// + public static bool VerifyAssemblyPartTableInsert_SqlServer_Repair(DataTable dt) + { + string sql; + sql = "INSERT INTO [MES_装配数据_零部件追溯_返修工位]" + + "([追溯代码],[订单号],[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + + "[发动机数量], [厂牌编号起始号], [客户名称],[投料日期],[文件编号],[集团名称],[通知号]," + + "[功率],[指南文件编号],[装机状态],[适用状态],[物料描述],[计划下达日期],[计划完工日期]," + + "[主配厂家],[工位号], [工位名称],[物料号], [零件图号], [零件名称], [零件数量]," + + "[是否扫描],[扫描方式代码], [扫描方式], [是否主物料],[厂家代码],[生产厂家], " + + "[操作指导],[发动机号],[追踪代码],[主物料号],[物料号表索引号],[零件数量验证]," + + "[物料条码], [物料条码物料号], [物料条码批次],[验证结果], [操作者工号], [操作者姓名], [班次代码], " + + "物料来源代码,物料来源,是否禁用代码,是否禁用,被强制验证物料号," + + "更改代码,更改原因,零件类型,操作时间)" + + + "VALUES(@追溯代码,@订单号,@SAP物料号,@发动机型号,@发动机型号代码,@发动机机型," + + "@发动机数量,@厂牌编号起始号,@客户名称,@投料日期,@文件编号,@集团名称,@通知号," + + "@功率,@指南文件编号,@装机状态,@适用状态,@物料描述,@计划下达日期,@计划完工日期," + + "@主配厂家,@工位号,@工位名称,@物料号,@零件图号,@零件名称,@零件数量," + + " @是否扫描,@扫描方式代码,@扫描方式,@是否主物料,@厂家代码,@生产厂家," + + "@操作指导,@发动机号,@追踪代码,@主物料号,@物料号表索引号,@零件数量验证," + + "@物料条码,@物料条码物料号,@物料条码批次,@验证结果,@操作者工号,@操作者姓名,@班次代码," + + "@物料来源代码,@物料来源,@是否禁用代码,@是否禁用,@被强制验证物料号," + + "@更改代码,@更改原因,@零件类型,@操作时间)"; + + + + SqlParameter[] thisParmsSql = new SqlParameter[55]; + // + "([订单号],[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + thisParmsSql[0] = new SqlParameter("@追溯代码", SqlDbType.Int, 4, "追溯代码"); + thisParmsSql[1] = new SqlParameter("@订单号", SqlDbType.NVarChar, 50, "订单号"); + thisParmsSql[2] = new SqlParameter("@SAP物料号", SqlDbType.NVarChar, 50, "SAP物料号"); + thisParmsSql[3] = new SqlParameter("@发动机型号", SqlDbType.NVarChar, 50, "发动机型号"); + thisParmsSql[4] = new SqlParameter("@发动机型号代码", SqlDbType.Int, 4, "发动机型号代码"); + thisParmsSql[5] = new SqlParameter("@发动机机型", SqlDbType.NVarChar, 50, "发动机机型"); + + // + "@发动机数量,@厂牌编号起始号,@客户名称,@投料日期,@文件编号,@集团名称,@通知号," + thisParmsSql[6] = new SqlParameter("@发动机数量", SqlDbType.Int, 4, "发动机数量"); + thisParmsSql[7] = new SqlParameter("@厂牌编号起始号", SqlDbType.Int, 4, "厂牌编号起始号"); + thisParmsSql[8] = new SqlParameter("@客户名称", SqlDbType.NVarChar, 50, "客户名称"); + thisParmsSql[9] = new SqlParameter("@投料日期", SqlDbType.DateTime, 8, "投料日期"); + thisParmsSql[10] = new SqlParameter("@文件编号", SqlDbType.NVarChar, 50, "文件编号"); + thisParmsSql[11] = new SqlParameter("@集团名称", SqlDbType.NVarChar, 50, "集团名称"); + thisParmsSql[12] = new SqlParameter("@通知号", SqlDbType.NVarChar, 50, "通知号"); + + // + "@功率,@指南文件编号,@装机状态,@适用状态,@物料描述,@计划下达日期,@计划完工日期," + thisParmsSql[13] = new SqlParameter("@功率", SqlDbType.NVarChar, 50, "功率"); + thisParmsSql[14] = new SqlParameter("@指南文件编号", SqlDbType.NVarChar, 50, "指南文件编号"); + thisParmsSql[15] = new SqlParameter("@装机状态", SqlDbType.NVarChar, 50, "装机状态"); + thisParmsSql[16] = new SqlParameter("@适用状态", SqlDbType.DateTime, 8, "适用状态"); + thisParmsSql[17] = new SqlParameter("@物料描述", SqlDbType.NVarChar, 255, "物料描述"); + thisParmsSql[18] = new SqlParameter("@计划下达日期", SqlDbType.DateTime, 8, "计划下达日期"); + thisParmsSql[19] = new SqlParameter("@计划完工日期", SqlDbType.DateTime, 8, "计划完工日期"); + + // + "@主配厂家,@工位号,@工位名称,@物料号,@零件图号,@零件名称,@零件数量," + + thisParmsSql[20] = new SqlParameter("@主配厂家", SqlDbType.NVarChar, 50, "主配厂家"); + thisParmsSql[21] = new SqlParameter("@工位号", SqlDbType.NVarChar, 50, "工位号"); + thisParmsSql[22] = new SqlParameter("@工位名称", SqlDbType.NVarChar, 50, "工位名称"); + thisParmsSql[23] = new SqlParameter("@物料号", SqlDbType.NVarChar, 50, "物料号"); + thisParmsSql[24] = new SqlParameter("@零件图号", SqlDbType.NVarChar, 50, "零件图号"); + thisParmsSql[25] = new SqlParameter("@零件名称", SqlDbType.NVarChar, 50, "零件名称"); + thisParmsSql[26] = new SqlParameter("@零件数量", SqlDbType.Int, 4, "零件数量"); + + // +"[是否扫描],扫描方式代码, [扫描方式], [厂家代码],[生产厂家], " + + thisParmsSql[27] = new SqlParameter("@是否扫描", SqlDbType.Int, 4, "是否扫描"); + thisParmsSql[28] = new SqlParameter("@扫描方式代码", SqlDbType.Int, 4, "扫描方式代码"); + thisParmsSql[29] = new SqlParameter("@扫描方式", SqlDbType.NVarChar, 50, "扫描方式"); + thisParmsSql[30] = new SqlParameter("@是否主物料", SqlDbType.Int, 4, "是否主物料"); + thisParmsSql[31] = new SqlParameter("@厂家代码", SqlDbType.NVarChar, 50, "厂家代码"); + thisParmsSql[32] = new SqlParameter("@生产厂家", SqlDbType.NVarChar, 50, "生产厂家"); + + //+ "@操作指导,@发动机号,@物料号表索引号,@零件数量验证," + + thisParmsSql[33] = new SqlParameter("@操作指导", SqlDbType.NVarChar, 255, "操作指导"); + thisParmsSql[34] = new SqlParameter("@发动机号", SqlDbType.NVarChar, 50, "发动机号"); + thisParmsSql[35] = new SqlParameter("@追踪代码", SqlDbType.NVarChar, 50, "追踪代码"); + thisParmsSql[36] = new SqlParameter("@主物料号", SqlDbType.NVarChar, 50, "主物料号"); + thisParmsSql[37] = new SqlParameter("@物料号表索引号", SqlDbType.Int, 4, "物料号表索引号"); + thisParmsSql[38] = new SqlParameter("@零件数量验证", SqlDbType.Int, 4, "零件数量验证"); + + // +"[物料条码], [物料条码物料号], [物料条码批次],@验证结果, [操作者工号], [操作者姓名], [班次代码], " + thisParmsSql[39] = new SqlParameter("@物料条码", SqlDbType.NVarChar, 50, "物料条码"); + thisParmsSql[40] = new SqlParameter("@物料条码物料号", SqlDbType.NVarChar, 50, "物料条码物料号"); + thisParmsSql[41] = new SqlParameter("@物料条码批次", SqlDbType.NVarChar, 50, "物料条码批次"); + thisParmsSql[42] = new SqlParameter("@验证结果", SqlDbType.Int, 4, "验证结果"); + thisParmsSql[43] = new SqlParameter("@操作者工号", SqlDbType.NVarChar, 50, "操作者工号"); + thisParmsSql[44] = new SqlParameter("@操作者姓名", SqlDbType.NVarChar, 50, "操作者姓名"); + thisParmsSql[45] = new SqlParameter("@班次代码", SqlDbType.NVarChar, 50, "班次代码"); + + // +"物料来源代码,物料来源,是否禁用代码,是否禁用,被强制验证物料号,更改代码,更改原因)" + + thisParmsSql[46] = new SqlParameter("@物料来源代码", SqlDbType.Int, 4, "物料来源代码"); + thisParmsSql[47] = new SqlParameter("@物料来源", SqlDbType.NVarChar, 50, "物料来源"); + thisParmsSql[48] = new SqlParameter("@是否禁用代码", SqlDbType.Int, 4, "是否禁用代码"); + thisParmsSql[49] = new SqlParameter("@是否禁用", SqlDbType.NVarChar, 50, "是否禁用"); + thisParmsSql[50] = new SqlParameter("@被强制验证物料号", SqlDbType.NVarChar, 50, "被强制验证物料号"); + thisParmsSql[51] = new SqlParameter("@更改代码", SqlDbType.NVarChar, 50, "更改代码"); + thisParmsSql[52] = new SqlParameter("@更改原因", SqlDbType.NVarChar, 255, "更改原因"); + thisParmsSql[53] = new SqlParameter("@零件类型", SqlDbType.Int, 4, "零件类型"); + thisParmsSql[54] = new SqlParameter("@操作时间", SqlDbType.DateTime, 8, "操作时间"); + + //如果与SQL Server 数据库通讯失败,ApplicationConfig.connectionStringPIS_NEW_Value = "0" + return DataAccess.ExecuteSQL(sql, ref thisParmsSql, dt); + + + + } + + + /// + /// 异步通讯方式 + /// 增加数据到Access数据库 + /// MES_装配数据_零部件追溯_返修工位 + /// INSERT INTO [MES_装配数据_零部件追溯_返修工位] + /// + /// + /// + //public static bool VerifyAssemblyPartTableInsert_Access_Repair(DataTable dt) + //{ + // string sql; + // sql = "INSERT INTO [MES_装配数据_零部件追溯_返修工位]" + // + "([追溯代码],[订单号],[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + // + "[发动机数量], [厂牌编号起始号], [客户名称],[投料日期],[文件编号],[集团名称],[通知号]," + // + "[功率],[指南文件编号],[装机状态],[适用状态],[物料描述],[计划下达日期],[计划完工日期]," + // + "[主配厂家],[工位号], [工位名称],[物料号], [零件图号], [零件名称], [零件数量]," + // + "[是否扫描],[扫描方式代码], [扫描方式], [是否主物料],[厂家代码],[生产厂家], " + // + "[操作指导],[发动机号],[追踪代码],[主物料号],[物料号表索引号],[零件数量验证]," + // + "[物料条码], [物料条码物料号], [物料条码批次],[验证结果], [操作者工号], [操作者姓名], [班次代码], " + // + "物料来源代码,物料来源,是否禁用代码,是否禁用,被强制验证物料号,更改代码,更改原因,零件类型,操作时间)" + + // + "VALUES(@追溯代码,@订单号,@SAP物料号,@发动机型号,@发动机型号代码,@发动机机型," + // + "@发动机数量,@厂牌编号起始号,@客户名称,@投料日期,@文件编号,@集团名称,@通知号," + // + "@功率,@指南文件编号,@装机状态,@适用状态,@物料描述,@计划下达日期,@计划完工日期," + // + "@主配厂家,@工位号,@工位名称,@物料号,@零件图号,@零件名称,@零件数量," + // + " @是否扫描,@扫描方式代码,@扫描方式,@是否主物料,@厂家代码,@生产厂家," + // + "@操作指导,@发动机号,@追踪代码,@主物料号,@物料号表索引号,@零件数量验证," + // + "@物料条码,@物料条码物料号,@物料条码批次,@验证结果,@操作者工号,@操作者姓名,@班次代码," + // + "@物料来源代码,@物料来源,@是否禁用代码,@是否禁用,@被强制验证物料号," + // + "@更改代码,@更改原因,@零件类型,@操作时间)"; + + + // OleDbParameter[] thisParms1 = new OleDbParameter[55]; + // // + "([追溯代码],[订单号],[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + // thisParms1[0] = new OleDbParameter("@追溯代码", OleDbType.Integer, 4, "追溯代码"); + // thisParms1[1] = new OleDbParameter("@订单号", OleDbType.VarChar, 50, "订单号"); + // thisParms1[2] = new OleDbParameter("@SAP物料号", OleDbType.VarChar, 50, "SAP物料号"); + // thisParms1[3] = new OleDbParameter("@发动机型号", OleDbType.VarChar, 50, "发动机型号"); + // thisParms1[4] = new OleDbParameter("@发动机型号代码", OleDbType.Integer, 4, "发动机型号代码"); + // thisParms1[5] = new OleDbParameter("@发动机机型", OleDbType.VarChar, 50, "发动机机型"); + + // // + "@发动机数量,@厂牌编号起始号,@客户名称,@投料日期,@文件编号,@集团名称,@通知号," + // thisParms1[6] = new OleDbParameter("@发动机数量", OleDbType.Integer, 4, "发动机数量"); + // thisParms1[7] = new OleDbParameter("@厂牌编号起始号", OleDbType.Integer, 4, "厂牌编号起始号"); + // thisParms1[8] = new OleDbParameter("@客户名称", OleDbType.VarChar, 50, "客户名称"); + // thisParms1[9] = new OleDbParameter("@投料日期", OleDbType.DBDate, 8, "投料日期"); + // thisParms1[10] = new OleDbParameter("@文件编号", OleDbType.VarChar, 50, "文件编号"); + // thisParms1[11] = new OleDbParameter("@集团名称", OleDbType.VarChar, 50, "集团名称"); + // thisParms1[12] = new OleDbParameter("@通知号", OleDbType.VarChar, 50, "通知号"); + + // // + "@功率,@指南文件编号,@装机状态,@适用状态,@物料描述,@计划下达日期,@计划完工日期," + // thisParms1[13] = new OleDbParameter("@功率", OleDbType.VarChar, 50, "功率"); + // thisParms1[14] = new OleDbParameter("@指南文件编号", OleDbType.VarChar, 50, "指南文件编号"); + // thisParms1[15] = new OleDbParameter("@装机状态", OleDbType.VarChar, 50, "装机状态"); + // thisParms1[16] = new OleDbParameter("@适用状态", OleDbType.DBDate, 8, "适用状态"); + // thisParms1[17] = new OleDbParameter("@物料描述", OleDbType.VarChar, 255, "物料描述"); + // thisParms1[18] = new OleDbParameter("@计划下达日期", OleDbType.DBDate, 8, "计划下达日期"); + // thisParms1[19] = new OleDbParameter("@计划完工日期", OleDbType.DBDate, 8, "计划完工日期"); + + // // + "@主配厂家,@工位号,@工位名称,@物料号,@零件图号,@零件名称,@零件数量," + + // thisParms1[20] = new OleDbParameter("@主配厂家", OleDbType.VarChar, 50, "主配厂家"); + // thisParms1[21] = new OleDbParameter("@工位号", OleDbType.VarChar, 50, "工位号"); + // thisParms1[22] = new OleDbParameter("@工位名称", OleDbType.VarChar, 50, "工位名称"); + // thisParms1[23] = new OleDbParameter("@物料号", OleDbType.VarChar, 50, "物料号"); + // thisParms1[24] = new OleDbParameter("@零件图号", OleDbType.VarChar, 50, "零件图号"); + // thisParms1[25] = new OleDbParameter("@零件名称", OleDbType.VarChar, 50, "零件名称"); + // thisParms1[26] = new OleDbParameter("@零件数量", OleDbType.Integer, 4, "零件数量"); + + // // +"[是否扫描],扫描方式代码, [扫描方式], [厂家代码],[生产厂家], " + + // thisParms1[27] = new OleDbParameter("@是否扫描", OleDbType.Integer, 4, "是否扫描"); + // thisParms1[28] = new OleDbParameter("@扫描方式代码", OleDbType.Integer, 4, "扫描方式代码"); + // thisParms1[29] = new OleDbParameter("@扫描方式", OleDbType.VarChar, 50, "扫描方式"); + // thisParms1[30] = new OleDbParameter("@是否主物料", OleDbType.Integer, 4, "是否主物料"); + // thisParms1[31] = new OleDbParameter("@厂家代码", OleDbType.VarChar, 50, "厂家代码"); + // thisParms1[32] = new OleDbParameter("@生产厂家", OleDbType.VarChar, 50, "生产厂家"); + + // //+ "@操作指导,@发动机号,@物料号表索引号,@零件数量验证," + + // thisParms1[33] = new OleDbParameter("@操作指导", OleDbType.VarChar, 255, "操作指导"); + // thisParms1[34] = new OleDbParameter("@发动机号", OleDbType.VarChar, 50, "发动机号"); + // thisParms1[35] = new OleDbParameter("@追踪代码", OleDbType.VarChar, 50, "追踪代码"); + // thisParms1[36] = new OleDbParameter("@主物料号", OleDbType.VarChar, 50, "主物料号"); + // thisParms1[37] = new OleDbParameter("@物料号表索引号", OleDbType.Integer, 4, "物料号表索引号"); + // thisParms1[38] = new OleDbParameter("@零件数量验证", OleDbType.Integer, 4, "零件数量验证"); + + // // +"[物料条码], [物料条码物料号], [物料条码批次],@验证结果, [操作者工号], [操作者姓名], [班次代码], " + // thisParms1[39] = new OleDbParameter("@物料条码", OleDbType.VarChar, 50, "物料条码"); + // thisParms1[40] = new OleDbParameter("@物料条码物料号", OleDbType.VarChar, 50, "物料条码物料号"); + // thisParms1[41] = new OleDbParameter("@物料条码批次", OleDbType.VarChar, 50, "物料条码批次"); + // thisParms1[42] = new OleDbParameter("@验证结果", OleDbType.Integer, 4, "验证结果"); + // thisParms1[43] = new OleDbParameter("@操作者工号", OleDbType.VarChar, 50, "操作者工号"); + // thisParms1[44] = new OleDbParameter("@操作者姓名", OleDbType.VarChar, 50, "操作者姓名"); + // thisParms1[45] = new OleDbParameter("@班次代码", OleDbType.VarChar, 50, "班次代码"); + + // // +"物料来源代码,物料来源,是否禁用代码,是否禁用,被强制验证物料号,更改代码,更改原因)" + + // thisParms1[46] = new OleDbParameter("@物料来源代码", OleDbType.Integer, 4, "物料来源代码"); + // thisParms1[47] = new OleDbParameter("@物料来源", OleDbType.VarChar, 50, "物料来源"); + // thisParms1[48] = new OleDbParameter("@是否禁用代码", OleDbType.Integer, 4, "是否禁用代码"); + // thisParms1[49] = new OleDbParameter("@是否禁用", OleDbType.VarChar, 50, "是否禁用"); + // thisParms1[50] = new OleDbParameter("@被强制验证物料号", OleDbType.VarChar, 50, "被强制验证物料号"); + // thisParms1[51] = new OleDbParameter("@更改代码", OleDbType.VarChar, 50, "更改代码"); + // thisParms1[52] = new OleDbParameter("@更改原因", OleDbType.VarChar, 255, "更改原因"); + // thisParms1[53] = new OleDbParameter("@零件类型", OleDbType.Integer, 4, "零件类型"); + // thisParms1[54] = new OleDbParameter("@操作时间", OleDbType.DBTimeStamp, 8, "操作时间"); + + // return DataAccess.ExecuteDataTable_OleDb_Insert_Access(sql, dt, ref thisParms1); + //} + /// + /// MES_装配数据_零部件追溯_返修工位_返修原因 + /// + /// + /// + public static void RepairReasonInsert(DataTable dt) + { + + //if (SQLCommon.SqlServerConnectionStatus) + { + //如果与SQL Server 数据库通讯失败,ApplicationConfig.connectionStringPIS_NEW_Value = "0" + RepairReasonInsert_SqlServer(dt); + } + //if (!SQLCommon.SqlServerConnectionStatus) + //{ + // RepairReasonInsert_Access(dt); + //} + + } + /// + /// MES_装配数据_零部件追溯_返修工位_返修原因 + /// + /// + /// + public static void RepairReasonInsert_OnlySqlServer(DataTable dt) + { + + //if (SQLCommon.SqlServerConnectionStatus) + { + //如果与SQL Server 数据库通讯失败,ApplicationConfig.connectionStringPIS_NEW_Value = "0" + RepairReasonInsert_SqlServer(dt); + } + } + /// + /// 同步通讯方式 + /// MES_装配数据_零部件追溯_返修工位_返修原因 + /// SQL Server 数据库 + /// + /// + /// + private static bool RepairReasonInsert_SqlServer(DataTable dt) + { + string sql; + sql = "INSERT INTO [MES_装配数据_零部件追溯_返修工位_返修原因]" + + "([追溯代码],[返修原因代码],[返修原因内容])" + + + "VALUES(@追溯代码,@返修原因代码,@返修原因内容)"; + SqlParameter[] thisParmsSql = new SqlParameter[3]; + thisParmsSql[0] = new SqlParameter("@追溯代码", SqlDbType.Int, 4, "追溯代码"); + thisParmsSql[1] = new SqlParameter("@返修原因代码", SqlDbType.Int, 4, "返修原因代码"); + thisParmsSql[2] = new SqlParameter("@返修原因内容", SqlDbType.NVarChar, 200, "返修原因内容"); + + return DataAccess.ExecuteSQL(sql, ref thisParmsSql, dt); + } + /// + /// 异步通讯方式 + /// INSERT INTO [MES_装配数据_零部件追溯_返修工位_返修原因] + /// + /// + /// + //private static bool RepairReasonInsert_Access(DataTable dt) + //{ + // string sql; + // sql = "INSERT INTO [MES_装配数据_零部件追溯_返修工位_返修原因]" + // + "([追溯代码],[返修原因代码],[返修原因内容])" + + // + "VALUES(@追溯代码,@返修原因代码,@返修原因内容)"; + + // OleDbParameter[] thisParms1 = new OleDbParameter[3]; + // // + "([追溯代码],[订单号],[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + // thisParms1[0] = new OleDbParameter("@追溯代码", OleDbType.Integer, 4, "追溯代码"); + // thisParms1[1] = new OleDbParameter("@返修原因代码", OleDbType.Integer, 4, "返修原因代码"); + // thisParms1[2] = new OleDbParameter("@返修原因内容", OleDbType.VarChar, 200, "返修原因内容"); + + // return DataAccess.ExecuteDataTable_OleDb_Insert_Access(sql, dt, ref thisParms1); + //} + /// + /// 异步通讯方式 + /// SELECT * FROM [MES_装配数据_零部件追溯_返修工位_返工原因_临时表] + /// + /// + /// + //public static bool RepairReasonSelect_Access_TempTable(out DataTable dt) + //{ + // string sql; + // sql = "SELECT * FROM [MES_装配数据_零部件追溯_返修工位_返工原因_临时表]"; + + // return DataAccess.ExecuteDataTable_OleDb_Access( sql, out dt); + //} + /// + /// 异步通讯方式 + /// INSERT INTO [MES_装配数据_零部件追溯_返修工位_返工原因_临时表] + /// + /// + //public static bool RepairReasonDelete_Access_TempTable() + //{ + // string sql; + // sql = "DELETE FROM [MES_装配数据_零部件追溯_返修工位_返工原因_临时表]"; + + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// 数据上传 + /// SELECT * FROM [MES_装配数据_零部件追溯_返修工位_返修原因] + /// + /// + /// + //public static bool RepairReasonSelect_Access_Table(out DataTable dt) + //{ + // string sql; + // sql = "SELECT * FROM [MES_装配数据_零部件追溯_返修工位_返修原因]"; + + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + /// + /// 数据上传 + /// DELETE FROM [MES_装配数据_零部件追溯_返修工位_返修原因] + /// + /// + /// + //public static bool RepairReasonDelete_Access_Table(int traceID) + //{ + // string sql; + // sql = "DELETE FROM [MES_装配数据_零部件追溯_返修工位_返修原因] WHERE 追溯代码 = " + traceID.ToString(); + + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// INSERT INTO [MES_装配数据_零部件追溯_返修工位_返工原因_临时表] + /// + /// + /// + //public static bool RepairReasonInsert_Access_TempTable(DataTable dt) + //{ + // string sql; + // sql = "INSERT INTO [MES_装配数据_零部件追溯_返修工位_返工原因_临时表]" + // + "([追溯代码],[返修原因代码],[返修原因内容])" + + // + "VALUES(@追溯代码,@返修原因代码,@返修原因内容)"; + + // OleDbParameter[] thisParms1 = new OleDbParameter[3]; + + // thisParms1[0] = new OleDbParameter("@追溯代码", OleDbType.Integer, 4, "追溯代码"); + // thisParms1[1] = new OleDbParameter("@返修原因代码", OleDbType.Integer, 4, "返修原因代码"); + // thisParms1[2] = new OleDbParameter("@返修原因内容", OleDbType.VarChar, 200, "返修原因内容"); + + // return DataAccess.ExecuteDataTable_OleDb_Insert_Access(sql, dt, ref thisParms1); + //} + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.CartTrace.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.CartTrace.cs new file mode 100644 index 0000000..8080bc8 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.CartTrace.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; + +using System.Data.OleDb; + + +using DataLinkMesWork; + +//using SystemFramework; + +namespace bizFacade +{ + /// + /// 关键零部件追溯 + /// + public partial class BaseDataSystemMES + { + /// + /// 删除追踪代码 + /// + /// + //public static void CartTraceCodeCheck(string opName, string TraceCode) + //{ + // string sql; + // sql = "DELETE FROM [MES_装配数据_零部件追溯] " + // + " where 追踪代码='" + TraceCode + "'"; + + // DataAccess.ExecuteSQL_OleDb_Access(sql); + // sql = "DELETE FROM [MES_装配数据_零部件追溯_数据主表] " + // + " where 追踪代码='" + TraceCode + "'"; + // DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// 删除追踪代码 + /// 对于曲轴活塞上线工位,如果[MES_装配数据_零部件追溯_数据主表] 中[追踪代码]数量大于3删除 + /// + /// + //public static void CartTraceCodeCheck_F3(string opName, string TraceCode) + //{ + // int count; + // string sql; + + // sql = "SELECT COUNT(*) FROM [MES_装配数据_零部件追溯] " + // + " where 追踪代码='" + TraceCode + "'" + // + " and 工位号='" + opName+"'"; + // DataAccess.ExecuteOutNum_OleDb_Access(sql, out count); + // if (count >= 3) + // { + // sql = "DELETE FROM [MES_装配数据_零部件追溯] " + // + " where 追踪代码='" + TraceCode + "'"; + + // DataAccess.ExecuteSQL_OleDb_Access(sql); + // sql = "DELETE FROM [MES_装配数据_零部件追溯_数据主表] " + // + " where 追踪代码='" + TraceCode + "'"; + // DataAccess.ExecuteSQL_OleDb_Access(sql); + // } + //} + /// + /// 更改物料[发动机号][追踪号码] + /// [MES_装配数据_零部件追溯_临时状态] + /// + /// + //public static void CartTraceCodeUpdate_TraceCode(string engineID, string traceCode) + //{ + // string sql; + // sql = "UPDATE [MES_装配数据_零部件追溯_临时状态] " + // + " SET 发动机号 = '" + engineID + "'" + // + ",追踪代码 = '" + traceCode + "'"; + // DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// [MES_装配数据_零部件追溯_临时状态] + /// + /// + //public static void CartTraceCodeSelect_TraceCode(out DataTable dt) + //{ + // string sql; + // sql = "SELECT TOP 1 * FROM [MES_装配数据_零部件追溯_临时状态] "; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + /// + /// 更改物料[追踪号码] + /// [MES_装配数据_零部件追溯_临时状态] + /// + /// + //public static void CartTraceCodeUpdate(string opName, string TraceCode) + //{ + // string sql; + // sql = "UPDATE [MES_装配数据_零部件追溯_临时状态] " + // + " SET 发动机号 = '" + TraceCode + "'" + // + ",追踪代码 = '" + TraceCode + "'" + // + " where 工位号='" + opName + "'"; + // DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// 总线缸盖上线工位 + /// 根据[追踪号码]获得验证物料 + /// + /// + //public static void CartTraceCodeGetVerifyMaterial(string opName, string TraceCode, string opNameOtherFileName,out DataTable dt) + //{ + // string sql; + // sql = "SELECT * FROM [MES_装配数据_零部件追溯] " + // + " WHERE 追踪代码 = '" + TraceCode + "'" + // + " AND 工位号 = '" + opName + "'"; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, opNameOtherFileName, out dt); + //} + /// + /// 总线缸盖上线工位 + /// 根据[追踪号码]获得全部验证物料 + /// + /// + //public static void CartTraceCodeGetMaterial(string opName, string TraceCode, string opNameOtherFileName, out DataTable dt) + //{ + // string sql; + // sql = "SELECT * FROM [MES_装配数据_零部件追溯] " + // + " WHERE 追踪代码 = '" + TraceCode + "'"; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, opNameOtherFileName, out dt); + //} + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.FalseOverGo.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.FalseOverGo.cs new file mode 100644 index 0000000..a40c130 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.FalseOverGo.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; + +//using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + /// + /// 不合格放行 + /// 不合格需要返修工位,MES记录原因,并将信息记录到需要不合格越过工位。 + /// 工件到位读取发动机号后,读取不合格越过信息, + /// mes发送此信号到PLC,plc接收此信号后,才能不合格放行。 + /// DBX2.5 + /// 33 + /// + /// + //public static DataTable BaseData_tagTable_FalseOverGo(string opName) + //{ + // DataTable dt; + // string sql; + // sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo FROM [MES_基本变量_原始数据] " + // + " where 变量类型代码 = 33 and 是否启用 = 1 " + // + " and 工位号='" + opName + "'"; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + // return dt; + //} + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.FirstOpName.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.FirstOpName.cs new file mode 100644 index 0000000..e71b757 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.FirstOpName.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using System.Data.OleDb; +using DataLinkMesWork; + + +//using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + /// + /// 1、测试发动机号合理:在表[MES_计划BOM_发动机号]中存在 + /// SELECT COUNT(*) FROM MES_计划BOM_发动机号 + /// Access + /// + /// + /// + /// + //public static bool EngineID_Select_Count(string EngineID, out int count) + //{ + // count = 0; + // string sql; + // sql = "SELECT COUNT(*) FROM MES_计划BOM_发动机号 " + // + " WHERE 发动机号 = '" + EngineID + "'"; + // return DataAccess.ExecuteOutNum_OleDb_Access(sql, out count); + //} + + + + /// + /// 根据订单号,确定订单基本内容 + /// 返回订单对应的一行记录 + /// [MES_计划BOM_订单计划下达] + /// Access 数据库 + /// + /// + /// + /// + //public static bool FirstOpNameTableGetOrderFormOnlyOneLine(string orderFrom,out DataTable dt) + //{ + // string sql; + // sql = "SELECT TOP 1 * FROM [MES_计划BOM_订单计划下达]" + // + " WHERE 订单号='" + orderFrom + "'"; + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.KeyPart.KeyPartAssemblyTempTable.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.KeyPart.KeyPartAssemblyTempTable.cs new file mode 100644 index 0000000..377fef8 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.KeyPart.KeyPartAssemblyTempTable.cs @@ -0,0 +1,395 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; + +using System.Data.OleDb; + + +using DataLinkMesWork; + +//using SystemFramework; + +namespace bizFacade +{ + /// + /// 关键零部件追溯 + /// + public partial class BaseDataSystemMES + { + /// + /// 创建增加数据用表 + /// 获得物料已经验证的记录 + /// + /// + /// + public static DataTable GetInsertTableMaterialVerifyOver(DataTable dt) + { + DataTable dt1; + DataRow row; + + dt1 = dt.Clone(); + + for (int i = 0; i < dt.Rows.Count; i++) + { + row = dt1.NewRow(); + for (int j = 0; j < dt.Columns.Count; j++) + { + row[j] = dt.Rows[i][j]; + } + if (Convert.ToInt32(row["验证结果"]) != 0) + { + dt1.Rows.Add(row); + } + + } + + return dt1; + } + /// + /// 创建增加数据用表 + /// + /// + /// + public static DataTable GetInsertTable(DataTable dt) + { + DataTable dt1; + DataRow row; + + dt1 = dt.Clone(); + + for (int i = 0; i < dt.Rows.Count; i++) + { + row = dt1.NewRow(); + for (int j = 0; j < dt.Columns.Count; j++) + { + row[j] = dt.Rows[i][j]; + } + dt1.Rows.Add(row); + + } + + return dt1; + } + + /// + /// MES_装配数据_零部件追溯_临时状态_增加 + /// + /// + /// + //public static void VerifyAssemblyPartTempTableInsert(DataTable dt) + //{ + // string sql; + // sql = "INSERT INTO [MES_装配数据_零部件追溯_临时状态]" + // + "([订单号],[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + // + "[发动机数量], [厂牌编号起始号], [客户名称],[投料日期],[文件编号],[集团名称],[通知号]," + // + "[功率],[指南文件编号],[装机状态],[适用状态],[物料描述],[计划下达日期],[计划完工日期]," + // + "[主配厂家],[工位号], [工位名称],[物料号], [零件图号], [零件名称], [零件数量]," + // + "[是否扫描],[扫描方式代码], [扫描方式], [厂家代码],[生产厂家], " + // + "[操作指导],[发动机号],[追踪代码],[物料号表索引号],[零件数量验证]," + // + "[物料条码], [物料条码物料号], [物料条码批次],[验证结果], [操作者工号], [操作者姓名], [班次代码], " + // + "物料来源代码,物料来源,是否禁用代码,是否禁用,被强制验证物料号,更改代码,更改原因)" + + // + "VALUES(@订单号,@SAP物料号,@发动机型号,@发动机型号代码,@发动机机型," + // + "@发动机数量,@厂牌编号起始号,@客户名称,@投料日期,@文件编号,@集团名称,@通知号," + // + "@功率,@指南文件编号,@装机状态,@适用状态,@物料描述,@计划下达日期,@计划完工日期," + // + "@主配厂家,@工位号,@工位名称,@物料号,@零件图号,@零件名称,@零件数量," + // + " @是否扫描,@扫描方式代码,@扫描方式,@厂家代码,@生产厂家," + // + "@操作指导,@发动机号,@追踪代码,@物料号表索引号,@零件数量验证," + // + "@物料条码,@物料条码物料号,@物料条码批次,@验证结果,@操作者工号,@操作者姓名,@班次代码," + // + "@物料来源代码,@物料来源,@是否禁用代码,@是否禁用,@被强制验证物料号,@更改代码,@更改原因)"; + + + // OleDbParameter[] thisParms1 = new OleDbParameter[50]; + // // + "([订单号],[SAP物料号],[发动机型号],[发动机型号代码], [发动机机型], " + // thisParms1[0] = new OleDbParameter("@订单号", OleDbType.VarChar, 50, "订单号"); + // thisParms1[1] = new OleDbParameter("@SAP物料号", OleDbType.VarChar, 50, "SAP物料号"); + // thisParms1[2] = new OleDbParameter("@发动机型号", OleDbType.VarChar, 50, "发动机型号"); + // thisParms1[3] = new OleDbParameter("@发动机型号代码", OleDbType.Integer, 4, "发动机型号代码"); + // thisParms1[4] = new OleDbParameter("@发动机机型", OleDbType.VarChar, 50, "发动机机型"); + + // // + "@发动机数量,@厂牌编号起始号,@客户名称,@投料日期,@文件编号,@集团名称,@通知号," + // thisParms1[5] = new OleDbParameter("@发动机数量", OleDbType.Integer, 4, "发动机数量"); + // thisParms1[6] = new OleDbParameter("@厂牌编号起始号", OleDbType.Integer, 4, "厂牌编号起始号"); + // thisParms1[7] = new OleDbParameter("@客户名称", OleDbType.VarChar, 50, "客户名称"); + // thisParms1[8] = new OleDbParameter("@投料日期", OleDbType.DBDate, 8, "投料日期"); + // thisParms1[9] = new OleDbParameter("@文件编号", OleDbType.VarChar, 50, "文件编号"); + // thisParms1[10] = new OleDbParameter("@集团名称", OleDbType.VarChar, 50, "集团名称"); + // thisParms1[11] = new OleDbParameter("@通知号", OleDbType.VarChar, 50, "通知号"); + + // // + "@功率,@指南文件编号,@装机状态,@适用状态,@物料描述,@计划下达日期,@计划完工日期," + // thisParms1[12] = new OleDbParameter("@功率", OleDbType.VarChar, 50, "功率"); + // thisParms1[13] = new OleDbParameter("@指南文件编号", OleDbType.VarChar, 50, "指南文件编号"); + // thisParms1[14] = new OleDbParameter("@装机状态", OleDbType.VarChar, 50, "装机状态"); + // thisParms1[15] = new OleDbParameter("@适用状态", OleDbType.DBDate, 8, "适用状态"); + // thisParms1[16] = new OleDbParameter("@物料描述", OleDbType.VarChar, 255, "物料描述"); + // thisParms1[17] = new OleDbParameter("@计划下达日期", OleDbType.DBDate, 8, "计划下达日期"); + // thisParms1[18] = new OleDbParameter("@计划完工日期", OleDbType.DBDate, 8, "计划完工日期"); + + // // + "@主配厂家,@工位号,@工位名称,@物料号,@零件图号,@零件名称,@零件数量," + + // thisParms1[19] = new OleDbParameter("@主配厂家", OleDbType.VarChar, 50, "主配厂家"); + // thisParms1[20] = new OleDbParameter("@工位号", OleDbType.VarChar, 50, "工位号"); + // thisParms1[21] = new OleDbParameter("@工位名称", OleDbType.VarChar, 50, "工位名称"); + // thisParms1[22] = new OleDbParameter("@物料号", OleDbType.VarChar, 50, "物料号"); + // thisParms1[23] = new OleDbParameter("@零件图号", OleDbType.VarChar, 50, "零件图号"); + // thisParms1[24] = new OleDbParameter("@零件名称", OleDbType.VarChar, 50, "零件名称"); + // thisParms1[25] = new OleDbParameter("@零件数量", OleDbType.Integer, 4, "零件数量"); + + // // +"[是否扫描],扫描方式代码, [扫描方式], [厂家代码],[生产厂家], " + + // thisParms1[26] = new OleDbParameter("@是否扫描", OleDbType.Integer, 4, "是否扫描"); + // thisParms1[27] = new OleDbParameter("@扫描方式代码", OleDbType.Integer, 4, "扫描方式代码"); + // thisParms1[28] = new OleDbParameter("@扫描方式", OleDbType.VarChar, 50, "扫描方式"); + // thisParms1[29] = new OleDbParameter("@厂家代码", OleDbType.VarChar, 50, "厂家代码"); + // thisParms1[30] = new OleDbParameter("@生产厂家", OleDbType.VarChar, 50, "生产厂家"); + + // //+ "@操作指导,@发动机号,@物料号表索引号,@零件数量验证," + + // thisParms1[31] = new OleDbParameter("@操作指导", OleDbType.VarChar, 255, "操作指导"); + // thisParms1[32] = new OleDbParameter("@发动机号", OleDbType.VarChar, 50, "发动机号"); + // thisParms1[33] = new OleDbParameter("@追踪代码", OleDbType.VarChar, 50, "追踪代码"); + // thisParms1[34] = new OleDbParameter("@物料号表索引号", OleDbType.Integer, 4, "物料号表索引号"); + // thisParms1[35] = new OleDbParameter("@零件数量验证", OleDbType.Integer, 4, "零件数量验证"); + + // // +"[物料条码], [物料条码物料号], [物料条码批次],@验证结果, [操作者工号], [操作者姓名], [班次代码], " + // thisParms1[36] = new OleDbParameter("@物料条码", OleDbType.VarChar, 50, "物料条码"); + // thisParms1[37] = new OleDbParameter("@物料条码物料号", OleDbType.VarChar, 50, "物料条码物料号"); + // thisParms1[38] = new OleDbParameter("@物料条码批次", OleDbType.VarChar, 50, "物料条码批次"); + // thisParms1[39] = new OleDbParameter("@验证结果", OleDbType.Integer, 4, "验证结果"); + // thisParms1[40] = new OleDbParameter("@操作者工号", OleDbType.VarChar, 50, "操作者工号"); + // thisParms1[41] = new OleDbParameter("@操作者姓名", OleDbType.VarChar, 50, "操作者姓名"); + // thisParms1[42] = new OleDbParameter("@班次代码", OleDbType.VarChar, 50, "班次代码"); + + // // +"物料来源代码,物料来源,是否禁用代码,是否禁用,被强制验证物料号,更改代码,更改原因)" + + // thisParms1[43] = new OleDbParameter("@物料来源代码", OleDbType.Integer, 4, "物料来源代码"); + // thisParms1[44] = new OleDbParameter("@物料来源", OleDbType.VarChar, 50, "物料来源"); + // thisParms1[45] = new OleDbParameter("@是否禁用代码", OleDbType.Integer, 4, "是否禁用代码"); + // thisParms1[46] = new OleDbParameter("@是否禁用", OleDbType.VarChar, 50, "是否禁用"); + // thisParms1[47] = new OleDbParameter("@被强制验证物料号", OleDbType.VarChar, 50, "被强制验证物料号"); + // thisParms1[48] = new OleDbParameter("@更改代码", OleDbType.VarChar, 50, "更改代码"); + // thisParms1[49] = new OleDbParameter("@更改原因", OleDbType.VarChar, 255, "更改原因"); + + // DataAccess.ExecuteDataTable_OleDb_Insert_Access(sql, dt, ref thisParms1); + //} + /// + /// MES_装配数据_零部件追溯_临时状态_删除 + /// + /// + //public static bool VerifyAssemblyPartTempTableDelete() + //{ + // string sql; + // sql = "DELETE FROM [MES_装配数据_零部件追溯_临时状态] "; + + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// MES_装配数据_零部件追溯_临时状态_删除 + /// + /// + /// + /// + //public static bool VerifyAssemblyPartTempTableDelete(string engineNumber, string opName) + //{ + // string sql; + // sql = "DELETE FROM [MES_装配数据_零部件追溯_临时状态] " + // + " where 发动机号='" + engineNumber + "' " + // + " and 工位号='" + opName + "'"; + + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// MES_装配数据_零部件追溯_临时状态 + /// 符合条件的行数 + /// + /// + //public static int VerifyAssemblyPartTempTableCount() + //{ + // int count; + // string sql; + // sql = "SELECT COUNT(*) FROM [MES_装配数据_零部件追溯_临时状态] "; + + // DataAccess.ExecuteOutNum_OleDb_Access(sql, out count); + // return count; + + //} + /// + /// MES_装配数据_零部件追溯_临时状态 + /// 符合条件的行数 + /// + /// + /// + //public static int VerifyAssemblyPartTempTableCountByEngineID(string engineID) + //{ + // int count; + // string sql; + // sql = "SELECT COUNT(*) FROM [MES_装配数据_零部件追溯_临时状态] " + // +" where 发动机号='" + engineID + "' "; + // DataAccess.ExecuteOutNum_OleDb_Access(sql, out count); + // return count; + + //} + /// + /// MES_装配数据_零部件追溯_临时状态 + /// 符合条件的行数 + /// + /// + /// + //public static int VerifyAssemblyPartTempTableCountByEngineTraceCode(string engineTraceCode) + //{ + // int count; + // string sql; + // sql = "SELECT COUNT(*) FROM [MES_装配数据_零部件追溯_临时状态] " + // +" where 追踪代码='" + engineTraceCode + "' "; + + // DataAccess.ExecuteOutNum_OleDb_Access(sql, out count); + // return count; + //} + ///// + ///// MES_装配数据_零部件追溯_临时状态 + ///// 符合条件的行数 + ///// + ///// + ///// + //public static int VerifyAssemblyPartTempTableCount(string engineNumber, string opName) + //{ + // int count; + // string sql; + // sql = "SELECT COUNT(*) FROM [MES_装配数据_零部件追溯_临时状态] " + // + " where 发动机号='" + engineNumber + "' " + // + " and 工位号='" + opName + "'"; + + // DataAccess.ExecuteOutNum_OleDb_Access(sql, out count); + // return count; + + //} + /// + /// MES_装配数据_零部件追溯_临时状态_选择 + /// + /// + //public static DataTable VerifyAssemblyPartTempTableSelect() + //{ + // string sql; + // DataTable dt; + // sql = "SELECT * FROM [MES_装配数据_零部件追溯_临时状态] "; + + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + + // return dt; + //} + /// + /// MES_装配数据_零部件追溯_临时状态_更新 + /// + /// 物料号表索引号 + /// 物料条码 + /// 物料条码物料号 + /// 物料条码批次 + /// 验证结果 + /// + //public static bool VerifyAssemblyPartTempTableUpdate(int ID,string barCode, string barCode_Material, + // string barCode_SerailNumber, int materialVerifyResult) + //{ + // string sql; + // sql = "UPDATE [MES_装配数据_零部件追溯_临时状态] " + // + "SET 物料条码='" + barCode + "'" + // + ",物料条码物料号='" + barCode_Material + "'" + // + ",物料条码批次='" + barCode_SerailNumber + "'" + // + ",验证结果=" + materialVerifyResult.ToString() + // + " where ID=" + Convert.ToString(ID); + + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + + /// + /// MES_装配数据_零部件追溯_临时状态_更新 + /// + /// 物料号表索引号 + /// 发动机号 + /// 工位号 + /// 物料条码 + /// 物料条码物料号 + /// 物料条码批次 + /// 验证结果 + /// + //public static bool VerifyAssemblyPartTempTableUpdate(int materialIndex, string engineNumber, string opName, + // string barCode, string barCode_Material, string barCode_SerailNumber, int materialVerifyResult) + //{ + // string sql; + // sql = "UPDATE [MES_装配数据_零部件追溯_临时状态] " + // + "SET 物料条码='" + barCode + "'" + // + ",物料条码物料号='" + barCode_Material + "'" + // + ",物料条码批次='" + barCode_SerailNumber + "'" + // + ",验证结果=" + materialVerifyResult.ToString() + // + " where ID=" + materialIndex.ToString(); + // //sql = "UPDATE [MES_装配数据_零部件追溯_临时状态] " + // // + "SET 物料条码='" + barCode + "'" + // // + ",物料条码物料号='" + barCode_Material + "'" + // // + ",物料条码批次='" + barCode_SerailNumber + "'" + // // + ",验证结果=" + materialVerifyResult.ToString() + // // + " where 物料号表索引号=" + materialIndex.ToString(); + + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + + /// + /// MES_装配数据_零部件追溯_临时状态_更新 + /// + /// 物料号表索引号 + /// 物料条码 + /// 物料条码物料号 + /// 物料条码批次 + /// + /// + /// 验证结果 + /// + //public static bool VerifyAssemblyPartTempTableUpdate_New(int materialIndex, + // string barCode, string barCode_Material, string barCode_SerailNumber,string engineID,string traceCode, int materialVerifyResult) + //{ + // string sql; + // sql = "UPDATE [MES_装配数据_零部件追溯_临时状态] " + // + "SET 物料条码='" + barCode + "'" + // + ",物料条码物料号='" + barCode_Material + "'" + // + ",物料条码批次='" + barCode_SerailNumber + "'" + // + ",发动机号='" + engineID + "'" + // + ",追踪代码='" + traceCode + "'" + // + ",验证结果=" + materialVerifyResult.ToString() + // + ",操作时间='" + DateTime.Now.ToString("G")+"'" + // + " where ID=" + materialIndex.ToString(); + + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// + /// + /// + /// + //public static bool VerifyAssemblyPartTempTableSelectByMainMaterialCode(out DataTable dt) + //{ + // dt = null; + // string sql; + // sql = "SELECT * FROM [MES_装配数据_零部件追溯_临时状态] WHERE 是否主物料 = 1"; + + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + /// + /// MES_装配数据_零部件追溯_临时状态_更新 + /// 取消验证 + /// + /// ID + /// + //public static bool VerifyAssemblyPartTempTableUpdate(int ID) + //{ + // string sql; + // sql = "UPDATE [MES_装配数据_零部件追溯_临时状态] " + // + "SET 物料条码=''" + // + ",物料条码物料号=''" + // + ",物料条码批次=''" + // + ",验证结果=0 " + // + " where ID=" + Convert.ToString(ID); + + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.Load.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.Load.cs new file mode 100644 index 0000000..b9e4487 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.Load.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; + + +//using SystemFramework; + +namespace bizFacade +{ + partial class BaseDataSystemMES + { + + public static DataTable dt_Signal() + { + DataTable dt; + string sql; + sql = "SELECT [TagID],[TagName] ,[工位号],[数据来源],[IP],[TagTypeID],[TagLong]"+ + " ,[DbName],[变量类型],[变量地址] ,[变量其它],[演示偏移] ,[列位置],[测量位置] ,[测量项目],[测量单位],[变量类型代码],[变量类型名称]"+ + " ,[机体类型],[线体类型],[TagAdr],[TagAdrDemo],[是否启用],[监控组] ,[监控时间间隔],[OpcServer_OPNAME],[变量特点],[是否监控]"+ + " ,[变量排序] ,[工序能力],[监控属性代码],[测量位置短],[上限值],[下限值] ,[理论值],[IsGoodBad] ,[IsSaveToSql]"+ + " ,[IsWebSocket] FROM [MES_基本变量_原始数据]"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + public static DataTable dt_Device() + { + DataTable dt; + string sql; + sql = "SELECT [设备IP] ,[设备类型],[是否启用] FROM [MES_基本变量设备类型对应表]"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + public static DataTable dt_TagTypeDataType() + { + DataTable dt; + string sql; + sql = "SELECT TOP (1000) [序号],[变量类型],[TagTypeDataType],[TagName],[变量类型代码],[TagTypeChange],[MesTagTypeChange],[WebTagTypeChange],[信号点名称][变量类型名称] FROM [MES_基本变量变量类型代码]"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.Login.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.Login.cs new file mode 100644 index 0000000..fbac0bf --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.Login.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; + + +//using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + /// + /// û룬֤¼Ϣ + /// + /// + /// + /// + /// + //public static bool GetUserName(string userName,string password,out DataTable dt) + //{ + // //string errorMessage; + // string sql; + // sql = "SELECT top 1 * FROM [MES__û] " + // + "where ߹='" + userName + "'" + // + " and ='" + password + "'" ; + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + // //SQLCommon.ExecuteDataTable_OleDb(sql, ApplicationConfig.ConnectionString_Access, out dt, out errorMessage); + //} + /// + /// û + /// + /// + /// + /// + //public static bool UpdateUserName(string userName, string password) + //{ + // //string errorMessage; + // string sql; + // sql = "UPDATE [MES__û] " + // + "SET ='" + password+"'" + // + "where ߹='" + userName + "'"; + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + // //return SQLCommon.ExecuteNonQuery_OleDb(sql, ApplicationConfig.ConnectionString_Access, out errorMessage); + //} + + /// + /// MES__¼ + /// + /// λ + /// ߹ + /// + /// δ + /// ¼˳ (=1¼) (=0˳) + /// + //public static bool InsertLoginAndLogoutUserName(string opName, string operatorCode, + // string operatorName,int operatorShift, int LogType) + //{ + // //string errorMessage; + // string sql; + // sql = "INSERT INTO [MES__û] ([λ], [߹], [], [δ], [¼˳])" + // + "VALUES(" + // + "'" + opName + "'," + // + "'" + operatorCode + "'," + // + "'" + operatorName + "'," + // + operatorShift.ToString() + "," + // + LogType.ToString() + // + ")"; + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + + // // return SQLCommon.ExecuteNonQuery_OleDb(sql, ApplicationConfig.ConnectionString_Access, out errorMessage); + //} + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MOBY.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MOBY.cs new file mode 100644 index 0000000..39f3bf1 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MOBY.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; + + +//using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + /// + /// MES__DBݽṹ_ѯ + /// + public static DataTable MobyDataStructureSelect() + { + DataTable dt; + string sql; + sql = "SELECT * FROM MES__DBݽṹ ORDER BY [] "; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + /// + /// MES_ģMOBY_ + /// һ̨ + /// ظ̨ + /// + public static DataTable MobyInsert() + { + DataTable dt; + string procedureName; + procedureName = "MES_ģMOBY_"; + DataAccess.ExecuteStoredProcedure(procedureName, out dt); + return dt; + } + + /// + /// MES_ģMOBY_ѯ + /// + /// + /// + public static DataTable MobySelect(string engineNumber) + { + DataTable dt; + string procedureName; + procedureName = "MES_ģMOBY_ѯ"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@", engineNumber); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + return dt; + } + + /// + /// MES_ģMOBY_ѯ + /// + /// + /// + /// + /// + public static void MobyUpdate(string engineNumber, int number, string tagValue) + { + string procedureName; + procedureName = "MES_ģMOBY_ѯ"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@", engineNumber); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@", engineNumber); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@ֵ", engineNumber); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + return; + } + /// + /// MES_ģMOBY_޸ + /// =27 λ + /// + /// + /// + /// + public static void MobyUpdate(string engineNumber, string tagValue) + { + int number; + + number = 27; + + string procedureName; + procedureName = "MES_ģMOBY_޸"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@", engineNumber); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@", number); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@ֵ", tagValue); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + return; + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MaterialList.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MaterialList.cs new file mode 100644 index 0000000..865bd2b --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MaterialList.cs @@ -0,0 +1,216 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using System.Data.OleDb; +using DataLinkMesWork; + +//using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + ///// + ///// MES_计划BOM_发动机号 + ///// 获得订单号 + ///// + ///// + //static public void WorkPositionGuidOnLine_OrderForm(out DataTable dt) + //{ + // string sql; + // sql = "SELECT distinct 订单号 from MES_计划BOM_订单计划下达_执行顺序 "; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + ///// + ///// 物料清单 + ///// 根据ID号获得物料清单 + ///// 一行 + ///// + ///// + ///// + //static public void WorkPositionGuidOnLine_MaterialList(int ID, out DataTable dt) + //{ + // string sql; + + // sql = "SELECT [订单号], [SAP物料号], [发动机型号], [发动机型号代码], [发动机机型]," + + // "[发动机数量], [厂牌编号起始号], [客户名称], [投料日期], [文件编号], [集团名称], [通知号], " + + // "[功率], [指南文件编号], [装机状态], [适用状态], [物料描述],[计划下达日期], [计划完工日期],[实际完成日期],[实际结束日期],[操作时间]," + + // "[主配厂家],[工位号], [工位名称], [物料号], [零件图号], [零件名称], [零件数量],[是否扫描],扫描方式,[厂家代码], [生产厂家], " + + // "[操作指导],[工位基本操作指导],[工位基本指导图片],[日计划产量], [工位操作指导],[工位指导图片],[物料来源代码],[是否禁用代码],[被强制验证物料号],更改代码,更改原因" + + // " FROM MES_计划BOM_订单计划下达 " + + // " WHERE ID =" + Convert.ToString(ID); + + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + + ///// + ///// 物料清单 + ///// 根据订单号和工位号 + ///// + ///// + ///// + ///// + //static public void WorkPositionGuidOnLine_MaterialList(string orderForm, string opName, out DataTable dt) + //{ + // string sql; + // //sql = "SELECT [ID], [订单号], [SAP物料号], [发动机型号], [发动机型号代码], [发动机机型]," + + // // "[发动机数量], [厂牌编号起始号], [客户名称], [投料日期], [文件编号], [集团名称], [通知号], " + + // // "[功率], [指南文件编号], [装机状态], [适用状态], [物料描述],[计划下达日期], [计划完工日期],[实际完成日期],[实际结束日期],[操作时间], " + + // // "[主配厂家],[工位号], [工位名称], [物料号], [零件图号], [零件名称], [零件数量],[是否扫描],d.扫描方式代码,d.扫描方式,[厂家代码], [生产厂家], " + + // // "[操作指导],[工位基本操作指导],[工位基本指导图片],[日计划产量], [工位操作指导],[工位指导图片],b.物料来源代码, b.物料来源, a.是否禁用代码, a.是否禁用,被强制验证物料号,更改代码,更改原因 " + // // + " FROM MES_计划BOM_订单计划下达_扫描方式 AS d INNER JOIN (MES_计划BOM_订单计划下达_是否禁用 AS a INNER JOIN (MES_计划BOM_订单计划下达_物料来源 AS b INNER JOIN MES_计划BOM_订单计划下达 AS c ON b.物料来源代码 = c.物料来源代码) ON a.是否禁用代码 = c.是否禁用代码) ON c.扫描方式=d.扫描方式代码 " + // // + " WHERE 订单号 ='" + orderForm + "'" + // // + " AND 工位号 = '" + opName + "' " + // // + " ORDER BY 物料号 "; + // sql = " SELECT a.订单号, a.执行顺序,a.SAP物料号,a.发动机型号,a.发动机型号代码,a.发动机机型," + // + "a.发动机数量,a.厂牌编号起始号,a.客户名称,a.投料日期,a.文件编号,a.集团名称,a.通知号,a.功率," + // + "a.指南文件编号,a.装机状态,a.适用状态,a.物料描述,a.计划下达日期,a.计划完工日期,a.实际完成日期," + // + "a.实际结束日期,a.完成情况代码,a.完成数量,a.订单完成日期 ," + // + "b.主配厂家, b.工位号, b.工位名称, b.物料号,b.零件图号,b.零件名称,b.零件数量," + // + "b.是否扫描,b.扫描方式,b.是否主物料,b.厂家代码,b.生产厂家,b.操作指导,b.物料来源代码," + // + "b.是否禁用代码,b.被强制验证物料号,b.更改代码,b.更改原因," + // + "c.工位基本指导图片,d.工位操作指导, d.工位指导图片 " + // + " FROM MES_计划BOM_订单计划下达_执行顺序 AS a INNER JOIN " + // + "(MES_计划BOM_工位操作指南 AS d INNER JOIN " + // + "(MES_计划BOM_发动机装配指南 AS b INNER JOIN MES_计划BOM_工位基本指导 AS c ON b.工位号 = c.工位号)" + // + "ON d.工位号 = b.工位号) ON a.订单号 = b.订单号" + // + " WHERE a.发动机型号代码=d.发动机型号代码 " + // + " AND a.订单号 = '" + orderForm + "' " + // + " AND b.工位号 = '" + opName + "' " + // + " ORDER BY 物料号 "; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + ///// + ///// 0090 F2 分线缸盖上线工位 + ///// 1、缸盖到位后,显示该工位的操作指南,物料表和物料验证表 + ///// 2、扫描缸盖,验证缸盖物料号 + ///// 3、扫描“物料追踪号” + ///// 4、保存“物料追踪号”和缸盖号到缸盖需要验证的工位 + ///// + ///// + //static public void WorkPositionGuidOnLine_MaterialList_F2(out DataTable dt, out string engineID) + //{ + // //订单号 + // string orderForm; + // //发动机号 + // engineID = null; + // string sql; + // string whereStr = " WHERE c.ID <> 0 "; + // string order = " ORDER BY d.是否优先代码 DESC, a.执行顺序, c.发动机号 "; + // sql = "SELECT a.订单号, a.执行顺序, a.计划下达日期, a.订单完成日期, b.完成情况代码, b.完成情况, " + // + " c.ID, c.发动机号, c.发动机型号代码,c.发动机机型, c.投料日期, c.人员代码, c.班次, " + // + " c.是否优先代码, c.是否装配代码, c.装配日期, d.是否优先代码, d.是否优先, e.是否装配代码, e.是否装配" + // + " FROM (((MES_计划BOM_订单计划下达_执行顺序 AS a INNER JOIN MES_计划BOM_订单计划下达_完成情况 AS b ON a.完成情况代码 = b.完成情况代码) INNER JOIN MES_计划BOM_发动机号 AS c ON a.订单号 = c.订单号) INNER JOIN MES_计划BOM_发动机号_是否优先 AS d ON c.是否优先代码 = d.是否优先代码) INNER JOIN MES_计划BOM_发动机号_是否装配 AS e ON c.是否装配代码 = e.是否装配代码 "; + // whereStr = whereStr + " and e.是否装配代码 = 0"; + // sql = sql + whereStr + order; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // orderForm = dt.Rows[0]["订单号"].ToString(); + // engineID = dt.Rows[0]["发动机号"].ToString(); + // WorkPositionGuidOnLine_MaterialList(orderForm, ApplicationConfig.OpName, out dt); + // } + // } + //} + ///// + ///// 根据追踪代码(挂牌号)获得物料表 + /////六:分线缸盖半自动工位流程:MachineType=“S”,ScannerType = “1”, + /////OpType=“P2”, OpNameMainLine=“OP0000”(总线缸盖上线工位) + /////1:PLC向MES发送工件到位,开始扫描信号。WorkStart=1 + /////2:扫描追踪代码(挂牌号) + /////3:通过OpNameMainLine(总线缸盖上线工位)工位数据表和本工位的装配指南, + /////获得当前工位的装配指南,订单号、缸盖号、机型、机型标志。 + /////4:显示订单号、缸盖号、机型、机型标志 + /////5:显示装配指南和被验证物料 + /////6:MES向PLC写入发动机号、机型、机型标志、追踪代码 + /////7:MES向PLC写入MES激发变量扫描完成,EngineGetOver=1 + /////8:验证物料。 + /////9:物料验证完成,MES向PLC写入MES激发变量物料验证完毕信号,MaterialVerifyOver=1。 + /////10:PLC向MES发送工件离开信号WorkStart=0, + /////保存数据发动机号、机型、机型标志、追踪代码到OpNameMainLine(总线缸盖上线工位)工位数据表中, + /////完成工件当日计数和工作开始时间和结束时间。 + ///// + ///// + //static public void WorkPositionGuidOnLine_MaterialList_P2(string opName, string orderForm, out DataTable dt) + //{ + // ////物料追踪数据库来源 + // //string OpNameOther=null; + // //////物料追踪数据库保存 + // ////string OpNameMainLine; + // ////订单号 + // //string orderForm=null; + // string sql; + // //sql = "SELECT * FROM [MES_装配数据_零部件追溯_数据主表] " + // // + " WHERE 追踪代码='" + traceCode+"'"; + // //DataAccess.ExecuteDataTable_OleDb_Access(sql,ApplicationConfig.OpNameOtherFileName, out dt); + // //if (dt == null) return; + // //if (dt.Rows.Count > 0) + // //{ + // // orderForm = dt.Rows[0]["订单号"].ToString(); + // //} + // ////物料清单 + + // sql = "SELECT [ID], [订单号], [SAP物料号], [发动机型号], [发动机型号代码], [发动机机型]," + + // "[发动机数量], [厂牌编号起始号], [客户名称], [投料日期], [文件编号], [集团名称], [通知号], " + + // "[功率], [指南文件编号], [装机状态], [适用状态], [物料描述],[计划下达日期], [计划完工日期],[实际完成日期],[实际结束日期],[操作时间], " + + // "[主配厂家],[工位号], [工位名称], [物料号], [零件图号], [零件名称], [零件数量],[是否扫描],d.扫描方式代码,d.扫描方式,[厂家代码], [生产厂家], " + + // "[操作指导],[工位基本操作指导],[工位基本指导图片],[日计划产量], [工位操作指导],[工位指导图片],b.物料来源代码, b.物料来源, a.是否禁用代码, a.是否禁用,被强制验证物料号,更改代码,更改原因 " + // + " FROM MES_计划BOM_订单计划下达_扫描方式 AS d INNER JOIN (MES_计划BOM_订单计划下达_是否禁用 AS a INNER JOIN (MES_计划BOM_订单计划下达_物料来源 AS b INNER JOIN MES_计划BOM_订单计划下达 AS c ON b.物料来源代码 = c.物料来源代码) ON a.是否禁用代码 = c.是否禁用代码) ON c.扫描方式=d.扫描方式代码 " + // + " WHERE 订单号 ='" + orderForm + "'" + // + " AND 工位号 = '" + opName + "' " + // + " ORDER BY 物料号 "; + + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + /// + /// 根据订单号和工位获得装配指南信息 + /// [MES_计划BOM_订单计划下达] + /// + /// 订单号 + /// 工位号 + /// 是验证物料还是全部物料 + /// + //public static DataTable GetMaterialListBak(string orderForm, string OpName, bool isVerify) + //{ + // string errorMessage; + // DataTable dt; + // string sql; + // if (isVerify) + // { + // sql = "SELECT [ID], [订单号], [SAP物料号], [发动机型号], [发动机型号代码], [发动机机型]," + + // "[发动机数量], [厂牌编号起始号], [客户名称], [投料日期], [文件编号], [集团名称], [通知号], " + + // "[功率], [指南文件编号], [装机状态], [适用状态], [物料描述],[计划下达日期], [计划完工日期]," + + // "[主配厂家],[工位号], [工位名称], [物料号], [零件图号], [零件名称], [零件数量],[是否扫描],d.扫描方式代码,d.扫描方式,[厂家代码], [生产厂家], " + + // "[操作指导],'' as 发动机号,'' as 追踪代码,0 as 物料号表索引号,0 as 零件数量验证," + // + "'' as 物料条码,'' as 物料条码物料号,'' as 物料条码批次,0 as 验证结果," + // + "'' as 操作者工号,'' as 操作者姓名,'' as 班次代码," + // + "b.物料来源代码, b.物料来源, a.是否禁用代码, a.是否禁用,被强制验证物料号,更改代码,更改原因 " + // + " FROM MES_计划BOM_订单计划下达_扫描方式 AS d INNER JOIN (MES_计划BOM_订单计划下达_是否禁用 AS a INNER JOIN (MES_计划BOM_订单计划下达_物料来源 AS b INNER JOIN MES_计划BOM_订单计划下达 AS c ON b.物料来源代码 = c.物料来源代码) ON a.是否禁用代码 = c.是否禁用代码) ON c.扫描方式=d.扫描方式代码 " + // + "where 订单号='" + orderForm + "'" + // + "and 工位号='" + OpName + "' and a.是否禁用代码 = 0 and 是否扫描 <> 0 " + // + " ORDER BY 物料号 "; + // } + // else + // { + // sql = "SELECT [ID],[订单号], [SAP物料号], [发动机型号], [发动机型号代码], [发动机机型]," + + // "[发动机数量], [厂牌编号起始号], [客户名称], [投料日期], [文件编号], [集团名称], [通知号], " + + // "[功率], [指南文件编号], [装机状态], [适用状态], [物料描述],[计划下达日期], [计划完工日期]," + + // "[主配厂家],[工位号], [工位名称], [物料号], [零件图号], [零件名称], [零件数量],[是否扫描],d.扫描方式代码,d.扫描方式,[厂家代码], [生产厂家], " + + // "[操作指导],'' as 发动机号,0 as 物料号表索引号,0 as 零件数量验证," + // + "'' as 物料条码,'' as 物料条码物料号,'' as 物料条码批次,0 as 验证结果," + // + "'' as 操作者工号,'' as 操作者姓名,'' as 班次代码," + // + "b.物料来源代码, b.物料来源, a.是否禁用代码, a.是否禁用,被强制验证物料号,更改代码,更改原因 " + // + " FROM MES_计划BOM_订单计划下达_扫描方式 AS d INNER JOIN (MES_计划BOM_订单计划下达_是否禁用 AS a INNER JOIN (MES_计划BOM_订单计划下达_物料来源 AS b INNER JOIN MES_计划BOM_订单计划下达 AS c ON b.物料来源代码 = c.物料来源代码) ON a.是否禁用代码 = c.是否禁用代码) ON c.扫描方式=d.扫描方式代码 " + // + "where 订单号='" + orderForm + "'" + // + "and 工位号='" + OpName + "' and a.是否禁用代码 = 0 " + // + " ORDER BY 物料号 "; + // } + // SQLCommon.ExecuteDataTable_OleDb(sql, ApplicationConfig.ConnectionString_Access, out dt, out errorMessage); + // return dt; + //} + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MaterialVerifyManagement.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MaterialVerifyManagement.cs new file mode 100644 index 0000000..f0f4b29 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MaterialVerifyManagement.cs @@ -0,0 +1,232 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using System.Data.OleDb; +using DataLinkMesWork; + + +//using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + /// + /// 增加,[MES_装配数据_零部件追溯_临时状态_缺省物料] + /// + /// 物料条码 + //static public void DefaultMaterialBarCodeInsert(string barCode) + //{ + // string sql; + // sql = "INSERT INTO [MES_装配数据_零部件追溯_临时状态_缺省物料] (物料条码)" + // +"VALUES('"+barCode+"')"; + // DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// 修改,[MES_装配数据_零部件追溯_临时状态_缺省物料] + /// + /// + /// + //static public void DefaultMaterialBarCodeUpdate(string ID,string barCode) + //{ + // string sql; + // sql = "UPDATE [MES_装配数据_零部件追溯_临时状态_缺省物料] " + // + "SET 物料条码 = '" + barCode + "'" + // + "WHERE ID = "+ID.ToString(); + // DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// 删除 + /// [MES_装配数据_零部件追溯_临时状态_缺省物料] + /// + /// + //static public void DefaultMaterialBarCodeDelete(string ID) + //{ + // string sql; + // sql = "DELETE FROM [MES_装配数据_零部件追溯_临时状态_缺省物料] " + // + "WHERE ID = " + ID.ToString(); + // DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// 获得 [MES_装配数据_零部件追溯_临时状态_缺省物料] + /// + /// + //static public void DefaultMaterialBarCodeSelect(out DataTable dt) + //{ + // string sql; + // sql = "SELECT * FROM [MES_装配数据_零部件追溯_临时状态_缺省物料] "; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + /// + /// 强制验证物料删除,要将原物料设置为启用状态 + /// + /// + //static public void WorkPositionGuidOnLine_MaterialUpdateByMaterrial(string materialNumberVerify) + //{ + // string sql; + // sql = "UPDATE MES_计划BOM_订单计划下达 SET 是否禁用代码=0 WHERE 物料号='" + materialNumberVerify+"'"; + + // DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// 物料禁用 + /// + /// + //static public void WorkPositionGuidOnLine_MaterialNoUsing(int ID) + //{ + // string sql; + // sql = "UPDATE MES_计划BOM_订单计划下达 SET 是否禁用代码=1 WHERE ID=" + Convert.ToString(ID); + + // DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + /// + /// 物料启用 + /// + /// + //static public void WorkPositionGuidOnLine_MaterialUsing(int ID) + //{ + // string sql; + // sql = "UPDATE MES_计划BOM_订单计划下达 SET 是否禁用代码=0 WHERE ID=" + Convert.ToString(ID); + + // DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + + /// + /// 订单号, 发动机型号, 发动机类型, 发动机数量 + /// + /// + /// + //static public void WorkPositionGuidOnLine_OrderForm(string orderForm, out DataTable dt) + //{ + // string sql; + // sql = "SELECT distinct 订单号, 发动机型号, 发动机机型, 发动机数量, 客户名称,投料日期,计划下达日期 " + // + "FROM MES_计划BOM_订单计划下达_执行顺序 WHERE 订单号='" + // + orderForm + "'"; + + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + + + + /// + /// MES_计划BOM_订单计划下达_扫描方式 + /// + /// + //static public void WorkPositionGuidOnLine_MaterialVerifyID(out DataTable dt) + //{ + // string sql; + // sql = "SELECT 扫描方式代码,扫描方式 from MES_计划BOM_订单计划下达_扫描方式 "; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + /// + /// MES_计划BOM_订单计划下达_物料来源 + /// + /// + //static public void WorkPositionGuidOnLine_MaterialComeFrom(out DataTable dt) + //{ + // string sql; + // sql = "SELECT 物料来源代码,物料来源 from MES_计划BOM_订单计划下达_物料来源 "; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + /// + /// MES_计划BOM_订单计划下达_是否禁用 + /// + /// + //static public void WorkPositionGuidOnLine_MaterialIsUsing(out DataTable dt) + //{ + // string sql; + // sql = "SELECT 是否禁用代码,是否禁用 from MES_计划BOM_订单计划下达_是否禁用 "; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + + /// + /// 物料验证 + /// 删除新物料 + /// + /// + //static public void WorkPositionGuidOnLine_NewMaterial_Delete(int ID) + //{ + // string sql; + // sql = "DELETE FROM MES_计划BOM_订单计划下达 WHERE ID=" + Convert.ToString(ID); + + // DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + + /// + /// 物料验证 + /// 添加新物料 + /// + /// + //static public bool WorkPositionGuidOnLine_NewMaterial_Insert(DataTable dt) + //{ + // string sql; + // sql = + // "INSERT INTO [MES_计划BOM_订单计划下达]" + + // "([订单号], [SAP物料号], [发动机型号], [发动机型号代码], [发动机机型]," + + // "[发动机数量], [厂牌编号起始号], [客户名称], [投料日期], [文件编号], [集团名称], [通知号], " + + // "[功率], [指南文件编号], [装机状态], [适用状态], [物料描述],[计划下达日期], [计划完工日期],[实际完成日期],[实际结束日期],[操作时间], " + + // "[主配厂家],[工位号], [工位名称], [物料号], [零件图号], [零件名称], [零件数量],[是否扫描],[扫描方式],[厂家代码], [生产厂家], " + + // "[操作指导],[工位基本操作指导],[工位基本指导图片],[日计划产量], [工位操作指导],[工位指导图片],[物料来源代码],[是否禁用代码],[被强制验证物料号],更改代码,更改原因)" + + // "VALUES(@订单号,@SAP物料号,@发动机型号,@发动机型号代码,@发动机机型," + + // "@发动机数量,@厂牌编号起始号,@客户名称,@投料日期,@文件编号,@集团名称,@通知号," + + // "@功率,@指南文件编号,@装机状态,@适用状态,@物料描述,@计划下达日期,@计划完工日期,@实际完成日期,@实际结束日期,@操作时间," + + // "@主配厂家,@工位号,@工位名称,@物料号,@零件图号,@零件名称,@零件数量,@是否扫描,@扫描方式,@厂家代码,@生产厂家," + + // "@操作指导,@工位基本操作指导,@工位基本指导图片,@日计划产量,@工位操作指导,@工位指导图片,@物料来源代码,@是否禁用代码,@被强制验证物料号,@更改代码,@更改原因)"; + // OleDbParameter[] thisParms = new OleDbParameter[44]; + // thisParms[0] = new OleDbParameter("@订单号", OleDbType.VarChar, 50, "订单号"); + // thisParms[1] = new OleDbParameter("@SAP物料号", OleDbType.VarChar, 50, "SAP物料号"); + // thisParms[2] = new OleDbParameter("@发动机型号", OleDbType.VarChar, 50, "发动机型号"); + // thisParms[3] = new OleDbParameter("@发动机型号代码", OleDbType.Integer, 4, "发动机型号代码"); + // thisParms[4] = new OleDbParameter("@发动机机型", OleDbType.VarChar, 50, "发动机机型"); + + // thisParms[5] = new OleDbParameter("@发动机数量", OleDbType.Integer, 4, "发动机数量"); + // thisParms[6] = new OleDbParameter("@厂牌编号起始号", OleDbType.Integer, 4, "厂牌编号起始号"); + // thisParms[7] = new OleDbParameter("@客户名称", OleDbType.VarChar, 255, "客户名称"); + // thisParms[8] = new OleDbParameter("@投料日期", OleDbType.DBDate, 8, "投料日期"); + // thisParms[9] = new OleDbParameter("@文件编号", OleDbType.VarChar, 50, "文件编号"); + // thisParms[10] = new OleDbParameter("@集团名称", OleDbType.VarChar, 255, "集团名称"); + // thisParms[11] = new OleDbParameter("@通知号", OleDbType.VarChar, 50, "通知号"); + + // thisParms[12] = new OleDbParameter("@功率", OleDbType.VarChar, 50, "功率"); + // thisParms[13] = new OleDbParameter("@指南文件编号", OleDbType.VarChar, 50, "指南文件编号"); + // thisParms[14] = new OleDbParameter("@装机状态", OleDbType.VarChar, 50, "装机状态"); + // thisParms[15] = new OleDbParameter("@适用状态", OleDbType.VarChar, 50, "适用状态"); + // thisParms[16] = new OleDbParameter("@物料描述", OleDbType.VarChar, 255, "物料描述"); + // thisParms[17] = new OleDbParameter("@计划下达日期", OleDbType.DBDate, 8, "计划下达日期"); + // thisParms[18] = new OleDbParameter("@计划完工日期", OleDbType.DBDate, 8, "计划完工日期"); + // thisParms[19] = new OleDbParameter("@实际完成日期", OleDbType.DBDate, 8, "实际完成日期"); + // thisParms[20] = new OleDbParameter("@实际结束日期", OleDbType.DBDate, 8, "实际结束日期"); + // thisParms[21] = new OleDbParameter("@操作时间", OleDbType.DBDate, 8, "操作时间"); + + // thisParms[22] = new OleDbParameter("@主配厂家", OleDbType.VarChar, 50, "主配厂家"); + // thisParms[23] = new OleDbParameter("@工位号", OleDbType.VarChar, 50, "工位号"); + // thisParms[24] = new OleDbParameter("@工位名称", OleDbType.VarChar, 255, "工位名称"); + // thisParms[25] = new OleDbParameter("@物料号", OleDbType.VarChar, 50, "物料号"); + // thisParms[26] = new OleDbParameter("@零件图号", OleDbType.VarChar, 50, "零件图号"); + // thisParms[27] = new OleDbParameter("@零件名称", OleDbType.VarChar, 255, "零件名称"); + // thisParms[28] = new OleDbParameter("@零件数量", OleDbType.Integer, 4, "零件数量"); + // thisParms[29] = new OleDbParameter("@是否扫描", OleDbType.Integer, 4, "是否扫描"); + // thisParms[30] = new OleDbParameter("@扫描方式", OleDbType.Integer, 4, "扫描方式"); + // thisParms[31] = new OleDbParameter("@厂家代码", OleDbType.VarChar, 255, "厂家代码"); + // thisParms[32] = new OleDbParameter("@生产厂家", OleDbType.VarChar, 255, "生产厂家"); + + + // thisParms[33] = new OleDbParameter("@操作指导", OleDbType.VarChar, 255, "操作指导"); + // thisParms[34] = new OleDbParameter("@工位基本操作指导", OleDbType.VarChar, 255, "工位基本操作指导"); + // thisParms[35] = new OleDbParameter("@工位基本指导图片", OleDbType.VarBinary, 10000000, "工位基本指导图片"); + // thisParms[36] = new OleDbParameter("@日计划产量", OleDbType.Integer, 4, "日计划产量"); + // thisParms[37] = new OleDbParameter("@工位操作指导", OleDbType.VarChar, 255, "工位操作指导"); + // thisParms[38] = new OleDbParameter("@工位指导图片", OleDbType.VarBinary, 10000000, "工位指导图片"); + + // thisParms[39] = new OleDbParameter("@物料来源代码", OleDbType.Integer, 4, "物料来源代码"); + // thisParms[40] = new OleDbParameter("@是否禁用代码", OleDbType.Integer, 4, "是否禁用代码"); + // thisParms[41] = new OleDbParameter("@被强制验证物料号", OleDbType.VarChar, 255, "被强制验证物料号"); + // thisParms[42] = new OleDbParameter("@更改代码", OleDbType.VarChar, 255, "更改代码"); + // thisParms[43] = new OleDbParameter("@更改原因", OleDbType.VarChar, 255, "更改原因"); + + // return DataAccess.ExecuteDataTable_OleDb_Insert_Access(sql, dt, ref thisParms); + //} + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MesOverGo.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MesOverGo.cs new file mode 100644 index 0000000..74ce578 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MesOverGo.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; + + +//using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + /// + /// MES放行 + /// 装配工作无法正常进行,MES填写放行原因,向PLC发送此信号,请求放行,plc接收此信号后才能安不合格流程放行 + /// DBX2.6 + /// 34 + /// + /// + //public static DataTable BaseData_tagTable_MesOverGo(string opName) + //{ + // DataTable dt; + // string sql; + // sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo FROM [MES_基本变量_原始数据] " + // + " where 变量类型代码 = 34 and 是否启用 = 1 " + // + " and 工位号='" + opName + "'"; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + // return dt; + //} + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MesServer.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MesServer.cs new file mode 100644 index 0000000..498df39 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.MesServer.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; + + +//using SystemFramework; + +namespace bizFacade +{ + partial class BaseDataSystemMES + { + /// + /// 查询MesServerCode + /// + /// + public static DataTable GetMesServerCodeFromMIS() + { + DataTable dt; + string sql; + sql = "exec MES_计划BOM_工位与名称_查询应用程序"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + + /// + /// 查询工步属性 + /// + /// + public static DataTable GetworkStepPropertyFromMIS() + { + DataTable dt; + string sql; + sql = "SELECT distinct 工位号,工步属性 FROM [MES_计划BOM_工位与名称] where 是否监控=1"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + /// + /// 查询返修工位号 + /// + /// + public static DataTable GetOpNameRepairFromMIS() + { + DataTable dt; + string sql; + sql = "SELECT distinct 工位号,返修工位号 FROM [MES_计划BOM_工位与名称] where 是否监控=1"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.ProduceCount.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.ProduceCount.cs new file mode 100644 index 0000000..f2afd7d --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.ProduceCount.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +//using SystemFramework; + +namespace bizFacade +{ + partial class BaseDataSystemMES + { + /// + /// [MES_计划BOM_发动机号] + /// SET 是否装配代码=1 + /// + /// + //public static bool BaseData_tagTable_EngineID_UpDate(string EngineID) + //{ + // string sql; + // sql = "UPDATE MES_计划BOM_发动机号 " + // + "SET 是否装配代码=1" + // + " ,装配日期=CDATE('" + DateTime.Now.ToString("G") + // + "') " + // + " WHERE 发动机号='" + EngineID + "'"; + // return DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + + /// + /// [MES_装配数据_工件到位离开时间_保留本地] + /// 计算当前日期装配的发动机数量 + /// + /// + //public static int BaseData_tagTable_EngineID_Count() + //{ + // int count; + // string sql; + // sql = "SELECT COUNT(*) FROM [MES_装配数据_工件到位离开时间_保留本地] " + // + "WHERE 计数日期=CDATE('" + DateTime.Now.ToString("d") + "')" + // + " AND 是否合格 = 1"; + // DataAccess.ExecuteOutNum_OleDb_Access(sql, out count); + // return count; + //} + + + //static public void ProduceCountInsert() + //{ + // string sql; + // sql = "INSERT INTO MES_装配数据_实际产量(实际产量) VALUES(1)"; + // DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + //static public void ProduceCountDelete() + //{ + // string sql; + // sql = "DELETE FROM MES_装配数据_实际产量 WHERE 生产日期<>CDATE('" + DateTime.Now.ToString("d") + "')"; + // DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + //static public void ProduceCountSelect(out DataTable dt) + //{ + // string sql; + // sql = "SELECT * FROM MES_装配数据_实际产量 WHERE 生产日期=CDATE('" + DateTime.Now.ToString("d") + "')"; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + //static public void ProduceCountUpdate(int count) + //{ + // string sql; + // sql = "UPDATE MES_装配数据_实际产量 " + // + " SET 实际产量=" + count.ToString() + // + " WHERE 生产日期=CDATE('" + DateTime.Now.ToString("d") + "')"; + // DataAccess.ExecuteSQL_OleDb_Access(sql); + //} + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.SubLineOpName.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.SubLineOpName.cs new file mode 100644 index 0000000..ff57baf --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.SubLineOpName.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; + +using System.Data.OleDb; + + +using DataLinkMesWork; + +//using SystemFramework; + +namespace bizFacade +{ + /// + /// 关键零部件追溯 + /// + public partial class BaseDataSystemMES + { + /// + /// SELECT * FROM MES_计划BOM_工位与名称 + /// + /// + //static public void GetOpNameDataForMIS(out DataTable dt) + //{ + // string sql; + // sql = "SELECT * FROM MES_计划BOM_工位与名称 "; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + /// + /// 根据工位获得分线可以保存“物料追踪”的工位 + /// + /// + /// + //static public void SubLineOpName(string opName,out DataTable dt) + //{ + // string lineName; + // dt = null; + // string sql; + // sql = "SELECT 线体类型 FROM MES_计划BOM_工位与名称 " + // + "WHERE 工位号 = '" + opName+"'"; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // lineName = dt.Rows[0]["线体类型"].ToString(); + // sql = "SELECT DISTINCT 文件名称 FROM FROM MES_计划BOM_工位与名称 " + // + "WHERE 线体类型 = '" + lineName + "'" + // +" AND PC =1 "; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + // } + // } + + //} + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.WorkSheet.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.WorkSheet.cs new file mode 100644 index 0000000..5234d5a --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.WorkSheet.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; + + +//using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + /// + /// û룬֤¼Ϣ + /// + /// + /// + //public static bool GetWorkSheet(out DataTable dt) + //{ + // //string errorMessage; + // string sql; + // sql = "SELECT * FROM [MES__] "; + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + + //} + /// + /// + /// + /// + /// + /// + //public static bool GetOperatorCode(string operatorCode,out DataTable dt) + //{ + // //string errorMessage; + // string sql; + // sql = "SELECT * FROM [MES__û] " + // + " WHERE ߹='" + operatorCode+"'"; + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + + //} + /// + /// Ƿǣ߹ + /// + /// + /// + //public static bool GetOperatorCode(string operatorCode) + //{ + // //string errorMessage; + // DataTable dt; + // string sql; + + + // sql = "SELECT * FROM [MES__û] " + // + " WHERE ߹='" + operatorCode + "'"; + + // if (DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt)) + // { + // if (dt.Rows.Count > 0) + // { + // return true; + // } + // else + // { + // return false; + // } + // } + // else + // { + // return false; + // } + //} + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.cs new file mode 100644 index 0000000..a2cb19a --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/BaseDataSystemMES.cs @@ -0,0 +1,224 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +//using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + /// + /// ݹλ + /// + /// + /// + public static string GetAllWorkPositionNameForMIS(string positionID) + { + string positionIDName = ""; + string errorMessage; + DataTable dt; + string sql; + sql = "SELECT top 1 λ FROM MES_ƻBOM_λ " + + "where λ='" + positionID + "'"; + //if (!SQLCommon.SqlServerConnectionStatus) + //{ + // SQLCommon.ExecuteDataTable_OleDb(sql, ApplicationConfig.ConnectionString_Access, out dt, out errorMessage); + //} + //else + { + DataAccess.ExecuteDataTable(sql, out dt); + } + if (dt == null) return positionIDName; + if (dt.Rows.Count > 0) + { + positionIDName = dt.Rows[0]["λ"].ToString(); + } + return positionIDName; + + } + /// + /// ݹλŻùλ + /// + /// + /// + public static string GetWorkPositionNameByWorkPositionID(string positionID) + { + string positionIDName = ""; + string errorMessage; + DataTable dt; + string sql; + sql = "SELECT top 1 λ FROM MES_ƻBOM_λ " + + "where λ='" + positionID + "'"; + //if (!SQLCommon.SqlServerConnectionStatus) + //{ + // SQLCommon.ExecuteDataTable_OleDb(sql, ApplicationConfig.ConnectionString_Access, out dt, out errorMessage); + //} + //else + { + DataAccess.ExecuteDataTable(sql, out dt); + } + if (dt == null) return positionIDName; + if (dt.Rows.Count > 0) + { + positionIDName = dt.Rows[0]["λ"].ToString(); + } + return positionIDName; + + } + /// + /// ݶŻöϢ + /// + /// + /// + //public static DataTable GetOrderFormPlanByOrderForm(string OrderForm) + //{ + // string errorMessage; + // DataTable dt; + // string sql; + // sql = "SELECT TOP 1 * FROM [MES_ƻBOM_ƻ´] " + // + "where ='" + OrderForm + "'"; + // SQLCommon.ExecuteDataTable_OleDb(sql, ApplicationConfig.ConnectionString_Access, out dt, out errorMessage); + // MaterialData.dt_OrderFormPlan = dt; + // return dt; + //} + /// + /// ݶŻùλָϢ + /// + /// λ + /// + /// + //public static DataTable GetWorkPositionGuidByOrderForm(string OrderForm,string OpName) + //{ + // string errorMessage; + // DataTable dt; + // string sql; + // sql = "SELECT TOP 1 λָ,λָͼƬ FROM [MES_ƻBOM_ƻ´] " + // + "where λ='" + OpName + "'" + // + " and ='" + OrderForm + "'" + // + " order by ʱ desc "; + // SQLCommon.ExecuteDataTable_OleDb(sql, ApplicationConfig.ConnectionString_Access, out dt, out errorMessage); + + // return dt; + //} + /// + /// ݷŻװָϢ + /// + /// + /// + /// + //public static DataTable GetAssemblyListByEngineNumber(string orderForm, string OpName) + //{ + // string errorMessage; + // DataTable dt; + // string sql; + // //sql = "SELECT * " + // sql = "SELECT [ID],[], [SAPϺ], [ͺ], [ͺŴ], []," + + // "[], [Ʊʼ], [ͻ], [Ͷ], [ļ], [], [֪ͨ], " + + // "[], [ָļ], [װ״̬], [״̬], [],[ƻ´], [ƻ깤]," + + // "[䳧],[λ], [λ], [Ϻ], [ͼ], [], [],[Ƿɨ],d.ɨ跽ʽ,d.ɨ跽ʽ,[Ҵ], [], " + + // "[ָ],'' as ,0 as Ϻű,0 as ֤," + // + "'' as ,'' as Ϻ,'' as ,0 as ֤," + // + "'' as ߹,'' as ,'' as δ," + // + "b.Դ, b.Դ, a.Ƿô, a.Ƿ,ǿ֤Ϻ,Ĵ,ԭ " + // + " FROM MES_ƻBOM_ƻ´_ɨ跽ʽ AS d INNER JOIN (MES_ƻBOM_ƻ´_Ƿ AS a INNER JOIN (MES_ƻBOM_ƻ´_Դ AS b INNER JOIN MES_ƻBOM_ƻ´ AS c ON b.Դ = c.Դ) ON a.Ƿô = c.Ƿô) ON c.ɨ跽ʽ=d.ɨ跽ʽ " + // + "where ='" + orderForm + "'" + // + "and λ='" + OpName + "' and a.Ƿô = 0 " + // + " ORDER BY Ϻ "; + // SQLCommon.ExecuteDataTable_OleDb(sql, ApplicationConfig.ConnectionString_Access, out dt, out errorMessage); + // return dt; + //} + /// + /// ݷŻװָϢ + /// + /// + /// + /// + //public static DataTable GetAssemblyListForVerifyByEngineNumber(string orderForm, string OpName) + //{ + // string errorMessage; + // DataTable dt; + // string sql; + // sql = "SELECT [ID], [], [SAPϺ], [ͺ], [ͺŴ], []," + + // "[], [Ʊʼ], [ͻ], [Ͷ], [ļ], [], [֪ͨ], " + + // "[], [ָļ], [װ״̬], [״̬], [],[ƻ´], [ƻ깤]," + + // "[䳧],[λ], [λ], [Ϻ], [ͼ], [], [],[Ƿɨ],d.ɨ跽ʽ,d.ɨ跽ʽ,[Ҵ], [], " + + // "[ָ],'' as ,'' as ׷ٴ,0 as Ϻű,0 as ֤," + // + "'' as ,'' as Ϻ,'' as ,0 as ֤," + // + "'' as ߹,'' as ,'' as δ," + // + "b.Դ, b.Դ, a.Ƿô, a.Ƿ,ǿ֤Ϻ,Ĵ,ԭ " + // + " FROM MES_ƻBOM_ƻ´_ɨ跽ʽ AS d INNER JOIN (MES_ƻBOM_ƻ´_Ƿ AS a INNER JOIN (MES_ƻBOM_ƻ´_Դ AS b INNER JOIN MES_ƻBOM_ƻ´ AS c ON b.Դ = c.Դ) ON a.Ƿô = c.Ƿô) ON c.ɨ跽ʽ=d.ɨ跽ʽ " + // + "where ='" + orderForm + "'" + // + "and λ='" + OpName + "' and a.Ƿô = 0 and Ƿɨ = 1 " + // + " ORDER BY Ϻ "; + // SQLCommon.ExecuteDataTable_OleDb(sql, ApplicationConfig.ConnectionString_Access, out dt, out errorMessage); + // return dt; + //} + + /// + /// ݷŻװָϢ + /// + /// + /// + /// + //public static DataTable GetAssemblyListForVerifyByEngineNumber_F3(string orderForm, string OpName) + //{ + // string errorMessage; + // DataTable dt; + // string sql; + // sql = "SELECT [ID], [], [SAPϺ], [ͺ], [ͺŴ], []," + + // "[], [Ʊʼ], [ͻ], [Ͷ], [ļ], [], [֪ͨ], " + + // "[], [ָļ], [װ״̬], [״̬], [],[ƻ´], [ƻ깤]," + + // "[䳧],[λ], [λ], [Ϻ], [ͼ], [], [],[Ƿɨ],d.ɨ跽ʽ,d.ɨ跽ʽ,[Ҵ], [], " + + // "[ָ],'' as ,'' as ׷ٴ,0 as Ϻű,0 as ֤," + // + "'' as ,'' as Ϻ,'' as ,0 as ֤," + // + "'' as ߹,'' as ,'' as δ," + // + "b.Դ, b.Դ, a.Ƿô, a.Ƿ,ǿ֤Ϻ,Ĵ,ԭ " + // + " FROM MES_ƻBOM_ƻ´_ɨ跽ʽ AS d INNER JOIN (MES_ƻBOM_ƻ´_Ƿ AS a INNER JOIN (MES_ƻBOM_ƻ´_Դ AS b INNER JOIN MES_ƻBOM_ƻ´ AS c ON b.Դ = c.Դ) ON a.Ƿô = c.Ƿô) ON c.ɨ跽ʽ=d.ɨ跽ʽ " + // + "where ='" + orderForm + "'" + // + "and λ='" + OpName + "' and a.Ƿô = 0 and Ƿɨ = 2 "// + // + " ORDER BY Ϻ "; + // SQLCommon.ExecuteDataTable_OleDb(sql, ApplicationConfig.ConnectionString_Access, out dt, out errorMessage); + // return dt; + //} + ///// + ///// =1 Accessݿ =0 SQL Server + ///// + //static int OpcServerIsAccess = 1; + /// + /// Ӽƻл÷Ϣ + /// + //public static DataTable PruducePlanGetEngineNumber() + //{ + // string errorMessage; + // DataTable dt; + // string sql; + // sql = "SELECT top 1 * FROM [MES_ƻBOM_] order by Ͷ,"; + // SQLCommon.ExecuteDataTable_OleDb(sql, ApplicationConfig.ConnectionString_Access, out dt, out errorMessage); + // MaterialData.dt_EngineNumber = dt; + + // return dt; + //} + + /// + /// λָͼƬ + /// + /// λ + /// + public static DataTable GetWorkPositionBasicGuidPictureByOpName(string OpName) + { + //string errorMessage; + DataTable dt; + string sql; + sql = "SELECT TOP 1 λָͼƬ FROM [MES_ƻBOM_λָ] " + + "where λ='" + OpName + "'"; + DataAccess.ExecuteDataTable(sql, out dt); + //BizDataAccess.DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + + return dt; + } + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/MES.Biz.Config.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/MES.Biz.Config.cs new file mode 100644 index 0000000..5ae48f0 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/MES.Biz.Config.cs @@ -0,0 +1,196 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Data.OleDb; +using System.Collections; + +//using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + ///// + ///// 从Access配置表中读取程序配置信息 + ///// + ///// + //public static void InitConfig(string opName) + //{ + + // DataTable dt; + // string sql; + // sql = " SELECT * FROM MES_计划BOM_工位与名称 WHERE 工位号='" + opName + "'"; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + // if (dt == null) return; + // if (dt.Rows.Count < 1) return; + // try + // { + // //0032 + // ApplicationConfig.ConnectionString_Access_OpNameMainLine = dt.Rows[0]["总线上线工位数据文件连接"].ToString(); + // } + // catch { ApplicationConfig.ConnectionString_Access_OpNameMainLine = ""; } + // try + // { + // //0033 + // ApplicationConfig.ConnectionString_Access_OpNameTraceCode = dt.Rows[0]["分线物料追踪工位数据文件连接"].ToString(); + // } + // catch { ApplicationConfig.ConnectionString_Access_OpNameTraceCode = ""; } + // try + // { + // ApplicationConfig.OpNameGuid = dt.Rows[0]["指南工位号"].ToString(); + // } + // catch { ApplicationConfig.OpNameGuid = ""; } + // //try + // //{ + // // //0051 + // // ApplicationConfig.OpNameOther = dt.Rows[0]["总线被监测工位"].ToString(); + // //} + // //catch { ApplicationConfig.OpNameOther = ""; } + // try + // { + // //0052 + // ApplicationConfig.OpNameMainLine = dt.Rows[0]["总线上线工位"].ToString(); + // } + // catch { ApplicationConfig.OpNameMainLine = ""; } + // try + // { + // //0053 + // ApplicationConfig.OpNameTraceCode = dt.Rows[0]["分线物料追踪工位"].ToString(); + // } + // catch { ApplicationConfig.OpNameTraceCode = ""; } + // //try + // //{ + // // //0080 + // // ApplicationConfig.ScannerType = dt.Rows[0]["扫描枪类型"].ToString(); + // //} + // //catch { ApplicationConfig.ScannerType = "0"; } + // try + // { + // //0081 + // ApplicationConfig.MachineType = dt.Rows[0]["机床类型"].ToString(); + // } + // catch { ApplicationConfig.MachineType = "S"; } + // try + // { + // //0090 + // ApplicationConfig.OpType = dt.Rows[0]["工位类型"].ToString(); + // } + // catch { ApplicationConfig.OpType = "P1"; } + // try + // { + // //0170 + // ApplicationConfig.OpcServer = dt.Rows[0]["OpcServer"].ToString().Trim(); + // } + // catch { ApplicationConfig.OpcServer = ""; } + // try + // { + // //0170 + // ApplicationConfig.OpcServer_MIS = dt.Rows[0]["OpcServer_MIS"].ToString().Trim(); + // } + // catch { ApplicationConfig.OpcServer_MIS = ""; } + // try + // { + // //0170 + // ApplicationConfig.CycleTargetCycleTime = Convert.ToInt32(dt.Rows[0]["目标循环时间"]); + // } + // catch { ApplicationConfig.CycleTargetCycleTime = 0; } + // try + // { + // //0190 + // ApplicationConfig.PartType = dt.Rows[0]["工件类型"].ToString(); + // } + // catch { ApplicationConfig.PartType = ""; } + // try + // { + // //0190 + // ApplicationConfig.Password = dt.Rows[0]["退出密码"].ToString(); + // } + // catch { ApplicationConfig.Password = ""; } + + // try + // { + // //0190 + // ApplicationConfig.LeaderCode = dt.Rows[0]["领班工号"].ToString(); + // } + // catch { ApplicationConfig.LeaderCode = ""; } + + // if (ApplicationConfig.OpType == "F102") + // { + // sql = " SELECT * FROM MES_计划BOM_工位与名称 WHERE 工位号='" + ApplicationConfig.OpNameOther + "'"; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // try + // { + // ApplicationConfig.OpcServerOther = dt.Rows[0]["OpcServer"].ToString(); + // } + // catch { } + // } + // } + // } + //} + + //private static void GetBarCodeCommand(out DataTable dt) + //{ + // string sql = " SELECT * FROM [MES_基本数据_条码命令] "; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + + /// + /// + /// + /// + //public static void GetBarCodeCommand_RepareReason(out DataTable dt) + //{ + // string sql = " SELECT * FROM [MES_基本数据_条码命令] WHERE 命令说明='返修原因'"; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + /// + /// + /// + /// + public static Hashtable Get_hashtableBarCodeCommand() + { + DataTable dt = new DataTable(); + Hashtable hashtableBarCodeCommand; + hashtableBarCodeCommand = new Hashtable(); + //GetBarCodeCommand(out dt); + for (int i = 0; i < dt.Rows.Count; i++) + { + hashtableBarCodeCommand.Add(dt.Rows[i]["命令条码"], dt.Rows[i]["命令代码"]); + + } + + return hashtableBarCodeCommand; + + + + } + /// + /// + /// + /// + public static Hashtable Get_hashtableBarCodeCommand_RepareReason() + { + DataTable dt = new DataTable (); + Hashtable hashtableBarCodeCommand; + hashtableBarCodeCommand = new Hashtable(); + //GetBarCodeCommand(out dt); + for (int i = 0; i < dt.Rows.Count; i++) + { + hashtableBarCodeCommand.Add(dt.Rows[i]["命令代码"], dt.Rows[i]["命令功能"]); + + } + + return hashtableBarCodeCommand; + + + + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/MES.Biz.MaterialList.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/MES.Biz.MaterialList.cs new file mode 100644 index 0000000..a96b892 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/MES.Biz.MaterialList.cs @@ -0,0 +1,298 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using System.Data.OleDb; +using DataLinkMesWork; +using System.Collections; + +//using SystemFramework; + +namespace bizFacade +{ + public partial class BaseDataSystemMES + { + + /// + /// + /// [MES_基本变量_厂家代码] + /// + /// + //public static Hashtable GetFatoryCodeHashtable() + //{ + // //厂家代码 + // string fatoryCode; + // //三位码 + // string threeCode; + // Hashtable fatoryCodeHashtable; + // fatoryCodeHashtable = new Hashtable (); + // DataTable dt; + // string sql; + // sql = "SELECT * FROM MES_基本变量_厂家代码 "; + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + // for (int i = 0; i < dt.Rows.Count; i++) + // { + + // if (Convert.IsDBNull(dt.Rows[i]["厂家代码"])) + // { + // fatoryCode = ""; + // } + // else + // { + // fatoryCode = dt.Rows[i]["厂家代码"].ToString(); + // } + + // if (Convert.IsDBNull(dt.Rows[i]["三位码"])) + // { + // threeCode = ""; + // } + // else + // { + // threeCode = dt.Rows[i]["三位码"].ToString(); + // } + + // fatoryCodeHashtable.Add(fatoryCode, threeCode); + + // } + // return fatoryCodeHashtable; + //} + /// + /// 根据订单号和工位获得主物料号 + /// [MES_计划BOM_发动机装配指南] + /// + /// 订单号 + /// 工位号 + /// + public static string GetMainMaterialCode(string orderForm, string OpName) + { + string mainMaterialNumber=""; + DataTable dt; + string sql; + sql = "SELECT * FROM MES_计划BOM_发动机装配指南 " + + " WHERE 订单号 = '" + orderForm + "'" + + " AND 工位号 = '" + OpName + "'" + + " AND 是否主物料= 1"; + //if (!SQLCommon.SqlServerConnectionStatus) + //{ + // DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + //else + { + DataAccess.ExecuteDataTable(sql, out dt); + } + if (dt == null) + { + mainMaterialNumber = ""; + } + if (dt.Rows.Count > 0) + { + mainMaterialNumber = dt.Rows[0]["物料号"].ToString().Trim(); + } + return mainMaterialNumber; + } + + /// + /// 根据订单号和工位获得装配指南信息 + /// [MES_计划BOM_订单计划下达] + /// 同步通讯,从SqlServer数据库获得 + /// 异步通讯,从Access数据库获得 + /// + /// 订单号 + /// 工位号 + /// (true 是验证物料)(false 是全部物料) + /// + public static DataTable GetMaterialList(string orderForm, string OpName, bool isVerify) + { + string errorMessage; + DataTable dt; + string sql; + if (isVerify) + { + sql = "SELECT [ID], [订单号], " + + "[主配厂家],[工位号], [工位名称], [物料号], [零件图号], [零件名称], [零件数量],[是否扫描],d.扫描方式代码,d.扫描方式,[是否主物料],[厂家代码], [生产厂家], " + + "[操作指导],'' as 发动机号,'' as 追踪代码,'' as 主物料号,0 as 物料号表索引号,0 as 零件数量验证," + + "'' as 物料条码,'' as 物料条码物料号,'' as 物料条码批次,0 as 验证结果," + + "'' as 操作者工号,'' as 操作者姓名,'' as 班次代码," + + "b.物料来源代码, b.物料来源, a.是否禁用代码, a.是否禁用,被强制验证物料号,更改代码,更改原因 " + + " FROM MES_计划BOM_订单计划下达_扫描方式 AS d INNER JOIN (MES_计划BOM_订单计划下达_是否禁用 AS a INNER JOIN (MES_计划BOM_订单计划下达_物料来源 AS b INNER JOIN MES_计划BOM_发动机装配指南 AS c ON b.物料来源代码 = c.物料来源代码) ON a.是否禁用代码 = c.是否禁用代码) ON c.扫描方式=d.扫描方式代码 " + + "where 订单号='" + orderForm + "'" + + "and 工位号='" + OpName + "' and a.是否禁用代码 = 0 and 是否扫描 <> 0 " + + " ORDER BY 物料号 "; + + sql = "SELECT [ID],[订单号]," + + "[主配厂家],[工位号], [工位名称], [物料号], [零件图号], [零件名称],[零件数量]," + + "[是否扫描],扫描方式 as 扫描方式代码,'' as 扫描方式,是否主物料,[厂家代码], [生产厂家], " + + "'' as 操作指导,'' as 发动机号,'' as 追踪代码,'' as 主物料号,0 as 物料号表索引号,0 as 零件数量验证," + + "'' as 物料条码,'' as 物料条码物料号,'' as 物料条码批次,0 as 验证结果,'' as 操作者工号,'' as 操作者姓名,'' as 班次代码," + + " 物料来源代码,'' as 物料来源,是否禁用代码,'' as 是否禁用, 被强制验证物料号,更改代码,更改原因" + + " from MES_计划BOM_发动机装配指南" + + " where 是否扫描 <> 0" + + " and 订单号='" + orderForm + "'" + +"and 工位号='" + OpName + "'"; + + // + "([订单号]," + //+ "[主配厂家],[工位号], [工位名称],[物料号], [零件图号], [零件名称], [零件数量]," + //+ "[是否扫描],[扫描方式代码], [扫描方式],[是否主物料], [厂家代码],[生产厂家], " + //+ "[操作指导],[发动机号],[追踪代码],[主物料号],[物料号表索引号],[零件数量验证]," + //+ "[物料条码], [物料条码物料号], [物料条码批次],[验证结果], [操作者工号], [操作者姓名], [班次代码], " + //+ "物料来源代码,物料来源,是否禁用代码,是否禁用,被强制验证物料号,更改代码,更改原因)" +// SELECT [ID],[订单号],[主配厂家],[工位号], [工位名称], [物料号], [零件图号], [零件名称],[零件数量],[是否扫描], +//是否主物料,[厂家代码], [生产厂家], 0 as 零件数量验证,'' as 物料条码,'' +//as 物料条码物料号,'' as 物料条码批次,0 as 验证结果,被强制验证物料号,更改代码,更改原因,是否禁用代码,物料来源代码,扫描方式 +//from MES_计划BOM_发动机装配指南 +//where 订单号='100080211'and 工位号='OP3120' + } + else + { + sql = "SELECT [ID],[订单号]," + + "[主配厂家],[工位号], [工位名称], [物料号], [零件图号], [零件名称], [零件数量],[是否扫描],d.扫描方式代码,d.扫描方式,是否主物料,[厂家代码], [生产厂家], " + + "[操作指导],'' as 发动机号,'' as 主物料号,0 as 物料号表索引号,0 as 零件数量验证," + + "'' as 物料条码,'' as 物料条码物料号,'' as 物料条码批次,0 as 验证结果," + + "'' as 操作者工号,'' as 操作者姓名,'' as 班次代码," + + "b.物料来源代码, b.物料来源, a.是否禁用代码, a.是否禁用,被强制验证物料号,更改代码,更改原因 " + + " FROM MES_计划BOM_订单计划下达_扫描方式 AS d INNER JOIN (MES_计划BOM_订单计划下达_是否禁用 AS a INNER JOIN (MES_计划BOM_订单计划下达_物料来源 AS b INNER JOIN MES_计划BOM_发动机装配指南 AS c ON b.物料来源代码 = c.物料来源代码) ON a.是否禁用代码 = c.是否禁用代码) ON c.扫描方式=d.扫描方式代码 " + + "where 订单号='" + orderForm + "'" + + "and 工位号='" + OpName + "' and a.是否禁用代码 = 0 " + + " ORDER BY 物料号 "; + sql = "SELECT [ID],[订单号]," + + "[主配厂家],[工位号], [工位名称], [物料号], [零件图号], [零件名称],[零件数量]," + + "[是否扫描],扫描方式 as 扫描方式代码,'' as 扫描方式,是否主物料,[厂家代码], [生产厂家], " + + "'' as 操作指导,'' as 发动机号,'' as 追踪代码,'' as 主物料号,0 as 物料号表索引号,0 as 零件数量验证," + + "'' as 物料条码,'' as 物料条码物料号,'' as 物料条码批次,0 as 验证结果,'' as 操作者工号,'' as 操作者姓名,'' as 班次代码," + + " 物料来源代码,'' as 物料来源,是否禁用代码,'' as 是否禁用, 被强制验证物料号,更改代码,更改原因" + + " from MES_计划BOM_发动机装配指南" + + " where 订单号='" + orderForm + "'" + + "and 工位号='" + OpName + "'"; + } + //if (!SQLCommon.SqlServerConnectionStatus) + //{ + // SQLCommon.ExecuteDataTable_OleDb(sql, ApplicationConfig.ConnectionString_Access, out dt, out errorMessage); + //} + //else + { + DataAccess.ExecuteDataTable(sql, out dt); + } + return dt; + } + /// + /// MES_装配数据_零部件追溯_临时状态_增加 + /// + /// + /// + //public static void VerifyMaterialTempTableInsert(DataTable dt) + //{ + // string sql; + // sql = "INSERT INTO [MES_装配数据_零部件追溯_临时状态]" + // + "([订单号]," + // + "[主配厂家],[工位号], [工位名称],[物料号], [零件图号], [零件名称], [零件数量]," + // + "[是否扫描],[扫描方式代码], [扫描方式],[是否主物料], [厂家代码],[生产厂家], " + // + "[操作指导],[发动机号],[追踪代码],[主物料号],[物料号表索引号],[零件数量验证]," + // + "[物料条码], [物料条码物料号], [物料条码批次],[验证结果], [操作者工号], [操作者姓名], [班次代码], " + // + "物料来源代码,物料来源,是否禁用代码,是否禁用,被强制验证物料号,更改代码,更改原因)" + + // + "VALUES(@订单号," + // + "@主配厂家,@工位号,@工位名称,@物料号,@零件图号,@零件名称,@零件数量," + // + " @是否扫描,@扫描方式代码,@扫描方式,@是否主物料,@厂家代码,@生产厂家," + // + "@操作指导,@发动机号,@追踪代码,@主物料号,@物料号表索引号,@零件数量验证," + // + "@物料条码,@物料条码物料号,@物料条码批次,@验证结果,@操作者工号,@操作者姓名,@班次代码," + // + "@物料来源代码,@物料来源,@是否禁用代码,@是否禁用,@被强制验证物料号,@更改代码,@更改原因)"; + + + // OleDbParameter[] thisParms1 = new OleDbParameter[34]; + // // + "([订单号] " + // thisParms1[0] = new OleDbParameter("@订单号", OleDbType.VarChar, 50, "订单号"); + + // // + "@主配厂家,@工位号,@工位名称,@物料号,@零件图号,@零件名称,@零件数量," + + // thisParms1[1] = new OleDbParameter("@主配厂家", OleDbType.VarChar, 50, "主配厂家"); + // thisParms1[2] = new OleDbParameter("@工位号", OleDbType.VarChar, 50, "工位号"); + // thisParms1[3] = new OleDbParameter("@工位名称", OleDbType.VarChar, 50, "工位名称"); + // thisParms1[4] = new OleDbParameter("@物料号", OleDbType.VarChar, 50, "物料号"); + // thisParms1[5] = new OleDbParameter("@零件图号", OleDbType.VarChar, 50, "零件图号"); + // thisParms1[6] = new OleDbParameter("@零件名称", OleDbType.VarChar, 50, "零件名称"); + // thisParms1[7] = new OleDbParameter("@零件数量", OleDbType.Integer, 4, "零件数量"); + + // // +"[是否扫描],扫描方式代码, [扫描方式], [厂家代码],[生产厂家], " + + // thisParms1[8] = new OleDbParameter("@是否扫描", OleDbType.Integer, 4, "是否扫描"); + // thisParms1[9] = new OleDbParameter("@扫描方式代码", OleDbType.Integer, 4, "扫描方式代码"); + // thisParms1[10] = new OleDbParameter("@扫描方式", OleDbType.VarChar, 50, "扫描方式"); + // thisParms1[11] = new OleDbParameter("@是否主物料", OleDbType.Integer, 4, "是否主物料"); + // thisParms1[12] = new OleDbParameter("@厂家代码", OleDbType.VarChar, 50, "厂家代码"); + // thisParms1[13] = new OleDbParameter("@生产厂家", OleDbType.VarChar, 50, "生产厂家"); + + // //+ "@操作指导,@发动机号,@物料号表索引号,@零件数量验证," + + // thisParms1[14] = new OleDbParameter("@操作指导", OleDbType.VarChar, 255, "操作指导"); + // thisParms1[15] = new OleDbParameter("@发动机号", OleDbType.VarChar, 50, "发动机号"); + // thisParms1[16] = new OleDbParameter("@追踪代码", OleDbType.VarChar, 50, "追踪代码"); + // thisParms1[17] = new OleDbParameter("@主物料号", OleDbType.VarChar, 50, "主物料号"); + // thisParms1[18] = new OleDbParameter("@物料号表索引号", OleDbType.Integer, 4, "物料号表索引号"); + // thisParms1[19] = new OleDbParameter("@零件数量验证", OleDbType.Integer, 4, "零件数量验证"); + + // // +"[物料条码], [物料条码物料号], [物料条码批次],@验证结果, [操作者工号], [操作者姓名], [班次代码], " + // thisParms1[20] = new OleDbParameter("@物料条码", OleDbType.VarChar, 50, "物料条码"); + // thisParms1[21] = new OleDbParameter("@物料条码物料号", OleDbType.VarChar, 50, "物料条码物料号"); + // thisParms1[22] = new OleDbParameter("@物料条码批次", OleDbType.VarChar, 50, "物料条码批次"); + // thisParms1[23] = new OleDbParameter("@验证结果", OleDbType.Integer, 4, "验证结果"); + // thisParms1[24] = new OleDbParameter("@操作者工号", OleDbType.VarChar, 50, "操作者工号"); + // thisParms1[25] = new OleDbParameter("@操作者姓名", OleDbType.VarChar, 50, "操作者姓名"); + // thisParms1[26] = new OleDbParameter("@班次代码", OleDbType.VarChar, 50, "班次代码"); + + // // +"物料来源代码,物料来源,是否禁用代码,是否禁用,被强制验证物料号,更改代码,更改原因)" + + // thisParms1[27] = new OleDbParameter("@物料来源代码", OleDbType.Integer, 4, "物料来源代码"); + // thisParms1[28] = new OleDbParameter("@物料来源", OleDbType.VarChar, 50, "物料来源"); + // thisParms1[29] = new OleDbParameter("@是否禁用代码", OleDbType.Integer, 4, "是否禁用代码"); + // thisParms1[30] = new OleDbParameter("@是否禁用", OleDbType.VarChar, 50, "是否禁用"); + // thisParms1[31] = new OleDbParameter("@被强制验证物料号", OleDbType.VarChar, 50, "被强制验证物料号"); + // thisParms1[32] = new OleDbParameter("@更改代码", OleDbType.VarChar, 50, "更改代码"); + // thisParms1[33] = new OleDbParameter("@更改原因", OleDbType.VarChar, 255, "更改原因"); + + // DataAccess.ExecuteDataTable_OleDb_Insert_Access(sql, dt, ref thisParms1); + //} + + + + /// + /// 查询订单号对应的订单数据 + /// [MES_计划BOM_发动机号] + /// + /// + /// + /// + public static bool EngineSelectByOrderForm(string orderForm, out DataTable dt) + { + string sql; + sql = "SELECT TOP 1 * FROM MES_计划BOM_发动机号 WHERE 订单号='" + orderForm+"'"; + //if (!SQLCommon.SqlServerConnectionStatus) + //{ + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + //else + { + return DataAccess.ExecuteDataTable(sql, out dt); + + } + } + + + /// + /// 根据追踪代码查询订单号对应的订单数据 + /// [MES_装配数据_发动机号_追踪代码] + /// + /// + /// + /// + //public static bool GetOrderFormByEngineTraceCode(string engineTraceCode, out DataTable dt) + //{ + // string sql; + // sql = "SELECT TOP 1 * FROM MES_装配数据_发动机号_追踪代码 WHERE 追踪代码='" + engineTraceCode + "'"; + // return DataAccess.ExecuteDataTable_OleDb_Access(sql, out dt); + //} + + + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/MaterialData.cs b/Common/07WebBusinessFacade/BusinessFacade/MES/MaterialData.cs new file mode 100644 index 0000000..4aad881 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/MES/MaterialData.cs @@ -0,0 +1,1504 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +//using System.Windows.Forms; + +namespace bizFacade//MESPC +{ + /// + /// + /// + public class MaterialData + { + /// + /// ֤ȫϢϢ֤Ϣ + /// 浽ݿ[MES_װ_㲿׷] + /// + public static DataTable MaterialTableForSave=null; + /// + /// [MES_ƻBOM_ƻ] + /// + public static DataTable dt_OrderFormPlan=null; + /// + /// [MES_ƻBOM_] + /// + public static DataTable dt_EngineNumber=null; + /// + /// ԭʼϱ + /// + public static DataTable dt_Material=null; + /// + /// Ҫ֤ϱ + /// + public static DataTable dt_Material_Verify=null; + /// + /// Ҫǿ֤ϱ + /// + public static DataTable dt_MaterialUnchecked=null; + /// + /// ID + /// Ϻű + /// + public static string MaterialIndexField = "Ϻű"; + /// + /// ߹λ׷ݴ + /// + public static string FirstOpNameTraceCodeField = "߹λ׷ݴ"; + /// + /// ߹λ׷ݴ + /// + public static int firstOpNameTraceCode; + + /// + /// ׷ݴ + /// + public static int traceID ; + + /// + /// 1豸 + /// 2MES + /// + public static string RepairReasonID = "1"; + /// + /// 1豸 + /// 2MES + /// + public static string RepairReasonText = "豸"; + + + /// + /// traceID + /// + public static string OrderFormField = ""; + /// + /// + /// + public static string orderForm; + /// + /// 䳧 + /// + public static string MainPruduceFatoryField = "䳧"; + /// + /// 䳧 + /// + public static string mainPruduceFatory ; + /// + /// ƻ + /// + public static string EngineNumber_OrderPlanField = "ƻ"; + /// + /// ƻ + /// + public static string engineNumber_OrderPlan; + /// + /// + /// + public static string EngineNumberField = ""; + /// + /// + /// + public static string engineNumber; + /// + /// ׷ٴ + /// + public static string EngineTraceCodeField = "׷ٴ"; + /// + /// ׷ٴ + /// + public static string engineTraceCode; + + + /// + /// λ + /// + public static string OpNameField = "λ"; + /// + /// λ + /// + public static string opName; + /// + /// ʱ + /// + public static string CycleActualCycleTime = "ʵѭʱ"; + /// + /// ʱ + /// + public static int cycleActualCycleTime; + /// + /// ʱ + /// + public static string ArrivedTimeField = "ʱ"; + /// + /// ʱ + /// + public static DateTime arrivedTime; + /// + /// 뿪ʱ + /// + public static string LeavedTimeField = "뿪ʱ"; + /// + /// 뿪ʱ + /// + public static DateTime leavedTime; + /// + /// ߹ + /// + public static string OperatorCodeField = "߹"; + /// + /// ߹ + /// + public static string operatorCode; + /// + /// + /// + public static string OperatorNameField = ""; + /// + /// + /// + public static string operatorName; + /// + /// δ + /// + public static string OperatorShiftField = "δ"; + /// + /// δ + /// + public static string operatorShift; + /// + /// + /// + public static string OperatorShiftNameField = ""; + /// + /// + /// + public static string operatorShiftName; + /// + /// λ + /// + public static string PositionIDNameField = "λ"; + /// + /// λ + /// + public static string positionIDName; + /// + /// SAPϺ + /// + public static string SAPMaterialNumberField = "SAPϺ"; + /// + /// SAPϺ + /// + public static string sAPMaterialNumber; + /// + /// ͺ + /// + public static string EngineNumberTypeField = "ͺ"; + /// + /// ͺ + /// + public static string engineNumberType; + /// + /// ͺŴ + /// + public static string EngineNumberCodeField = "ͺŴ"; + ///// + ///// ͺŴ + ///// + //public static string EngineNumberTypeCodeField = "ͺŴ"; + /// + /// ͺŴ + /// + public static int engineNumberCode; + ///// + ///// ͺŴ + ///// + //public static int engineNumberTypeCode; + /// + /// + /// + public static string EngineNumberBasicTypeField = ""; + /// + /// + /// + public static string engineNumberBasicType; + /// + /// + /// + public static string EngineCountField = ""; + /// + /// + /// + public static string engineCount; + /// + /// Ʊʼ + /// + public static string EngineNumberFirstIDField = "Ʊʼ"; + /// + /// Ʊʼ + /// + public static string engineNumberFirstID; + /// + /// ͻ + /// + public static string CustomesNameField = "ͻ"; + /// + /// ͻ + /// + public static string customesName; + /// + /// Ͷ + /// + public static string PrepareMaterialDateTimeField = "Ͷ"; + /// + /// Ͷ + /// + public static DateTime prepareMaterialDateTime; + /// + /// ļ + /// + public static string FileCodeField = "ļ"; + /// + /// ļ + /// + public static string fileCode; + /// + /// + /// + public static string GroupNameField = ""; + /// + /// + /// + public static string groupName; + /// + /// ֪ͨ + /// + public static string NotifyCodeField = "֪ͨ"; + /// + /// ֪ͨ + /// + public static string notifyCode; + /// + /// + /// + public static string N_ForceField = ""; + /// + /// + /// + public static string n_Force; + /// + /// ָļ + /// + public static string DirectFileCodeField = "ָļ"; + /// + /// ָļ + /// + public static string directFileCode; + /// + /// װ״̬ + /// + public static string WorkEngineStatusField = "װ״̬"; + /// + /// װ״̬ + /// + public static string workEngineStatus; + /// + /// ״̬ + /// + public static string AdaptDateTimeField = "״̬"; + /// + /// ״̬ + /// + public static DateTime adaptDateTime; + /// + /// װָ + /// + public static string OrderFormDirectField = "װָ"; + /// + /// + /// + public static string MaterialDescriptField = ""; + /// + /// + /// + public static string materialDescript; + /// + /// ƻ´ + /// + public static string PlanSendedDateTimeField = "ƻ´"; + /// + /// ƻ´ + /// + public static DateTime planSendedDateTime; + /// + /// ƻ깤 + /// + public static string PlanFinishDateTimeField = "ƻ깤"; + /// + /// ƻ깤 + /// + public static DateTime planFinishDateTime; + /// + /// + /// + public static string ProduceFatoryField = ""; + /// + /// + /// + public string produceFatory; + /// + /// + /// + public static string PartTypeField = ""; + /// + /// + /// + public static int partType; + /// + /// Ƿϸ + /// + public static int isGoodQuality; + + + + + /// + /// Ϻ + /// + public static string MaterialNumberField = "Ϻ"; + /// + /// Ϻ + /// + public string materialNumber; + /// + /// Ϻ + /// + public static string MainMaterialNumberField = "Ϻ"; + /// + /// Ϻ + /// + public static string mainMaterialNumber; + /// + /// ͼ + /// + public static string PartDrawNumberField = "ͼ"; + /// + /// ͼ + /// + public string partDrawNumber; + /// + /// + /// + public static string PartDrawNameField = ""; + /// + /// + /// + public string partDrawName; + /// + /// + /// + public static string PartCountField = ""; + /// + /// + /// + public int partCount; + /// + /// ֤ + /// + public static string PartCountVerifyField = "֤"; + /// + /// ֤ + /// + public int partCountVerify; + /// + /// Ƿɨ + /// =1Ҫɨ + /// =0Ҫɨ + /// + public static string MaterialTraceField = "Ƿɨ"; + /// + /// Ƿɨ + /// =0Ҫɨ + /// =1Ҫɨ + /// + public int materialTrace; + /// + /// ɨ跽ʽ + /// =0ֻɨһ + /// =1ֻɨ輸Σֱɨ衣 + /// + public static string MaterialVerifyIDField = "ɨ跽ʽ"; + /// + /// ɨ跽ʽ + /// + public int materialVerifyID; + /// + /// Ƿ + /// =0 + /// =1 + /// + public static string IsMainMaterialField = "Ƿ"; + /// + /// Ƿ + /// + public static int isMainMaterial; + /// + /// Ҵ + /// + public static string ProduceFatoryCodeField = "Ҵ"; + /// + /// Ҵ + /// + public string produceFatoryCode; + /// + /// + /// + public static string BarCodeField = ""; + /// + /// + /// + public string barCode; + /// + /// Ϻ + /// + public static string BarCode_MaterialField = "Ϻ"; + /// + /// Ϻ + /// + public string barCode_Material; + /// + /// + /// + public static string BarCode_SerailNumberField = ""; + /// + /// + /// + public string barCode_SerailNumber; + /// + /// ֤ + /// ֤ + /// ֤ CheckState.Unchecked 0û֤ + /// ֤ CheckState.Checked 1 Ѿ֤ + /// ֤ CheckState.Indeterminate 2 Ѿǿ֤ + /// + public static string MaterialVerifyResultField = "֤"; + + + /// + /// ǿ֤ԭ + /// + public static string MaterialVerifyReasonField = "ǿ֤ԭ"; + + + /// + /// ¼ʱ + /// + public static string OperatorLoginTimeField = "¼ʱ"; + /// + /// ¼ʱ + /// + public static DateTime operatorLoginTime; + /// + /// ˳ʱ + /// + public static string OperatorLogoutTimeField = "˳ʱ"; + /// + /// ˳ʱ + /// + public static DateTime operatorLogoutTime; + + + + + + + /// + /// ֤ ѡ + /// + public static string MaterialVerifySelectField = "֤"; + /// + /// ʵʲ + /// + public static string DayActualCountField = "ʵʲ"; + /// + /// ʵʲ + /// + public static int dayActualCount; + + + /// + /// ռƻ + /// + public static string DayPlanCountField = "ռƻ"; + /// + /// ޱ־ + /// 0 װ 1 Ҫ + /// + public static int isRepairID; + /// + /// ޱ־ + /// + public static string IsRepairIDField = "ޱ־"; + /// + /// ռƻ + /// + public static int dayPlanCount; + + + + + /// + /// ID + /// + public static int ID; + ///// + ///// + ///// + //public static string engineNumberBasicType; + + /// + /// Ϻűȷ + /// + public static int materialIndexConfirm; + /// + /// Ϻȷ + /// + public static string materialNumberConfirm; + /// + /// ȷ(ǿȷ) + /// + public static string barCodeInputForConfirm; + /// + /// Ϻ(ǿȷ) + /// + public static string barCode_MaterialInputForConfirm; + /// + /// (ǿȷ) + /// + public static string barCode_SerailNumberInputForConfirm; + /// + /// ȷ + /// + public static string barCodeConfirm; + /// + /// Ϻȷ + /// + public static string barCode_MaterialConfirm; + /// + /// ȷ + /// + public static string barCode_SerailNumberConfirm; + /// + /// Ϻű + /// + public static int materialIndex; + + /// + /// ֤ + /// ֤ + /// ֤ CheckState.Unchecked 0û֤ + /// ֤ CheckState.Checked 1 Ѿ֤ + /// ֤ CheckState.Indeterminate 2 Ѿǿ֤ + /// + public int materialVerifyResult; + /// + /// ǿ֤ԭ + /// + public static string materialVerifyReason; + + /// + /// Ҫ֤ϱ + /// + /// + public static DataTable MaterialTable() + { + DataTable dt; + DataColumn dc; + dt = new DataTable(); + + // + // Ϻű + // + dc = new DataColumn(MaterialIndexField, typeof(Int32)); + dt.Columns.Add(dc); + + // + // + // + dc = new DataColumn(OrderFormField, typeof(string)); + dt.Columns.Add(dc); + // + // 䳧 + // + dc = new DataColumn(MainPruduceFatoryField, typeof(string)); + dt.Columns.Add(dc); + // + // + // + dc = new DataColumn(EngineNumberField, typeof(string)); + dt.Columns.Add(dc); + // + // ͺŴ + // + dc = new DataColumn(EngineNumberCodeField, typeof(Int32)); + dt.Columns.Add(dc); + // + // λ + // + dc = new DataColumn(OpNameField, typeof(string)); + dt.Columns.Add(dc); + // + // λ + // + dc = new DataColumn(PositionIDNameField, typeof(string)); + dt.Columns.Add(dc); + // + // SAPϺ + // + dc = new DataColumn(SAPMaterialNumberField, typeof(string)); + dt.Columns.Add(dc); + // + // ͺ + // + dc = new DataColumn(EngineNumberTypeField, typeof(string)); + dt.Columns.Add(dc); + // + // + // + dc = new DataColumn(EngineNumberBasicTypeField, typeof(string)); + dt.Columns.Add(dc); + // + // ͻ + // + dc = new DataColumn(CustomesNameField, typeof(string)); + dt.Columns.Add(dc); + // + // Ͷ + // + dc = new DataColumn(PrepareMaterialDateTimeField, typeof(DateTime)); + dt.Columns.Add(dc); + // + // ļ + // + dc = new DataColumn(FileCodeField, typeof(string)); + dt.Columns.Add(dc); + // + // + // + dc = new DataColumn(GroupNameField, typeof(string)); + dt.Columns.Add(dc); + // + // ֪ͨ + // + dc = new DataColumn(NotifyCodeField, typeof(string)); + dt.Columns.Add(dc); + // + // + // + dc = new DataColumn(N_ForceField, typeof(string)); + dt.Columns.Add(dc); + // + // ָļ + // + dc = new DataColumn(DirectFileCodeField, typeof(string)); + dt.Columns.Add(dc); + // + // װ״̬ + // + dc = new DataColumn(WorkEngineStatusField, typeof(DateTime)); + dt.Columns.Add(dc); + // + // ״̬ + // + dc = new DataColumn(AdaptDateTimeField, typeof(string)); + dt.Columns.Add(dc); + // + // װָ + // + dc = new DataColumn(OrderFormDirectField, typeof(string)); + dt.Columns.Add(dc); + // + // + // + dc = new DataColumn(MaterialDescriptField, typeof(string)); + dt.Columns.Add(dc); + // + // ƻ´ + // + dc = new DataColumn(PlanSendedDateTimeField, typeof(DateTime)); + dt.Columns.Add(dc); + // + // Ϻ + // + dc = new DataColumn(MaterialNumberField, typeof(string)); + dt.Columns.Add(dc); + // + // ͼ + // + dc = new DataColumn(PartDrawNumberField, typeof(string)); + dt.Columns.Add(dc); + // + // + // + dc = new DataColumn(PartDrawNameField, typeof(string)); + dt.Columns.Add(dc); + // + // + // + dc = new DataColumn(PartCountField, typeof(Int32)); + dt.Columns.Add(dc); + // + // ֤ + // + dc = new DataColumn(PartCountVerifyField, typeof(Int32)); + dt.Columns.Add(dc); + // + // Ƿɨ + // + dc = new DataColumn(MaterialTraceField, typeof(Int32)); + dt.Columns.Add(dc); + // + // ɨ跽ʽ + // + dc = new DataColumn(MaterialVerifyIDField, typeof(Int32)); + dt.Columns.Add(dc); + // + // Ҵ + // + dc = new DataColumn(ProduceFatoryCodeField, typeof(string)); + dt.Columns.Add(dc); + // + // + // + dc = new DataColumn(ProduceFatoryField, typeof(string)); + dt.Columns.Add(dc); + // + // + // + dc = new DataColumn(BarCodeField, typeof(string)); + dt.Columns.Add(dc); + // + // Ϻ + // + dc = new DataColumn(BarCode_MaterialField, typeof(string)); + dt.Columns.Add(dc); + // + // + // + dc = new DataColumn(BarCode_SerailNumberField, typeof(string)); + dt.Columns.Add(dc); + // + // ֤ + // ֤ + // ֤ CheckState.Unchecked 0û֤ + // ֤ CheckState.Checked 1 Ѿ֤ + // ֤ CheckState.Indeterminate 2 Ѿǿ֤ + // + dc = new DataColumn(MaterialVerifyResultField, typeof(Int32)); + dt.Columns.Add(dc); + // + // ǿ֤ԭ + // + dc = new DataColumn(MaterialVerifyReasonField, typeof(string)); + dt.Columns.Add(dc); + // + // ߹ + // + dc = new DataColumn(OperatorCodeField, typeof(string)); + dt.Columns.Add(dc); + // + // + // + dc = new DataColumn(OperatorNameField, typeof(string)); + dt.Columns.Add(dc); + // + // δ + // + dc = new DataColumn(OperatorShiftField, typeof(string)); + dt.Columns.Add(dc); + + // + // ֤ + // + dc = new DataColumn(MaterialVerifySelectField, typeof(string)); + dt.Columns.Add(dc); + // + // ޱ־ + // + dc = new DataColumn(IsRepairIDField, typeof(int)); + dt.Columns.Add(dc); + + //DataTable dt; + //DataColumn dc; + //dt = new DataTable(); + + return dt; + } + + /// + /// Ҫǿ֤ϱ"֤ = 0" + /// ֤ CheckState.Unchecked 0û֤ + /// ֤ CheckState.Checked 1 Ѿ֤ + /// ֤ CheckState.Indeterminate 2 Ѿǿ֤ + /// + /// + /// + public static DataTable GetVerifyBarCodeTableUnchecked(DataTable dt) + { + DataTable dt_MaterialUnchecked; + DataRow dr; + DataRow[] drs; + dt_MaterialUnchecked = MaterialData.MaterialTable(); + + drs = dt.Select("֤ = 0"); + for (int i = 0; i < drs.Length; i++) + { + dr = dt_MaterialUnchecked.NewRow(); + MaterialTableSetDataRowValue(drs[i], dr); + dt_MaterialUnchecked.Rows.Add(dr); + } + + return dt_MaterialUnchecked; + } + + + + /// + /// ʼϱиֵ + /// + /// + /// + /// + public static void MaterialTableSetDataRowValue(int index, DataRow dr, DataRow drOut) + { + if (dr == null) return; + try + { + // + // Ϻű + // + drOut[MaterialIndexField] = index; + // + // + // + drOut[OrderFormField] = orderForm; + + // + // + // + drOut[EngineNumberField] = engineNumber; + // + // ͺŴ + // + drOut[EngineNumberCodeField] = engineNumberCode; + // + // λ + // + drOut[OpNameField] = opName; + // + // λ + // + drOut[PositionIDNameField] = positionIDName; + // + // Ϻ + // + drOut[MaterialNumberField] = dr[MaterialNumberField]; + // + // ͼ + // + drOut[PartDrawNumberField] = dr[PartDrawNumberField]; + // + // + // + drOut[PartDrawNameField] = dr[PartDrawNameField]; + // + // + // + drOut[PartCountField] = dr[PartCountField]; + // + // + // + drOut[ProduceFatoryField] = dr[ProduceFatoryField]; + // + // Ҵ + // + drOut[ProduceFatoryCodeField] = dr[ProduceFatoryCodeField]; + // + // Ƿɨ + // + drOut[MaterialTraceField] = dr[MaterialTraceField]; + // + // ɨ跽ʽ + // + drOut[MaterialVerifyIDField] = dr[MaterialVerifyIDField]; + + // + // ߹ + // + drOut[OperatorCodeField] = operatorCode; + // + // + // + drOut[OperatorNameField] = operatorName; + // + // δ + // + drOut[OperatorShiftField] = operatorShift; + + // + // ֤ + // ֤ + // ֤ CheckState.Unchecked 0û֤ + // ֤ CheckState.Checked 1 Ѿ֤ + // ֤ CheckState.Indeterminate 2 Ѿǿ֤ + drOut[MaterialVerifyResultField] = 0; + drOut[MaterialVerifyIDField] = dr[MaterialVerifyIDField]; + // + // ǿ֤ԭ + // + drOut[MaterialVerifyReasonField] = ""; + // + drOut[MaterialVerifySelectField] = "ѡ"; + + } + catch + { + //MessageBox.Show(err.Message); + } + + } + /// + /// ϱиֵ + /// + /// + /// + public static void MaterialTableSetDataRowValue(DataRow dr, DataRow drOut) + { + if (dr == null) return; + try + { + // + // Ϻű + // + drOut[MaterialIndexField] = dr[MaterialIndexField]; + // + // + // + drOut[OrderFormField] = dr[OrderFormField]; + + // + // ͺ + // + drOut[EngineNumberField] = dr[EngineNumberField]; + // + // ͺŴ + // + drOut[EngineNumberCodeField] = dr[EngineNumberCodeField]; + // + // λ + // + drOut[OpNameField] = dr[OpNameField]; + // + // λ + // + drOut[PositionIDNameField] = dr[PositionIDNameField]; + // + // Ϻ + // + drOut[MaterialNumberField] = dr[MaterialNumberField]; + // + // ͼ + // + drOut[PartDrawNumberField] = dr[PartDrawNumberField]; + // + // + // + drOut[PartDrawNameField] = dr[PartDrawNameField]; + // + // + // + drOut[PartCountField] = dr[PartCountField]; + // + // ֤ + // + drOut[PartCountVerifyField] = dr[PartCountVerifyField]; + // + // + // + drOut[ProduceFatoryField] = dr[ProduceFatoryField]; + // + // Ҵ + // + drOut[ProduceFatoryCodeField] = dr[ProduceFatoryCodeField]; + // + // + // + drOut[BarCodeField] = dr[BarCodeField]; + // + // Ϻ + // + drOut[BarCode_MaterialField] = dr[BarCode_MaterialField]; + // + // + // + drOut[BarCode_SerailNumberField] = dr[BarCode_SerailNumberField]; + // + // Ƿɨ + // + drOut[MaterialTraceField] = dr[MaterialTraceField]; + // + // ɨ跽ʽ + // + drOut[MaterialVerifyIDField] = dr[MaterialVerifyIDField]; + + // + // ߹ + // + drOut[OperatorCodeField] = dr[OperatorCodeField]; + // + // + // + drOut[OperatorNameField] = dr[OperatorNameField]; + // + // δ + // + drOut[OperatorShiftField] = dr[OperatorShiftField]; + + // + // ֤ + // ֤ + // ֤ CheckState.Unchecked 0û֤ + // ֤ CheckState.Checked 1 Ѿ֤ + // ֤ CheckState.Indeterminate 2 Ѿǿ֤ + drOut[MaterialVerifyResultField] = dr[MaterialVerifyResultField]; + // + // ǿ֤ԭ + // + drOut[MaterialVerifyReasonField] = dr[MaterialVerifyReasonField]; + //֤ + //drOut[MaterialVerifySelectField] = dr[MaterialVerifySelectField]; + + } + catch + { + + //MessageBox.Show(err.Message); + } + + } + + /// + /// indexжӦ + /// + /// + public void MaterialTable(int index) + { + DataTable dt = dt_Material_Verify; + DataRow[] dr; + dr = dt.Select(MaterialIndexField + "= " + index.ToString()); + if (dr == null) return; + + // + // Ϻű + // + materialIndex = (int)dr[0][MaterialIndexField]; + // + // + // + orderForm = dr[0][OrderFormField].ToString(); + + // + // ͺ + // + engineNumber = dr[0][EngineNumberField].ToString(); + // + // ͺŴ + // + engineNumberCode = (int)dr[0][EngineNumberCodeField]; + // + // λ + // + opName = dr[0][OpNameField].ToString(); + // + // λ + // + positionIDName = dr[0][PositionIDNameField].ToString(); + // + // Ϻ + // + materialNumber = dr[0][MaterialNumberField].ToString(); + // + // ͼ + // + partDrawNumber = dr[0][PartDrawNumberField].ToString(); + // + // + // + partDrawName = dr[0][PartDrawNameField].ToString(); + // + // + // + partCount = (int)dr[0][PartCountField]; + // + // ֤ + // + partCountVerify = (int)dr[0][PartCountVerifyField]; + // + // + // + produceFatory = dr[0][ProduceFatoryField].ToString(); + // + // Ҵ + // + produceFatoryCode = dr[0][ProduceFatoryCodeField].ToString(); + // + // + // + barCode = dr[0][BarCodeField].ToString(); + // + // Ϻ + // + barCode_Material = dr[0][BarCode_MaterialField].ToString(); + // + // + // + barCode_SerailNumber = dr[0][BarCode_SerailNumberField].ToString(); + // + // Ƿɨ + // + materialTrace = (int)dr[0][MaterialTraceField]; + // + // ɨ跽ʽ + // + materialVerifyID = (int)dr[0][MaterialVerifyIDField]; + // + // ߹ + // + operatorCode = dr[0][OperatorCodeField].ToString(); + // + // + // + operatorName = dr[0][OperatorNameField].ToString(); + // + // δ + // + operatorShift = dr[0][OperatorShiftField].ToString(); + + // + // ֤ + // ֤ + // ֤ CheckState.Unchecked 0û֤ + // ֤ CheckState.Checked 1 Ѿ֤ + // ֤ CheckState.Indeterminate 2 Ѿǿ֤ + materialVerifyResult = (int)dr[0][MaterialVerifyResultField]; + // + // ǿ֤ԭ + // + materialVerifyReason = dr[0][MaterialVerifyReasonField].ToString(); + + } + /// + /// ֽ룬Ϻź + /// M/13009130/6800811001 + /// + /// + /// _Ϻ + /// _ + public static void SplitBarCode(string barCode, out string barCode_Material, out string barCode_SerailNumber) + { + barCode_Material = null; + barCode_SerailNumber = null; + try + { + string[] str = barCode.Split('/'); + if (str != null) + { + if (str.Length >= 2) + { + try + { + barCode_Material = str[1]; + } + catch { barCode_Material = ""; } + try + { + barCode_SerailNumber = str[2]; + } + catch { barCode_SerailNumber = ""; } + } + } + + } + catch + { + //MessageBox.Show(err.Message); + + } + } + + ///// + ///// + ///// + //public static void CreateMaterialTableForSave() + //{ + // DataTable dt; + // DataColumn dc; + // dt = new DataTable(); + + // /// + // /// + // /// + // dc = new DataColumn(OrderFormField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// 䳧 + // /// + // dc = new DataColumn(MainPruduceFatoryField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// + // /// + // dc = new DataColumn(EngineNumberField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// ͺŴ + // /// + // dc = new DataColumn(EngineNumberCodeField, typeof(Int32)); + // dt.Columns.Add(dc); + // /// + // /// λ + // /// + // dc = new DataColumn(OpNameField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// λ + // /// + // dc = new DataColumn(PositionIDNameField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// SAPϺ + // /// + // dc = new DataColumn(SAPMaterialNumberField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// ͺ + // /// + // dc = new DataColumn(EngineNumberTypeField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// + // /// + // dc = new DataColumn(EngineNumberBasicTypeField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// ͻ + // /// + // dc = new DataColumn(CustomesNameField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// Ͷ + // /// + // dc = new DataColumn(PrepareMaterialDateTimeField, typeof(DateTime)); + // dt.Columns.Add(dc); + // /// + // /// ļ + // /// + // dc = new DataColumn(FileCodeField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// + // /// + // dc = new DataColumn(GroupNameField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// ֪ͨ + // /// + // dc = new DataColumn(NotifyCodeField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// + // /// + // dc = new DataColumn(N_ForceField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// ָļ + // /// + // dc = new DataColumn(DirectFileCodeField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// װ״̬ + // /// + // dc = new DataColumn(WorkEngineStatusField, typeof(DateTime)); + // dt.Columns.Add(dc); + // /// + // /// ״̬ + // /// + // dc = new DataColumn(AdaptDateTimeField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// װָ + // /// + // dc = new DataColumn(OrderFormDirectField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// + // /// + // dc = new DataColumn(MaterialDescriptField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// ƻ´ + // /// + // dc = new DataColumn(PlanSendedDateTimeField, typeof(DateTime)); + // dt.Columns.Add(dc); + // /// + // /// Ϻ + // /// + // dc = new DataColumn(MaterialNumberField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// ͼ + // /// + // dc = new DataColumn(PartDrawNumberField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// + // /// + // dc = new DataColumn(PartDrawNameField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// + // /// + // dc = new DataColumn(PartCountField, typeof(Int32)); + // dt.Columns.Add(dc); + // /// + // /// ֤ + // /// + // dc = new DataColumn(PartCountVerifyField, typeof(Int32)); + // dt.Columns.Add(dc); + // dt.Columns.Add(dc); + // /// + // /// Ƿɨ + // /// + // dc = new DataColumn(MaterialTraceField, typeof(Int32)); + // dt.Columns.Add(dc); + // /// + // /// ɨ跽ʽ + // /// + // dc = new DataColumn(MaterialVerifyIDField, typeof(Int32)); + // dt.Columns.Add(dc); + // /// + // /// Ҵ + // /// + // dc = new DataColumn(ProduceFatoryCodeField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// + // /// + // dc = new DataColumn(ProduceFatoryField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// + // /// + // dc = new DataColumn(BarCodeField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// Ϻ + // /// + // dc = new DataColumn(BarCode_MaterialField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// + // /// + // dc = new DataColumn(BarCode_SerailNumberField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// ֤ + // /// ֤ + // /// ֤ CheckState.Unchecked 0û֤ + // /// ֤ CheckState.Checked 1 Ѿ֤ + // /// ֤ CheckState.Indeterminate 2 Ѿǿ֤ + // /// + // dc = new DataColumn(MaterialVerifyResultField, typeof(Int32)); + // dt.Columns.Add(dc); + // /// + // /// ǿ֤ԭ + // /// + // dc = new DataColumn(MaterialVerifyReasonField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// ߹ + // /// + // dc = new DataColumn(OperatorCodeField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// + // /// + // dc = new DataColumn(OperatorNameField, typeof(string)); + // dt.Columns.Add(dc); + // /// + // /// δ + // /// + // dc = new DataColumn(OperatorShiftField, typeof(string)); + // dt.Columns.Add(dc); + + // MaterialTableForSave = dt; + //} + + + + /// + /// ǷҪ֤ + /// ֵ false ûȫ֤ɣҪ֤ + /// ֵ true ȫ֤ɣҪ֤ + /// ֤ CheckState.Unchecked 0û֤ + /// ֤ CheckState.Checked 1 Ѿ֤ + /// ֤ CheckState.Indeterminate 2 Ѿǿ֤ + /// + /// + public static bool CheckVeriftBarCode() + { + DataTable dt; + bool check = true; + + //dt = dt_Material_Verify; + dt = MaterialData.dt_Material_Verify;//.dt_Material_Verify; + if (dt == null) return check; + for (int i = 0; i < dt.Rows.Count; i++) + { + if ((int)dt.Rows[i]["֤"] == 0) + { + check = false; + break; + } + } + return check; + } + + /// + /// ݱ + /// TagIDλãĿֵϸ־ + /// + public static DataTable QualityTable() + { + DataTable dt; + DataColumn dc; + dt = new DataTable(); + + // Ϻű + dc = new DataColumn("TagID", typeof(string)); + dt.Columns.Add(dc); + dc = new DataColumn("λ", typeof(string)); + dt.Columns.Add(dc); + dc = new DataColumn("λ", typeof(string)); + dt.Columns.Add(dc); + + dc = new DataColumn("Ŀ", typeof(string)); + dt.Columns.Add(dc); + dc = new DataColumn("ֵ", typeof(double)); + dt.Columns.Add(dc); + dc = new DataColumn("ϸ־", typeof(Int32)); + dt.Columns.Add(dc); + return dt; + } + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/MES/vssver2.scc b/Common/07WebBusinessFacade/BusinessFacade/MES/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..ec506c7822145c622638c8aa54b7fee1fc362a0f GIT binary patch literal 981 zcmXpJVq~~_m%l5bInsUAj6{**Nns+JcXhmwVq#zrW?*2D2GRvH4{VqbbyA-Z$d>`~ zclR&W^O%1M%$Ei7rx!((N=!Zh=F0*3pP28Pag;##@<6`AK7M@F23SkY9Zxlksn8S}s@SFwfR|WD< zT$%BIhRYc+Uk%7_idvyv5d@J}2lB1#kNR}TLgY1o{Ka=NAK$nE;cEi2gt8#?B(=$1>x%g`TwHDFRifn1eRCP_w@`e zPfdbRPNl_}d8x(4Zi&f>DXIFtuE7jWiN&cdi6x1_mBl5gxj+#;$KvAD+@ze!fW)Gb zkfOxoRK4V4qLc-t79?gCVOQ;p-!QB;xFzNkr}~$r7P;qRH`Fb&sJO(xz%MZuha0_9 z!M@Og(lDQeq~;ccBqrtH(B+e#o|%W;M&HDe)S}G99G}eM68tK{fa=mJeG~H%(^GR( z^Khw7Eym|T-_+vZ)FNOA;IPZzDH6L(Kv8~5X>zJ_ekm@SgG-ZqfN23==!NGOWd~=Z irh?rL^EoK3fb0aN6sOE8J?H$qw9Is55tvF?7y$qZ?>sgD literal 0 HcmV?d00001 diff --git a/Common/07WebBusinessFacade/BusinessFacade/Properties/AssemblyInfo.cs b/Common/07WebBusinessFacade/BusinessFacade/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..86b7010 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("BusinessFacade")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BusinessFacade")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("f0a0c525-03fd-428a-9b17-7f54aa0e4475")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Common/07WebBusinessFacade/BusinessFacade/SyPartLoad/EngineIDCode.cs b/Common/07WebBusinessFacade/BusinessFacade/SyPartLoad/EngineIDCode.cs new file mode 100644 index 0000000..34cb183 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/SyPartLoad/EngineIDCode.cs @@ -0,0 +1,230 @@ +using System; +using System.Data; +using System.Data.SqlClient; + +using System.Collections; +using System.Collections.Specialized; +//using SystemFramework; +using DataLinkMesWork; +namespace SystemFramework +{ + +} +namespace bizFacade +{ + /// + /// 电子看板信息系统 + /// select 重量1,重量2,重量差,允许重量差,合格标志 + /// + public partial class BaseDataSystemMES + { + + /// + /// 电子看板_发动机号_分线组件装配关系_增加 + /// + /// + /// + /// + /// + //static public void MailLineAndSubLineData_InsertAAAAA(string engineID, int engineTypeID, string engineType, string engineID_SubLine) + //{ + // string procedureName; + // procedureName = "电子看板_发动机号_分线组件装配关系_增加"; + // SqlParameter[] thisParms = new SqlParameter[4]; + // thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号_分线", engineID_SubLine); + // thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + // thisParms[2] = new System.Data.SqlClient.SqlParameter("@机型代码", engineTypeID); + // thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + // DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + //} + + /// + /// 思源库位管理_查询 + /// + /// + /// + /// + static public void GetUpLoadBarCode(string opName, out DataTable dt) + { + string procedureName; + procedureName = "思源库位管理_查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + /// + /// [思源库位管理_下线库位_根据机型_查询] + /// + /// + /// + /// + static public void GetUpLoadWarehouseNoOpName02(string opName,string EngineIDType, out DataTable dt) + { + string procedureName; + procedureName = "思源库位管理_下线库位_根据机型_查询"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机型号", EngineIDType); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + /// + /// 思源库位管理_下线库位查询 [思源库位管理_下线库位_根据机型_查询] + /// + /// + /// + /// + static public void GetUnLoadWarehouseNo(string opName, out DataTable dt) + { + string procedureName; + procedureName = "思源库位管理_下线库位查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + //[思源库位管理_上线发动机号订单号查询] + static public void GetUpLoadEngineIDOrderForm(string opName,string kuweihao, out DataTable dt) + { + string procedureName; + procedureName = "[思源库位管理_上线发动机号订单号查询]"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@库位号", kuweihao); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + static public void UpdateKuWeiStatus(string opName, string kuweihao) + { + string procedureName; + procedureName = "[思源库位管理_上线更新状态_修改]"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@库位号", kuweihao); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + static public void GetUpLoadBarCodeEngineID(string opName, out DataTable dt) + { + string procedureName; + procedureName = "[思源库位管理_上线发动机号查询]"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + static public void ClearOpCarData(string opName) + { + string procedureName; + procedureName = "[思源库位管理_清空所有库位数据]"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + // ALTER PROCEDURE[dbo].[思源库位管理_修改] + // @条码 nvarchar(50), + //@ nvarchar(50)=NULL, + //@ nvarchar(50), + //@ nvarchar(50), + + //@工位号 nvarchar(50), + //@库位号 nvarchar(50) + static public void GetUpLoadBarCode_Update(string opName,string kuweiNum ,string barCode,string orderForm, + string EngineID, string EngineIDType, int typeID) + { + string procedureName; + procedureName = "思源库位管理_修改"; + SqlParameter[] thisParms = new SqlParameter[7]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@库位号", kuweiNum); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@条码", barCode); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@订单号", orderForm); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@发动机型号", EngineIDType); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@机型代码", typeID); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + static public void GetUpLoadBarCode_0utUpdate(string opName, string kuweiNum) + { + string procedureName; + procedureName = "思源库位管理_出库修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@库位号", kuweiNum); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 上线工位 扫面零件码 判断是否当前要加工的零件 + /// + /// + /// + static public void CheckUpLoadPart(string partCode, string scanPosition, out DataTable dt) + { + string procedureName; + procedureName = "SY_MES_计划BOM_判断工件是否匹配"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@partCode", partCode); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@抓取位置", scanPosition); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + /// + /// 线首工位自动查找生产订单 + /// + /// + static public void GetUpLoadPart(out DataTable dt) + { + string procedureName; + procedureName = "SY_MES_计划BOM_线首工位自动查找生产订单"; + SqlParameter[] thisParms = new SqlParameter[0]; + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + /// + /// 查询工位最大盆子数量 + /// + /// + /// + static public void GetMaxPartCount(string OpName, out DataTable dt) + { + string procedureName; + procedureName = "测量数据发动机在线状态_工位绑定与上线盆子数"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + /// + /// 测量数据发动机在线状态_与订单数比对 + /// + /// + /// + static public void GetStartGoCount(out DataTable dt) + { + string procedureName; + procedureName = "测量数据发动机在线状态_与订单数比对"; + SqlParameter[] thisParms = new SqlParameter[0]; + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + static public void UpdateOrderStatus(string orderCode) + { + string procedureName; + procedureName = "SY_MES_计划BOM_更新订单生产状态"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@订单号", orderCode); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + //static public void SubLineLoadPartCountMatch_Select(string opName, out int SubLineLoadPartCountMatch) + //{ + // string procedureName; + // DataTable dt; + // procedureName = "MES_计划BOM_工位与名称_工步属性查询"; + // SqlParameter[] thisParms = new SqlParameter[1]; + // thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + // DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + // if(dt.Rows.Count>0) + // { + // SubLineLoadPartCountMatch = Convert.ToInt32(dt.Rows[0][0]); + // } + // else + // { + // SubLineLoadPartCountMatch = 0; + // } + //} + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/Web.New/MES1.cs b/Common/07WebBusinessFacade/BusinessFacade/Web.New/MES1.cs new file mode 100644 index 0000000..39e8147 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/Web.New/MES1.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Security.Cryptography; +//using SystemFramework; + +namespace bizFacade +{ + public partial class MES1 + { + /// + /// 北汽福田工位状态监控MOBY_查询_订单下达用 + /// + /// + /// + /// + public static void Moby_Select_FirstOpName(string opName, out string OrderForm, + out int EngineTypeID, out string EngineType, out string EngineID, out string PartPallet_Code, + out int IsrepairBarcode, out string repairBarcode, out string EngineTypeString) + { + DataTable dt = new DataTable(); + OrderForm = ""; + EngineTypeID = 0; + EngineType = ""; + EngineID = ""; + PartPallet_Code = ""; + IsrepairBarcode = 0; + repairBarcode = ""; + EngineTypeString = ""; + try + { + string procedureName; + procedureName = "北汽福田工位状态监控MOBY_查询_订单下达用"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + if (dt.Rows.Count > 0) + { + OrderForm = dt.Rows[0][MobyTagType.OrderForm_MES].ToString(); + EngineTypeID = Convert.ToInt32(dt.Rows[0][MobyTagType.EngineTypeID_MES]); ; + EngineType = dt.Rows[0][MobyTagType.EngineType_MES].ToString(); + EngineID = dt.Rows[0][MobyTagType.EngineID_MES].ToString(); + PartPallet_Code = dt.Rows[0][MobyTagType.PartPallet_Code].ToString(); + EngineTypeString = dt.Rows[0][MobyTagType.EngineTypeBasic].ToString(); + } + } + catch + { + OrderForm = ""; + EngineTypeID = 0; + EngineType = ""; + EngineID = ""; + PartPallet_Code = ""; + IsrepairBarcode = 0; + repairBarcode = ""; + EngineTypeString = ""; + } + } + /// + /// 普通工位,非上线工位 + /// 北汽福田工位状态监控MOBY_查询_订单下达用 + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static void Moby_Select(string opName, out string OrderForm, + out int EngineTypeID, out string EngineType, out string EngineID, out string PartPallet_Code, + out int IsrepairBarcode, out string repairBarcode, out string EngineTypeString, int type = 1) + { + DataTable dt = new DataTable(); + OrderForm = ""; + EngineTypeID = 0; + EngineType = ""; + EngineID = ""; + PartPallet_Code = ""; + IsrepairBarcode = 0; + repairBarcode = ""; + EngineTypeString = ""; + try + { + string procedureName; + procedureName = "北汽福田工位状态监控MOBY_查询_订单下达用"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + if (dt.Rows.Count > 0) + { + OrderForm = dt.Rows[0][MobyTagType.OrderForm_MES].ToString(); + EngineTypeID = Convert.ToInt32(dt.Rows[0][MobyTagType.EngineTypeID_MES]); ; + EngineType = dt.Rows[0][MobyTagType.EngineType_MES].ToString(); + EngineID = dt.Rows[0][MobyTagType.EngineID_MES].ToString(); + PartPallet_Code = dt.Rows[0][MobyTagType.PartPallet_Code].ToString(); + EngineTypeString = dt.Rows[0][MobyTagType.EngineTypeBasic].ToString(); + } + } + catch + { + OrderForm = ""; + EngineTypeID = 0; + EngineType = ""; + EngineID = ""; + PartPallet_Code = ""; + IsrepairBarcode = 0; + repairBarcode = ""; + EngineTypeString = ""; + } + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/Web/Buttons.cs b/Common/07WebBusinessFacade/BusinessFacade/Web/Buttons.cs new file mode 100644 index 0000000..4ec33ce --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/Web/Buttons.cs @@ -0,0 +1,225 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Security.Cryptography; +//using SystemFramework; + +namespace bizFacade +{ + public class Buttons + { + /// + /// + /// + /// + /// + public static string Createbuttons(DataTable dt)//相当于在该DIV内动态画table + { + StringBuilder sb = new StringBuilder();//动态分配长度 + if (dt != null) + { + if (dt.Rows.Count > 0) + { + sb.Append(""); + for (int i = 0; i < dt.Rows.Count; i++) + { + //标签id + string id = "button_OPs" + dt.Rows[i]["工位号"].ToString(); + + //标签类型 + string type = "button"; + + //标签样式 + string style = "height:98%;width:98%;font-family:微软雅黑;font-size:15px;border-color: #99CCFF"; + + string style_td = "width:20%; height:35px"; + + //标签值 + string value = dt.Rows[i]["工位号"].ToString(); + + //标签点击事件 + string onclick = "QualityDataSelect(value)"; + + string bgc = "background-color: #CCCCCC";//默认按钮背景色 + if (dt.Rows[i]["合格标志"].ToString() == "NOK") + { + bgc = "background-color: red"; + } + else if (dt.Rows[i]["合格标志"].ToString() == "OK") + { + bgc = "background-color: green"; + } + else + { + bgc = "background-color: #CCCCCC"; + } + //对行按钮数进行处理,保证五个换行 + if (i % 4 == 3) + { + + sb.Append(""); + sb.Append("\r\n"); + } + else + { + sb.Append(""); + } + } + sb.Append("
"); + } + } + return sb.ToString(); + } + + public static string CreateNewbuttons(DataTable dt)//相当于在该DIV内动态画table + { + StringBuilder sb = new StringBuilder();//动态分配长度 + if (dt != null) + { + if (dt.Rows.Count > 0) + { + sb.Append(""); + for (int i = 0; i < dt.Rows.Count; i++) + { + //标签id + string id = "button_OPs" + dt.Rows[i]["工位号"].ToString(); + + //标签类型 + string type = "button"; + + //标签样式 + string style = "height:98%;width:98%;font-family:微软雅黑;font-size:15px;border-color: #99CCFF"; + + string style_td = "width:15%; height:30px"; + + //标签值 + string value = dt.Rows[i]["工位号"].ToString(); + + //标签点击事件 + string onclick = "QualityDataSelect(value)"; + + string bgc = "background-color: #CCCCCC";//默认按钮背景色 + if (dt.Rows[i]["合格标志"].ToString() == "NOK") + { + bgc = "background-color: red"; + } + else if (dt.Rows[i]["合格标志"].ToString() == "OK") + { + bgc = "background-color: green"; + } + else + { + bgc = "background-color: #CCCCCC"; + } + //对行按钮数进行处理,保证五个换行 + if (i % 5 == 4) + { + + sb.Append(""); + sb.Append("\r\n"); + } + else + { + sb.Append(""); + } + } + sb.Append("
"); + } + } + return sb.ToString(); + } + /// + /// 物料原因模块按钮创建 + /// + /// + /// + public static string CreateMaterialsButtons(DataTable dt) + { + StringBuilder sb = new StringBuilder(); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + sb.Append(""); + for (int i = 0; i < dt.Rows.Count; i++) + { + string id = (string)dt.Rows[i]["id"]; + string type = (string)dt.Rows[i]["type"]; + string style = (string)dt.Rows[i]["style"]; + string value = (string)dt.Rows[i]["零件名称"]; + string onclick = (string)dt.Rows[i]["onclick"]; + string bgc = "";//默认按钮背景色 + sb.Append(""); + } + sb.Append("
"); + } + } + return sb.ToString(); + } + /// + /// + /// + /// + /// + public static string Createbuttons_alert(DataTable dt)//相当于在该DIV内动态画table + { + StringBuilder sb = new StringBuilder();//动态分配长度 + if (dt != null) + { + if (dt.Rows.Count > 0) + { + sb.Append(""); + for (int i = 0; i < dt.Rows.Count; i++) + { + //标签id + string id = "button_OPs" + dt.Rows[i]["工位号"].ToString(); + + //标签类型 + string type = "button"; + + //标签样式 + string style = "height:40px;line-height:35px;width:98%;font-family:'微软雅黑';font-size:15px;border-color:#99CCFF"; + + string style_td = "width:20%; height:35px"; + + //标签值 + string value = dt.Rows[i]["工位号"].ToString(); + + //标签点击事件 + string onclick = "QualityDataSelect_alert(value)"; + + string bgc = "background-color: #CCCCCC";//默认按钮背景色 + if (dt.Rows[i]["合格标志"].ToString() == "NOK") + { + bgc = "background-color: red"; + } + else if (dt.Rows[i]["合格标志"].ToString() == "OK") + { + bgc = "background-color: green"; + } + else + { + bgc = "background-color: #CCCCCC"; + } + //对行按钮数进行处理,保证五个换行 + if (i % 4 == 3) + { + + sb.Append(""); + sb.Append("\r\n"); + } + else + { + sb.Append(""); + } + } + sb.Append("
"); + } + } + return sb.ToString(); + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/Web/Login.cs b/Common/07WebBusinessFacade/BusinessFacade/Web/Login.cs new file mode 100644 index 0000000..0ad092c --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/Web/Login.cs @@ -0,0 +1,237 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Security.Cryptography; +//using SystemFramework; + +namespace bizFacade +{ + public class UserLogin + { + /// + /// 登陆者查询_Easyui + /// + /// 登陆名 + /// 密码 + /// + /// + public static bool Getlogin(string opName, string message, out int IsSuccess) + { + IsSuccess = 0; + string produceName = "MES_用户管理_人员登录_扫码"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@条码", message); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@是否符合", IsSuccess); + thisParms[2].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + IsSuccess = Convert.ToInt32(thisParms[2].Value); + return true; + } + return false; + } + + + public static void GetUrl(string opname, out DataTable tb) + { + string sql = "SELECT TOP 1 [WebHtml],[工位号],[工步属性],[服务器IP],[通讯端口] FROM [dbo].[MES_计划BOM_工位与名称_视图] WHERE [工位号]='" + opname + "'"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + tb = null; + DataAccess.ExecuteDataTable(sql, out tb); + } + public static bool ConfirmClass(string classes, out string confirmclass) + { + string procedureName = "AMES_物料拉动_人员班组管理_班次信息_查询"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + confirmclass = ""; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new SqlParameter("@班次", SqlDbType.NVarChar, 50); + sqlParameters[0].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters)) + { + confirmclass = sqlParameters[0].Value.ToString(); + return true; + } + return false; + } + public static void ClassName_Select(string ClassCode, out DataTable dt) + { + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + string sql; + sql = "SELECT top 1 班次描述 FROM [dbo].[AMES_物料拉动_人员班组管理_班次信息] WHERE [班次代码]='" + ClassCode + "'"; + dt = null; + DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// 修改新密码 + /// + /// + /// + public static void updatePassWord(string userName, string passWord, out DataTable tb) + { + string sql = "update [dbo].[MES_用户管理_人员] set 密码='" + passWord + "' WHERE [用户名]='" + userName + "'"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + tb = null; + DataAccess.ExecuteDataTable(sql, out tb); + } + /// + /// 登陆界面设置窗口提交 + /// + /// + /// + public static void InitLoginCombobox(string clientIp,out DataTable tb) + { + string sql = "SELECT [工位代码],[工位号] FROM [dbo].[MES_计划BOM_工位与名称_视图] WHERE [工控机IP]='" + clientIp + "'"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + tb = null; + DataAccess.ExecuteDataTable(sql, out tb); + } + + + /// + /// 登陆界面设置窗口提交 + /// + /// + /// + public static void submitSetOk(string opNum,string opName,string serverIp,string serverPort,string manchineIp, out DataTable tb) + { + string sql = "update [dbo].[MES_计划BOM_工位与名称] set 工位代码='" + opNum + "',工控机IP='" + manchineIp + "',工位号='" + opName + "',服务器IP='" + serverIp + "',通讯端口='" + serverPort + "' WHERE [工位号]='" + opName + "'"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + tb = null; + DataAccess.ExecuteDataTable(sql, out tb); + } + /// + /// 初始化设置串口的工位号 + /// + /// + public static void InitSetCombobox(out DataTable tb) + { + string sql = "SELECT [工位代码],[工位号] FROM [dbo].[MES_计划BOM_工位与名称_视图]"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + tb = null; + DataAccess.ExecuteDataTable(sql, out tb); + } + /// + /// 登陆者查询_Easyui + /// + /// 登陆名 + /// 密码 + /// + /// + public static bool loginUserSelect(string loginUser, string passWord, out DataTable tb) + { + string procedureName = "登陆者查询_Easyui"; + //string connectionString = ApplicationConfig.ConnectionString_MES; + DataSet ds; + string errorMessage; + bool isOK; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@登陆名", loginUser); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@密码", passWord); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out ds); + if (isOK) + { + tb = ds.Tables[0]; + return true; + } + else + { + tb = null; + return false; + } + + } + + + + + public static void ClassCode_Select(string ClassName, out DataTable dt) + { + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + string sql; + sql = "SELECT top 1 班次代码 FROM AMES_物料拉动_人员班组管理_班次信息 WHERE [班次描述]='" + ClassName + "'"; + dt = null; + DataAccess.ExecuteDataTable(sql, out dt); + } + + + /// + /// 查询是否登录过 + /// + /// + /// + /// + public static void SearchUrl(string opname, out DataTable dt) + { + string procedureName; + procedureName = "测量数据工位_监控系统_操作者工号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + + + /// + /// [测量数据工位_监控系统_员工在线信息表_员工下线] + /// + /// + /// + /// + /// + /// + /// + /// + public static bool Getoff_WorkingHours(string Opname, string OperatorName, string OperatorManger, string Password, int Type, out string Msg) + { + string procedureName = "AMES_物料拉动_测量数据工位_监控系统_员工在线信息表_员工下线"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + Msg = ""; + SqlParameter[] sqlParameters = new SqlParameter[6]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@操作者工号", OperatorName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@管理者工号", OperatorManger); + sqlParameters[2] = new System.Data.SqlClient.SqlParameter("@工位号", Opname); + sqlParameters[3] = new System.Data.SqlClient.SqlParameter("@密码", Password); + sqlParameters[4] = new System.Data.SqlClient.SqlParameter("@下线类型", Type); + sqlParameters[5] = new SqlParameter("@Result", SqlDbType.NVarChar, 50); + sqlParameters[5].Direction = ParameterDirection.Output; + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters)) + { + Msg = sqlParameters[5].Value.ToString(); + return true; + } + + return false; + + + } + /// + /// 查询班次 + /// + /// + public static void Getclasses(out DataTable tb) + { + string sql = "SELECT [班次代码],[班次描述] FROM [dbo].[AMES_物料拉动_人员班组管理_班次信息] ORDER BY 班次代码 "; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + tb = null; + DataAccess.ExecuteDataTable(sql, out tb); + } + + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/Web/MES.Functions.cs b/Common/07WebBusinessFacade/BusinessFacade/Web/MES.Functions.cs new file mode 100644 index 0000000..563baf7 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/Web/MES.Functions.cs @@ -0,0 +1,656 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Security.Cryptography; +//using SystemFramework; +using System.Web; +using Microsoft.SqlServer.Server; + +namespace bizFacade +{ + public partial class MES + { + /// + /// 测量数据工位_监控系统_MOBY_查询 + /// + /// + /// + /// + public static void Moby_Select(string opName, out string orderNum, + out int EngineTypeID, out string EngineType, out string EngineID, out string PartPallet_Code, + out int IsrepairBarcode, out string repairBarcode, + out string workCode,out string projectName,out string splitCode,out string unidCode, out string engineType,out string engineTypeModel,out string startTime) + { + orderNum = ""; + EngineTypeID = 0; + EngineType = ""; + EngineID = ""; + PartPallet_Code = ""; + IsrepairBarcode = 0; + repairBarcode = ""; + workCode = ""; // 制造编号 + projectName = ""; // 项目名称 + splitCode = ""; // 间隔号 + unidCode = ""; // 单元号 + engineType = ""; // 本体类型 + engineTypeModel = ""; // 附件类型 + startTime = ""; // 开始时间 + + try + { + string procedureName; + procedureName = "测量数据工位_监控系统_MOBY_查询"; + SqlParameter[] thisParms = new SqlParameter[15]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", SqlDbType.NVarChar, 50, "订单号"); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@产品型号代码", SqlDbType.Int, 4, "产品型号代码"); + thisParms[2].Direction = ParameterDirection.Output; + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", SqlDbType.NVarChar, 50, "发动机型号"); + thisParms[3].Direction = ParameterDirection.Output; + thisParms[4] = new System.Data.SqlClient.SqlParameter("@发动机号", SqlDbType.NVarChar, 50, "发动机号"); + thisParms[4].Direction = ParameterDirection.Output; + thisParms[5] = new System.Data.SqlClient.SqlParameter("@托盘号", SqlDbType.NVarChar, 50, "托盘号"); + thisParms[5].Direction = ParameterDirection.Output; + thisParms[6] = new System.Data.SqlClient.SqlParameter("@拆解标志", SqlDbType.Int, 4, "拆解标志"); + thisParms[6].Direction = ParameterDirection.Output; + thisParms[7] = new System.Data.SqlClient.SqlParameter("@拆解返修条码", SqlDbType.NVarChar, 50, "拆解返修条码"); + thisParms[7].Direction = ParameterDirection.Output; + thisParms[8] = new System.Data.SqlClient.SqlParameter("@制造编号", SqlDbType.NVarChar, 50, "制造编号"); + thisParms[8].Direction = ParameterDirection.Output; + thisParms[9] = new System.Data.SqlClient.SqlParameter("@间隔号", SqlDbType.NVarChar, 50, "间隔号"); + thisParms[9].Direction = ParameterDirection.Output; + thisParms[10] = new System.Data.SqlClient.SqlParameter("@单元号", SqlDbType.NVarChar, 50, "单元号"); + thisParms[10].Direction = ParameterDirection.Output; + thisParms[11] = new System.Data.SqlClient.SqlParameter("@项目名称", SqlDbType.NVarChar, 50, "项目名称"); + thisParms[11].Direction = ParameterDirection.Output; + thisParms[12] = new System.Data.SqlClient.SqlParameter("@本体类型", SqlDbType.NVarChar, 50, "本体类型"); + thisParms[12].Direction = ParameterDirection.Output; + thisParms[13] = new System.Data.SqlClient.SqlParameter("@附件类型", SqlDbType.NVarChar, 50, "附件类型"); + thisParms[13].Direction = ParameterDirection.Output; + thisParms[14] = new System.Data.SqlClient.SqlParameter("@开始时间", SqlDbType.NVarChar, 50, "开始时间"); + thisParms[14].Direction = ParameterDirection.Output; + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + if (thisParms[1].Value != null && thisParms[2].Value != null && thisParms[3].Value != null && thisParms[4].Value != null && thisParms[5].Value != null && thisParms[6].Value != null && thisParms[7].Value != null) + { + orderNum = thisParms[1].Value.ToString(); + EngineTypeID = Convert.ToInt32(thisParms[2].Value); ; + EngineType = thisParms[3].Value.ToString(); + EngineID = thisParms[4].Value.ToString(); + PartPallet_Code = thisParms[5].Value.ToString(); + IsrepairBarcode = Convert.ToInt32(thisParms[6].Value); + repairBarcode = thisParms[7].Value.ToString(); + workCode = thisParms[8].Value.ToString(); // 制造编号 + projectName = thisParms[9].Value.ToString(); // 项目名称 + splitCode = thisParms[10].Value.ToString();// 间隔号 + unidCode = thisParms[11].Value.ToString(); // 单元号 + engineType = thisParms[12].Value.ToString(); // 本体类型 + engineTypeModel = thisParms[13].Value.ToString(); // 附件类型 + startTime = thisParms[14].Value.ToString(); // 开始时间 + } + } + catch + { + orderNum = ""; + EngineTypeID = 0; + EngineType = ""; + EngineID = ""; + PartPallet_Code = ""; + IsrepairBarcode = 0; + repairBarcode = ""; + workCode = ""; // 制造编号 + projectName = ""; // 项目名称 + splitCode = ""; // 间隔号 + unidCode = ""; // 单元号 + engineType = ""; // 本体类型 + engineTypeModel = ""; // 附件类型 + } + } + + /// + /// 基本数据_工作日历_班次产量查询_Web页面显示_初始化查询 + /// + /// + /// + /// + public static void InitOpNameOuputCount(string opName, out int outputValue, out int nowOutputValue, + out int opNameBeatValue, out int NowOpNameBeatValue, out int classNumber) + { + outputValue = 0;//工位产量 + nowOutputValue = 0;//在线产量 + opNameBeatValue = 0;//工位节拍 + NowOpNameBeatValue = 0;//在线节拍 + classNumber = 0;//班次 + try + { + string procedureName; + procedureName = "Web页面显示_计划产量初始化查询"; + SqlParameter[] thisParms = new SqlParameter[6]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位产量", SqlDbType.Int, 4, "工位产量"); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@工位节拍", SqlDbType.Int, 4, "工位节拍"); + thisParms[2].Direction = ParameterDirection.Output; + thisParms[3] = new System.Data.SqlClient.SqlParameter("@在线产量", SqlDbType.Int, 4, "在线产量"); + thisParms[3].Direction = ParameterDirection.Output; + thisParms[4] = new System.Data.SqlClient.SqlParameter("@在线节拍", SqlDbType.Int, 4, "在线节拍"); + thisParms[4].Direction = ParameterDirection.Output; + thisParms[5] = new System.Data.SqlClient.SqlParameter("@班次代码", SqlDbType.Int, 4, "班次代码"); + thisParms[5].Direction = ParameterDirection.Output; + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + if (thisParms[1].Value != null && thisParms[2].Value != null && thisParms[3].Value != null && thisParms[4].Value != null && thisParms[5].Value != null) + { + outputValue = Convert.ToInt32(thisParms[1].Value); + opNameBeatValue = Convert.ToInt32(thisParms[2].Value); + nowOutputValue = Convert.ToInt32(thisParms[3].Value); + NowOpNameBeatValue = Convert.ToInt32(thisParms[4].Value); + classNumber = Convert.ToInt32(thisParms[5].Value); + } + } + catch + { + outputValue = 0; + opNameBeatValue = 0; + nowOutputValue = 0; + NowOpNameBeatValue = 0; + classNumber = 0; + } + } + + static public bool MaterialsDelete(string engineID, string engineType) + { + string procedureName = "轴系返修零件_删除"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工件编号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@产品型号", engineType); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + /// + /// 测量数据工位_监控系统_手动转线_增加 + /// + /// + /// + /// + static public bool AskManualTransfer(string opName, int manualTransfer1, int applyOffLine, int updateOptions1) + { + string procedureName = "测量数据工位_监控系统_手动转线_增加"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@是否启动转线", manualTransfer1); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@是否强制下线", applyOffLine); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@更新项目", updateOptions1); + + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + /// + /// 电子看板_工序内容_查询 + /// + /// 工位号 + /// 产品型号代码 + /// + static public void Process_Select(string opName, int engineTypeID, string EngineType, out DataTable dt) + { + dt = null; + string sql = "exec 电子看板_工序内容_查询 '" + opName + "'," + engineTypeID.ToString() + ",'" + EngineType + "'"; + DataAccess.ExecuteDataTable(sql, out dt); + } + + /// + /// 生产计划_派工订单_查询_工位执行 + /// + /// 工位号 + /// + static public void OrderFormList_Select(string opName, out DataTable dt) + { + dt = null; + string sql = "exec 生产计划_派工订单_查询_工位执行 '" + opName + "'"; + DataAccess.ExecuteDataTable(sql, out dt); + } + + /// + /// 电子看板_装配零件_物料验证_查询 20131231 + /// + /// 工位号 + /// 发动机号 + /// + static public bool PartMaterialVerify_Select(string opName, int engineTypeID, string engineType, out DataTable dt) + { + dt = null; + string procedureName; + procedureName = "电子看板_装配零件_临时表_查询"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@产品型号代码", engineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + //thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + /// + /// 电子看板_工位机型_质量数据测量位置_查询_工作顺序 + /// + /// 工位号 + /// 产品型号代码 + /// + static public bool ShaftPositionSelect(string opNum, int EngineTypeID, out DataTable dt) + { + string procedureName = "电子看板_工位机型_质量数据测量位置_临时表_查询"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opNum); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@产品型号代码", EngineTypeID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + /// + /// 电子看板_工位机型_物料检测测量位置_查询_物料检测 + /// + /// + /// + /// + static public bool MaterialCheckSelect(string opName, out DataTable dt) + { + string procedureName = "电子看板_工位机型_物料检测测量位置_查询_物料检测"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + /// + /// 测量数据合格_查询 + /// + /// + /// + /// + /// + static public bool QualitySelect(string opName, string engineID, out DataTable dt) + { + string procedureName = "测量数据合格_查询"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + /// + /// 启用拧紧 + /// + /// + /// + /// + static public bool IsBackWork_Add(string opName, int IsBackWork) + { + string procedureName = "测量数据工位_监控系统_拧紧与返修拧紧_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@是否启用备用模式", IsBackWork); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + /// + /// 将手动转线/申请下线/返修上线更新到数据库中 + /// + /// + /// + /// + /// + /// + static public bool updataCbxFunction_add(string opName, int manualValue, int outlineValue, int repairVaule) + { + string procedureName = "测量数据工位_监控系统_上线下线转线_增加"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@申请下线", outlineValue); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@返修上线", repairVaule); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@手动转线", manualValue); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + /// + /// 测量数据工位_监控系统_订单号_增加 + /// + /// + /// + /// + static public bool OrderNum_Add(string opName, string orderNum) + { + string procedureName = "测量数据工位_监控系统_订单号_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", orderNum); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + /// + /// 测量数据工位_监控系统_订单号_增加 + /// + /// + /// + /// + static public bool Insert_OnlineOutline(string opName, int orderNum) + { + string procedureName = "测量数据工位_监控系统_在线离线屏蔽_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位状态", orderNum); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + /// + /// 功能按钮-从数据库中更新在线/离线/屏蔽 + /// + /// + /// + public static void Init_OnlineOutline(string opname, out DataTable tb) + { + string sql = "SELECT [工位状态] FROM [dbo].[测量数据工位_监控系统_在线离线屏蔽] WHERE [工位号]='" + opname + "'"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + tb = null; + DataAccess.ExecuteDataTable(sql, out tb); + } + + /// + /// 电子看板_工位机型_质量数据测量位置_查询_返修 + /// + /// + /// + /// + /// + public static void Init_TreeData1(string opName, int engineTypeId, string engineType, out DataTable tb) + { + string sql = "SELECT [序号],[说明] FROM [dbo].[电子看板_工位机型_质量数据测量位置] WHERE [工位号]='" + opName + "' and [产品型号代码]=" + engineTypeId + " and [发动机型号]='" + engineType + "'"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + tb = null; + DataAccess.ExecuteDataTable(sql, out tb); + } + + /// + /// 电子看板_工位机型_质量数据测量位置_查询_返修 + /// + /// + /// + /// + static public bool Init_TreeData(string opName, out DataTable dt) + { + string procedureName = "电子看板_工位机型_质量数据测量位置_查询_返修"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + /// + /// 测量数据工位_监控系统_发动机型号_增加 + /// + /// + /// + /// + /// + static public bool EngineNum_Add(string opName, string enginetype, int enginetypeID) + { + string procedureName = "测量数据工位_监控系统_发动机型号_增加"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机型号", enginetype); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@产品型号代码", enginetypeID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + /// + /// 测量数据工位_监控系统_手动打印_增加 + /// + /// + /// + /// + /// + /// + /// + public static bool OpName_MIS_Manual_Insert(string opName, int year, int month, int day, int num) + { + string produceName = "测量数据工位_监控系统_手动打印_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@年", year); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@月", month); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@日", day); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@流水号", num); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 测量数据工位_监控系统_订单号_查询 + /// + /// + /// + /// + public static bool OpName_MIS_OrderForm_Select(string opName, out DataTable dt) + { + string sql = "select top 1 订单号 from 测量数据工位_监控系统_订单号 where 工位号='" + opName + "'"; + return DataAccess.ExecuteDataTable(sql, out dt); + } + + /// + /// 测量数据工位_监控系统_发动机型号_查询 + /// + /// + /// + /// + public static bool OpName_MIS_EngineType_Select(string opName, out DataTable dt) + { + string sql = "select top 1 产品型号代码,发动机型号 from 测量数据工位_监控系统_发动机型号 where 工位号='" + opName + "'"; + return DataAccess.ExecuteDataTable(sql, out dt); + } + + /// + /// 测量数据工位_监控系统_系统初始化 + /// + /// + /// + public static bool WebLoginIn(string opName) + { + string produceName = "测量数据工位_监控系统_系统初始化"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 获得工位对应的返修工位号 + /// + /// + /// + public static void GetopRepairName(string opname, out DataTable tb) + { + string sql = "SELECT TOP 1 [返修工位号] FROM [dbo].[MES_计划BOM_工位与名称_视图] WHERE [工位号]='" + opname + "'"; + //string connectionString =ApplicationConfig.ConnectionString; + string errorMessage; + tb = null; + DataAccess.ExecuteDataTable(sql, out tb); + } + + /// + /// 测量数据工位_监控系统_离线返修_增加 + /// + /// + /// + /// + static public bool AskOutLineRepair(string opName, int outLineRepair1) + { + string procedureName = "测量数据工位_监控系统_离线返修_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@离线返修", outLineRepair1); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + /// + /// 电子看板_装配零件_修改_零件批号 + /// + /// + /// + /// + /// + public static bool Material_Betch_Update(string opName, string engineType, DataTable dt) + { + string produceName = "电子看板_装配零件_修改_零件批号"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@零件图号", SqlDbType.NVarChar, 50, "零件图号"); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@零件批号", SqlDbType.NVarChar, 50, "零件批号"); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@生产厂家", SqlDbType.NVarChar, 50, "生产厂家"); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, dt); + } + + /// + /// 电子看板_工位机型_质量数据测量位置_临时表_修改_返修 + /// + /// + /// + public static bool Insert_selectTreeData(DataTable dt) + { + string produceName = "电子看板_工位机型_质量数据测量位置_临时表_修改_返修"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", SqlDbType.NVarChar, 50, "工位号"); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@产品型号代码", SqlDbType.Int, 4, "产品型号代码"); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@序号", SqlDbType.Int, 4, "序号"); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, dt); + } + + /// + /// 返修上线插入界面选择的工位合格标志 + /// + /// + /// + public static bool Insert_RepairPartLoad_OpInfo(string opname, string zbz_parameter, string csq_parameter, string zzx_parameter, string jcx_parameter) + { + string sql = "UPDATE [电子看板_发动机号_线首工位_工位合格标志] SET [轴部装线]=" + zbz_parameter + + " ,[差速器线]=" + csq_parameter + + " ,[总装线]=" + zzx_parameter + + " ,[检测线]=" + jcx_parameter + + " WHERE [工位号]='" + opname + "'"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + return DataAccess.ExecuteSQL(sql); + } + + /// + /// 返修上线插入界面选择的工位合格标志 + /// + /// + /// + public static bool Select_RepairLoadBtn(string opname, out DataTable dt) + { + string sql = "SELECT [轴部装线],[差速器线],[总装线],[检测线] FROM [电子看板_发动机号_线首工位_工位合格标志] WHERE 工位号='" + opname + "'"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + return DataAccess.ExecuteDataTable(sql, out dt); + } + + /// + /// 获得返修数量信息 + /// + /// + /// + /// + public static bool OpName_MIS_RepiareNum_Select(string opName, out DataTable dt) + { + string sql = "select top 1 设置数量,当前数量 from 测量数据工位_监控系统_批量返修 where 工位号='" + opName + "'"; + return DataAccess.ExecuteDataTable(sql, out dt); + } + + /// + /// 插入返修数量信息 + /// + /// + /// + /// + static public bool Insert_RepiareNum(string opName, int RepiareNum) + { + string procedureName = "测量数据工位_监控系统_批量返修_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修数量", RepiareNum); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + /// + /// 生产计划_派工订单_查询_工位执行_完工判断 + /// + /// + /// + /// + /// + public static void Select_OrderFormList_OrderComplete(string opName, out int isCompleted, out int num_plan, out int num_complete) + { + isCompleted = 0;//订单数量是否完全上线 + num_plan = 0;//计划数量 + num_complete = 0;//上线数量 + try + { + string procedureName; + procedureName = "生产计划_派工订单_查询_工位执行_完工判断"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@ISCOMPLETE", SqlDbType.Int, 4, "ISCOMPLETE"); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@NUM_PLAN", SqlDbType.Int, 4, "NUM_PLAN"); + thisParms[2].Direction = ParameterDirection.Output; + thisParms[3] = new System.Data.SqlClient.SqlParameter("@NUM_COMPLETE", SqlDbType.Int, 4, "NUM_COMPLETE"); + thisParms[3].Direction = ParameterDirection.Output; + + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + if (thisParms[1].Value != null && thisParms[2].Value != null && thisParms[3].Value != null) + { + isCompleted = Convert.ToInt32(thisParms[1].Value); + num_plan = Convert.ToInt32(thisParms[2].Value); + num_complete = Convert.ToInt32(thisParms[3].Value); + } + } + catch + { + isCompleted = 0; + num_plan = 0; + num_complete = 0; + } + } + + /// + /// WEB根据工位号和线外扫描主物料查询质量数据合格索引(包括了分线的信息、存储过程中根据工位类型区分) 20170318 corbin + /// + /// + /// + /// + /// + public static bool QualityDataButton_bgColor_alert_Select(string opname, out DataTable dt) + { + string procedureName = "显示测量数据_工位号_根据线外工位验证_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + //sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", lineout_barcode); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 显示物料数据_根据_工位号_发动机型号_查询_分线数据 + /// + /// + /// + /// + /// + static public bool MaterialDataSelect_F_EnergineID(string opname, string energineID, out DataTable dt) + { + string procedureName; + procedureName = "显示物料数据_根据_工位号_发动机型号_查询_分线数据"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + } +} \ No newline at end of file diff --git a/Common/07WebBusinessFacade/BusinessFacade/Web/MES.MaterialPull.cs b/Common/07WebBusinessFacade/BusinessFacade/Web/MES.MaterialPull.cs new file mode 100644 index 0000000..7ca3942 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/Web/MES.MaterialPull.cs @@ -0,0 +1,684 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Security.Cryptography; +//using SystemFramework; + +namespace bizFacade +{ + public partial class MaterialPull + { + #region + //---------------------------------MES.Function中的---------------------------------- + /// + /// 物料拉动_工位物料需求单_转移_查询_单号 + /// + /// 工位号 + /// 1 + /// + static public void MaterialPush_ListNumer_Select(int orderNum_Check, string orderNum, int opName_Checked, string opName,int type_Check,string type, out DataTable dt) + { + dt = null; + string sql = "物料拉动_工位物料需求单_转移_查询_单号 " + orderNum_Check + ",'" + orderNum + "'," + opName_Checked + ",'" + opName + "'," + type_Check + ",'" + type+"'"; + DataAccess.ExecuteDataTable(sql, out dt); + } + + /// + /// 物料拉动_工位物料需求单_转移_查询 + /// + /// 工位号 + /// + static public void MaterialPush_Details_Select(string listNumber,string opName, out DataTable dt) + { + dt = null; + string sql = "物料拉动_工位物料需求单_转移_查询 '" + listNumber + "','" + opName + "'"; + DataAccess.ExecuteDataTable(sql, out dt); + } + + /// + /// 物料拉动_线边库存_接受物料_物料需求单 + /// + /// + /// + /// + /// + public static bool DistributionNum(string opName, string DistributionNum) + { + string produceName = "物料拉动_线边库存_接受物料_物料需求单"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@配送单号", DistributionNum); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + /// + /// 配送单实时同步表数据增加 + /// + /// + /// + static public bool MaterialPull_DocumentInfo_Add(DataTable dt) + { + //string connectionString = ApplicationConfig.ConnectionString; + string produceName = "AMES_物料拉动_配送物料接收_配送物料信息_增加"; + SqlParameter[] thisParms = new SqlParameter[12]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@仓库地址", SqlDbType.NVarChar, 50, "WAREHOUSE_CODE"); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@创建时间", SqlDbType.DateTime, 50, "CREATION_DATE"); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@订单号", SqlDbType.NVarChar, 50, "ORDER_NUMBER"); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@工位号", SqlDbType.NVarChar, 50, "DISTRIBUTE_WKC_CODE"); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@供应商代码", SqlDbType.NVarChar, 50, "SUPPLIER_CODE"); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@卡片条码", SqlDbType.NVarChar, 50, "BARCODE"); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@类型", SqlDbType.NVarChar, 50, "IS_DOCUMENT"); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@配送单号", SqlDbType.NVarChar, 50, "DOCUMENT_NUM"); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@配送数量", SqlDbType.Int, 50, "QUANTITY"); + thisParms[9] = new System.Data.SqlClient.SqlParameter("@批次号", SqlDbType.NVarChar, 50, "LOT_NUMBER"); + thisParms[10] = new System.Data.SqlClient.SqlParameter("@条码数量", SqlDbType.Int, 50, "BARCODE_QTY"); + thisParms[11] = new System.Data.SqlClient.SqlParameter("@物料号", SqlDbType.NVarChar, 50, "ITEM_CODE"); + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, dt)) + { + return true; + } + return false; + } + + /// + /// 获取卡片一览信息查询 + /// + /// + /// + /// + public static bool getMaterialNumInfo(string opName, string itemCode, out DataTable dt) + { + string errorMessage; + string sql; + //string connectionString_MES = ApplicationConfig.ConnectionString; + sql = "SELECT 线边库存流水号,订单号,工位号,物料号,卡片条码,批次号,当前数量 AS '库存数量',卡片数量,使用标志 FROM dbo.AMES_物料拉动_线边库存 WHERE 工位号='" + opName + "' AND 物料号='" + itemCode + "' ORDER BY 使用标志 DESC"; + return DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// 物料号一览信息查询 + /// + /// + /// + public static void InitMaterial_Dialog_MaterialNum(string opcnum, out DataTable dt) + { + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + string sql; + dt = null; + sql = "SELECT DISTINCT 物料号 FROM dbo.AMES_物料拉动_线边库存 WHERE 工位号='" + opcnum + "' GROUP BY 物料号 ORDER BY 物料号 "; + DataAccess.ExecuteDataTable(sql, out dt); + + } + /// + /// 查询班次 + /// + /// + public static void Getclasses(out DataTable tb) + { + string sql = "SELECT [班次代码],[班次描述] FROM [dbo].[AMES_物料拉动_人员班组管理_班次信息] ORDER BY 班次代码 "; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + tb = null; + DataAccess.ExecuteDataTable(sql, out tb); + } + + /// + /// 查询打卡上线人数 + /// + /// + /// + public static void Search_OnlineInfo(string opname, out DataTable dt) + { + string sql = "SELECT [工位号] ,[操作者工号],[操作者姓名] ,[班次] ,[操作时间] FROM [dbo].[AMES_物料拉动_测量数据工位_监控系统_员工在线信息表] WHERE [工位号]='" + opname + "'"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + dt = null; + DataAccess.ExecuteDataTable(sql, out dt); + } + public static void ClassName_Select(string ClassCode, out DataTable dt) + { + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + string sql; + sql = "SELECT top 1 班次描述 FROM AMES_物料拉动_人员班组管理_班次信息 WHERE [班次代码]='" + ClassCode + "'"; + dt = null; + DataAccess.ExecuteDataTable(sql, out dt); + } + public static bool ConfirmClass( out string confirmclass) + { + string procedureName = "AMES_物料拉动_人员班组管理_班次信息_查询"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + confirmclass = ""; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new SqlParameter("@班次", SqlDbType.NVarChar, 50); + sqlParameters[0].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters)) + { + confirmclass = sqlParameters[0].Value.ToString(); + return true; + } + return false; + } + + /// + /// [测量数据工位_监控系统_员工在线信息表_增加] + /// + /// + /// + /// + /// + /// + public static bool Insert_WorkingHours(string Opname, string OperatorName, string Password, string Classes, out string Msg) + { + string procedureName = "AMES_物料拉动_测量数据工位_监控系统_员工在线信息表_员工上线"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + Msg = ""; + SqlParameter[] sqlParameters = new SqlParameter[5]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@操作者工号", OperatorName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@工位号", Opname); + sqlParameters[2] = new System.Data.SqlClient.SqlParameter("@员工密码", Password); + sqlParameters[3] = new System.Data.SqlClient.SqlParameter("@班次", Classes); + sqlParameters[4] = new SqlParameter("@Result", SqlDbType.NVarChar, 50); + sqlParameters[4].Direction = ParameterDirection.Output; + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters)) + { + Msg = sqlParameters[4].Value.ToString(); + return true; + } + + return false; + + + } + #endregion + + #region + //---------------------------------login中的---------------------------------- + /// + /// 查询工作中心 + /// + /// + /// + public static DataTable DirectUpload_WorkCenterCode_Select() + { + DataTable dt = null; + string sql; + sql = "SELECT top 1 工作中心 FROM dbo.AMES_物料拉动_MES_工厂与工作中心 "; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + //新增直供上线 + public static bool DirectUpload_VerifyTempTable_Delete(string opName) + { + string produceName = "AMES_物料拉动_直供上线_验证临时表_删除"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + //新增直供上线 + public static bool DirectUpload_VerifyTempTable_Add(string opName, DataTable dt) + { + string produceName = "AMES_物料拉动_直供上线_验证临时表_增加"; + SqlParameter[] thisParms = new SqlParameter[18]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@仓库地址", SqlDbType.NVarChar, 50, "WAREHOUSE_CODE"); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@是否标准", SqlDbType.NVarChar, 50, "NOTIFICATION_TYPE_MEAN"); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@允许接收", SqlDbType.NVarChar, 50, "IS_NEED_VALIDATING"); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@工厂", SqlDbType.NVarChar, 50, "PLANT_ID"); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@工作中心", SqlDbType.NVarChar, 50, "PROD_LINE_CODE"); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@卡片条码", SqlDbType.NVarChar, 50, "SGL_CODE"); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@物料号", SqlDbType.NVarChar, 50, "ITEM_CODE"); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@物料描述", SqlDbType.NVarChar, 50, "DESCRIPTIONS"); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@卡片数量", SqlDbType.NVarChar, 50, "QUANTITY"); + thisParms[9] = new System.Data.SqlClient.SqlParameter("@批次号", SqlDbType.NVarChar, 50, "LOT_NUMBER"); + thisParms[10] = new System.Data.SqlClient.SqlParameter("@供应商代码", SqlDbType.NVarChar, 50, "SUPPLIER_CODE"); + thisParms[11] = new System.Data.SqlClient.SqlParameter("@工位号", SqlDbType.NVarChar, 50, "DISTRIBUTE_WKC_CODE"); + thisParms[12] = new System.Data.SqlClient.SqlParameter("@配送单号", SqlDbType.NVarChar, 50, "ATTRIBUTE9"); + thisParms[13] = new System.Data.SqlClient.SqlParameter("@订单号", SqlDbType.NVarChar, 50, "ORDER_NUMBER"); + thisParms[14] = new System.Data.SqlClient.SqlParameter("@线边地址", SqlDbType.NVarChar, 50, "WAREHOUSE_CODE1"); + thisParms[15] = new System.Data.SqlClient.SqlParameter("@创建时间", SqlDbType.NVarChar, 50, "CREATION_DATE"); + thisParms[16] = new System.Data.SqlClient.SqlParameter("@条码状态", SqlDbType.NVarChar, 50, "STATUS"); + thisParms[17] = new System.Data.SqlClient.SqlParameter("@验证工位号", opName); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, dt); + } + //新增直供上线 + public static bool DirectUpload_VerifyTempTable_Select(string opName, string document_Num, out string process_Message, out DataTable dt) + { + process_Message = ""; + string procedureName = "AMES_物料拉动_直供上线_验证临时表_查询_送货单行"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@配送单号", document_Num); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@PROCESS_MESSGE", SqlDbType.NVarChar, 200); + thisParms[2].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt)) + { + process_Message = thisParms[2].Value.ToString(); + return true; + } + return false; + } + + public static bool DirectUpload_VerifyTempTable_Barcode_Select(string opName, string document_Num, string barcode, out string process_Message, out DataTable dt) + { + process_Message = ""; + string procedureName = "AMES_物料拉动_直供上线_验证临时表_查询_料箱标签"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@配送单号", document_Num); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@卡片条码", barcode); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@PROCESS_MESSGE", SqlDbType.NVarChar, 200); + thisParms[3].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt)) + { + process_Message = thisParms[3].Value.ToString(); + return true; + } + return false; + } + + public static bool DirectUpload_VerifyTempTable_VerifyOK(string opName, string document_Num, out string process_Message) + { + process_Message = ""; + string procedureName = "AMES_物料拉动_直供上线_验证临时表_验证成功"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@配送单号", document_Num); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@PROCESS_MESSGE", SqlDbType.NVarChar, 200); + thisParms[2].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + process_Message = thisParms[2].Value.ToString(); + return true; + } + return false; + } + + public static bool DirectUpload_ReceiveRecord_Select(string opName, string document_Num, string groupId, out DataTable dt) + { + + string procedureName = "AMES_物料拉动_直供上线_接收记录_查询"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@配送单号", document_Num); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@GroupID", groupId); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + public static bool DirectUpload_VerifyTempTable_NoticeOK(string opName, string document_Num, string groupId, int isOk, string outResult) + { + string produceName = "AMES_物料拉动_直供上线_验证临时表_调用成功"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@配送单号", document_Num); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@GROUPID", groupId); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@是否成功", isOk); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@PROCESS_MESSGE", outResult); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + public static DataTable DirectUpload_OpName_Select(string opName) + { + DataTable dt = null; + string sql; + sql = "SELECT top 1 指南工位号 FROM MES_计划BOM_工位与名称 WHERE 工位号='" + opName + "'"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + /// + /// 物料拉动_库存盘点_物料号查询 + /// + /// + + public static void Init_MaterialNumCombobox(string Opname, out DataTable dt_MaterialNum) + { + string sql = "SELECT DISTINCT ROW_NUMBER() OVER (ORDER BY 物料号 )AS ID,[物料号] FROM AMES_物料拉动_线边库存 WHERE 工位号='" + Opname + "' GROUP BY 物料号 ORDER BY 物料号 "; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + dt_MaterialNum = null; + DataAccess.ExecuteDataTable(sql, out dt_MaterialNum); + } + + /// + /// 物料拉动_库存盘点_消耗 + /// + /// + /// + /// + public static bool Consume_StockCount(string OrderNumber, string ConsumeNum, string Opname, string CardNum) + { + string procedureName = "[AMES_物料拉动_线边库存_消耗_人工盘点]"; + //string connectionString = ApplicationConfig.ConnectionString_MES; + string errorMessage; + bool isOK; + SqlParameter[] sqlParameters = new SqlParameter[4]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@订单号", OrderNumber); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@消耗数量", ConsumeNum); + sqlParameters[2] = new System.Data.SqlClient.SqlParameter("@盘点工位号", Opname); + sqlParameters[3] = new System.Data.SqlClient.SqlParameter("@卡片条码", CardNum); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters); + if (isOK) + { + return true; + } + else + { + return false; + } + } + + + static public bool MaterialPull_DocumentInfo_ReceiveRecord_Select(string document_Num, string groupId, out DataTable dt) + { + //此存储过程与直供上线通用 + string procedureName = "AMES_物料拉动_直供上线_接收记录_查询"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@配送单号", document_Num); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@GroupID", groupId); + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt)) + { + return true; + } + return false; + } + + + //调用成功 + static public bool MaterialPull_DocumentInfo_NoticeOK(string document_Num, string groupId, int isOk, string outResult) + { + string process_Message = ""; + string produceName = "AMES_物料拉动_配送物料接收_调用成功"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@配送单号", document_Num); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@GROUPID", groupId); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@是否成功", isOk); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@PROCESS_MESSGE", outResult); + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + return true; + } + return false; + } + public static bool DocumentOutLineInfo_Select(string distributionNum, out DataTable dt) + { + string sql; + sql = "SELECT * FROM AMES_物料拉动_线边库存_备份 WHERE 配送单号='" + distributionNum + "'"; + dt = null; + return DataAccess.ExecuteDataTable(sql, out dt); + } + + public static bool WorkStationInfo_Select(out DataTable dt) + { + string sql; + sql = "SELECT top 1 工作中心 FROM AMES_物料拉动_MES_工厂与工作中心 "; + return DataAccess.ExecuteDataTable(sql, out dt); + } + //物料拉动_库存盘点_初始化 DataGrid + public static void init_StockCount(string opname, string MaterialNum, out DataTable dt_StockCount) + { + string sql = "SELECT DISTINCT A.线边库存流水号,A.工位号, A.订单号,A.当前数量, A.物料号, B.物料描述, A.卡片条码 FROM AMES_物料拉动_线边库存 as A INNER JOIN dbo.AMES_物料拉动_生产计划_派工订单BOM_分配到工位 AS B ON A.物料号 = B.物料号 where A.工位号='" + opname + "'and A.物料号='" + MaterialNum + "' ORDER BY [物料号]"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + dt_StockCount = null; + DataAccess.ExecuteDataTable(sql, out dt_StockCount); + } + /// + /// 物料拉动_库存盘点_订单号查询 + /// + /// + public static void Init_FinalOrderNumberCombobox(out DataTable dt_OrderNumber) + { + string dateString = DateTime.Now.ToString("yyyy-MM-01"); + string sql = "SELECT DISTINCT ROW_NUMBER() OVER (ORDER BY 订单号 )AS ID,订单号 FROM [dbo].[AMES_物料拉动_生产计划_派工订单完工统计] WHERE 操作时间 > '" + dateString + "' GROUP BY 订单号 ORDER BY [订单号]"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + dt_OrderNumber = null; + DataAccess.ExecuteDataTable(sql, out dt_OrderNumber); + } + /// + /// FTT总成编号查询 + /// + /// + public static void Init_FinalListCombobox(string opName, out DataTable dt_EngineNum) + { + string sql; + sql = "SELECT TOP 20 ROW_NUMBER() OVER (ORDER BY 发动机号 )AS ID, 发动机号 FROM [dbo].[测量数据发动机在线状态_跟踪发动机条码状态]" + "WHERE 工位号='" + opName + "' ORDER BY 发动机号 DESC"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + dt_EngineNum = null; + DataAccess.ExecuteDataTable(sql, out dt_EngineNum); + } + /// + /// 缺陷代码查询 + /// + /// + /// + public static void Init_DefectCodeCombobox(string opName, out DataTable dt_DefectCode) + { + string sql; + sql = "SELECT [编号],[编号描述] FROM [dbo].[ANDON_类型_编号]where 工位号='" + opName + "'AND [安东类型代码]=2 "; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + dt_DefectCode = null; + DataAccess.ExecuteDataTable(sql, out dt_DefectCode); + } + /// + /// 质量管理_质量FTT_不合格品补录_临时表_增加 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool Insert_FTTInformation(string opname, string andoTypeCode, string EngineNum, string group_Number, string defect_Number, string ProblemDate, int callCount, out string Msg) + { + string procedureName = "质量管理_质量FTT_不合格品补录_临时表_增加"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + Msg = ""; + SqlParameter[] sqlParameters = new SqlParameter[8]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@代码组", group_Number); + sqlParameters[2] = new System.Data.SqlClient.SqlParameter("@代码", defect_Number); + sqlParameters[3] = new System.Data.SqlClient.SqlParameter("@呼叫数量", callCount); + sqlParameters[4] = new System.Data.SqlClient.SqlParameter("@安东类型代码", andoTypeCode); + sqlParameters[5] = new System.Data.SqlClient.SqlParameter("@工件编号", EngineNum); + sqlParameters[6] = new System.Data.SqlClient.SqlParameter("@问题日期", ProblemDate); + sqlParameters[7] = new SqlParameter("@Msg", SqlDbType.NVarChar, 50); + sqlParameters[7].Direction = ParameterDirection.Output; + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters)) + { + Msg = sqlParameters[7].Value.ToString(); + return true; + } + + return false; + + + } + + static public bool MaterialPull_DocumentInfo_CreateRecord(string document_Num, out string process_Message) + { + process_Message = ""; + string procedureName = "AMES_物料拉动_配送物料接收_产生接收记录"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@配送单号", document_Num); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@PROCESS_MESSGE", SqlDbType.NVarChar, 200); + thisParms[1].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + process_Message = thisParms[1].Value.ToString(); + return true; + } + return false; + } + + /// + /// 校验发动机号 + /// + /// + /// + public static void Confirm_EngineNum(string Final_EngineNum, string DefectGroup, string DefectCode, string Opname, out DataTable dt_DefectCode) + { + string sql; + sql = " SELECT COUNT(*)FROM 质量管理_质量FTT_不合格品_临时表 WHERE 产品序列号 ='" + Final_EngineNum + "' AND 代码='" + DefectCode + "' AND 代码组='" + DefectGroup + "' AND 工位号='" + Opname + "' "; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + dt_DefectCode = null; + DataAccess.ExecuteDataTable(sql, out dt_DefectCode); + } + /// 查询指南工位号 + ///
+ /// + /// + public static void OpName_Convert_Select(string opname, out DataTable dt_ConvertOpname) + { + + string errorMessage; + string sql; + sql = " SELECT 指南工位号 FROM MES_计划BOM_工位与名称 WHERE 工位号='" + opname + "' "; + //string connectionString = ApplicationConfig.ConnectionString; + dt_ConvertOpname = null; + DataAccess.ExecuteDataTable(sql, out dt_ConvertOpname); + + } + #endregion + /// + /// 订单机型查询 + /// + /// + /// + /// + public static void Init_OrderNum_Query(string startTime, string endTime, out DataTable dt) + { + string sql; + sql = "SELECT [订单号] ,[产品型号] FROM dbo.AMES_物料拉动_生产计划_派工订单_订单历史 where 计划开始时间>='" + startTime + "'and 计划开始时间<='" + endTime + "' ORDER BY 计划开始时间"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + dt = null; + DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// 工位工时补报统计 + /// + /// + /// + /// + public static void Init_Worktime(string orderNum, string Opname, int Num, out DataTable dt) + { + string procedureName; + procedureName = "AMES_物料拉动_生产计划_派工订单完工统计_工时统计"; + SqlParameter[] sqlParameters = new SqlParameter[3]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@订单号", orderNum); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@工位号", Opname); + sqlParameters[2] = new System.Data.SqlClient.SqlParameter("@Workplace", Num); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + public static void workTime_CompleteCount(string OrderNum, out DataTable dt) + { + string sql = "SELECT SUM(报工数量) FROM [dbo].[测量数据发动机在线状态_跟踪发动机条码状态] WHERE [订单号]='" + OrderNum + "'AND [工位标识]='O' AND [使用标志]='1' AND 是否禁用=0"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + dt = null; + DataAccess.ExecuteDataTable(sql, out dt); + } + public static void init_Statistics(string orderNum, string Opname, out DataTable dt) + { + string procedureName; + procedureName = "AMES_物料拉动_测量数据发动机在线状态_跟踪发动机条码状态_工时补报统计"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@订单号", orderNum); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@工位号", Opname); + + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + /// + /// 校验工时补录人员[MES_用户管理_人员] + /// + /// + /// + public static void Confirm_Person(string OperatorName, out DataTable dt) + { + string sql = "SELECT COUNT(*) FROM [dbo].[MES_用户管理_人员] WHERE [用户名]='" + OperatorName + "'"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + dt = null; + DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// AMES_物料拉动_生产计划_派工订单_查询_根据订单 + /// + /// + /// + public static void Init_Ordernum_data(string orderNum, out DataTable dt) + { + string procedureName; + procedureName = "AMES_物料拉动_生产计划_派工订单_查询_根据订单"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@订单号", orderNum); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + public static void ClassCode_Select(string ClassName, out DataTable dt) + { + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + string sql; + sql = "SELECT top 1 班次代码 FROM AMES_物料拉动_人员班组管理_班次信息 WHERE [班次描述]='" + ClassName + "'"; + dt = null; + DataAccess.ExecuteDataTable(sql, out dt); + } + + public static bool Workinghours_Insert(string OrderNum, string EngineType, string Opname, int Count, string OperatorName, string Classes, string UploadTime) + { + string procedureName = "AMES_物料拉动_测量数据发动机在线状态_跟踪发动机条码状态_工时补报_增加"; + //string connectionString = ApplicationConfig.ConnectionString_MES; + string errorMessage; + bool isOK; + SqlParameter[] sqlParameters = new SqlParameter[7]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@订单号", OrderNum); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机型号", EngineType); + sqlParameters[2] = new System.Data.SqlClient.SqlParameter("@工位号", Opname); + sqlParameters[3] = new System.Data.SqlClient.SqlParameter("@报工数量", Count); + sqlParameters[4] = new System.Data.SqlClient.SqlParameter("@操作者工号", OperatorName); + sqlParameters[5] = new System.Data.SqlClient.SqlParameter("@班次", Classes); + sqlParameters[6] = new System.Data.SqlClient.SqlParameter("@报工时间", UploadTime); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters); + if (isOK) + { + return true; + } + else + { + return false; + } + } + + /// + /// 物料拉动工位库存查询 + /// + /// + /// + /// + /// + public static void getWorkStationMaterialInfo(string opName, out DataTable dt) + { + string procedureName; + procedureName = "AMES_电子看板_装配零件_库存信息_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + } + + +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/Web/MES.cs b/Common/07WebBusinessFacade/BusinessFacade/Web/MES.cs new file mode 100644 index 0000000..76de495 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/Web/MES.cs @@ -0,0 +1,748 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Security.Cryptography; +//using SystemFramework; + +namespace bizFacade +{ + public partial class MES + { + /// + ///电子看板_发动机号_合格放行_记录_增加 + /// + /// + /// + public static bool InsertRecord_ComfirmOkGO(string opName, string userName, string type) + { + string procedureName = "电子看板_发动机号_合格放行_记录_增加"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + SqlParameter[] sqlParameters = new SqlParameter[3]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + sqlParameters[0].Direction = ParameterDirection.Input; + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@放行者工号", userName); + sqlParameters[1].Direction = ParameterDirection.Input; + sqlParameters[2] = new System.Data.SqlClient.SqlParameter("@放行类别", type); + sqlParameters[2].Direction = ParameterDirection.Input; + bool isOK; + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters); + if (isOK) + { + return true; + } + else + { + return false; + } + + } + /// + /// 操作指南-手动转线-增加 + /// + /// + /// + /// + public static bool ManualTurnLine_Insert(string opname, int Cbx_ManualTurnLine) + { + + string procedureName = "测量数据工位_监控系统_手动转线_增加"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[0].Direction = ParameterDirection.Input; + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@是否启用转线", Cbx_ManualTurnLine); + sqlParameters[1].Direction = ParameterDirection.Input; + bool isOK; + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters); + if (isOK) + { + return true; + } + else + { + return false; + } + } + /// + /// 操作指南-离线返修-增加 + /// + /// + /// + /// + public static bool OutLineRepair_Insert(string opname, int Cbx_OutLineRepair) + { + + string procedureName = "测量数据工位_监控系统_离线返修_增加"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[0].Direction = ParameterDirection.Input; + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@离线返修", Cbx_OutLineRepair); + sqlParameters[1].Direction = ParameterDirection.Input; + bool isOK; + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters); + if (isOK) + { + return true; + } + else + { + return false; + } + } + /// + /// 显示测量数据_工位号_根据发动机型号_查询 + /// + /// + /// + /// + /// + static public bool QualityDataSelect_engineID(string opName, string engineID, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_工位号_根据发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + /// + /// StudentSelect + /// + /// + /// + public static bool getopname(string opname, out DataTable dt) + { + string procedureName = "MES_计划BOM_工位与名称_查询_根据工位号"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 排产计划_查询计划 + /// + /// + /// + /// + /// + public static bool GetPlan(string opname,string selectDate, out DataTable tb) + { + string procedureName = "排产计划_查询计划"; + //string connectionString = ApplicationConfig.ConnectionString; + DataSet ds; + string errorMessage; + bool isOK; + tb = null; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@转生产订单日期", selectDate); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + isOK = DataAccess.ExecuteStoredProcedure(procedureName,ref sqlParameters, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + tb = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + + } + /// + /// [电子看板_发动机号_线首工位_分线订单主表_数据_查询] + /// + /// + /// + /// + /// + public static bool GetPlan_Cap(string opname, out DataTable tb) + { + string procedureName = "电子看板_发动机号_线首工位_分线订单主表_数据_查询"; + //string connectionString = ApplicationConfig.ConnectionString; + DataSet ds; + string errorMessage; + bool isOK; + tb = null; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + tb = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + + } + + /// + /// 电子看板_发动机号_工位队列表_查询_根据工位号(数据源工位) 20140709 wt + /// + /// + /// + /// + public static bool GetQueue(string opname, out DataTable tb) + { + string procedureName = "电子看板_发动机号_工位队列表_查询_根据工位号"; + //string connectionString = ApplicationConfig.ConnectionString; + DataSet ds; + string errorMessage; + bool isOK; + tb = null; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@数据源工位", opname); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + tb = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + /// + /// 电子看板_发动机号_工位队列表_增加 20140709 wt ClearQueue + /// + /// + /// + /// + /// + public static bool InsertQueue(string opname, string engineId) + { + + string procedureName = "电子看板_发动机号_工位队列表_增加"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@数据源工位", opname); + sqlParameters[0].Direction = ParameterDirection.Input; + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", engineId); + sqlParameters[1].Direction = ParameterDirection.Input; + bool isOK; + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters); + if (isOK) + { + return true; + } + else + { + return false; + } + } + /// + /// 电子看板_发动机号_工位队列表_清空 20140709 wt + /// + /// + /// + /// + /// + //public static bool ClearQueue() + //{ + + // string procedureName = "电子看板_发动机号_工位队列表_清空"; + // //string connectionString = ApplicationConfig.ConnectionString; + // string errorMessage; + // bool isOK; + // isOK = DataAccess.ExecuteNonQuery(procedureName); + // if (isOK) + // { + // return true; + // } + // else + // { + // return false; + // } + //} + /// + /// 测量数据合格_查询_WEB页面显示 20140622 wt + /// + /// + /// + /// + /// + public static bool GetCurrentQuality_Select(string engineID,string opname, out DataTable tb) + { + string procedureName = "测量数据合格_查询_WEB页面显示"; + //string connectionString = ApplicationConfig.ConnectionString; + DataSet ds; + string errorMessage; + bool isOK; + tb = null; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + tb = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + + } + + ///// + ///// WEB查询按钮的信息 20140625 wt + ///// + ///// + ///// + //public static bool OpnameSelect_Buttons(out DataTable tb) + //{ + // string procedureName = "WEB_质量查询模块_按钮基础信息_查询"; + // //string connectionString = ApplicationConfig.ConnectionString; + // DataSet ds; + // string errorMessage; + // bool isOK; + + // isOK = DataAccess.ExecuteStoredProcedure(procedureName, out ds); + // if (isOK) + // { + // tb = ds.Tables[0]; + // return true; + // } + // else + // { + // tb = null; + // return false; + // } + + //} + /// + /// WEB_安东模块_物料原因按钮基础信息_查询 20140707 wt + /// + /// + /// + /// + /// + public static bool MaterialProblemButtons_Select(string opname, string engineId, out DataTable tb) + { + + string procedureName = "WEB_安东模块_物料原因按钮基础信息_查询"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + bool isOK; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", engineId); + DataSet ds; + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out ds); + if (isOK) + { + tb = ds.Tables[0]; + return true; + } + else + { + tb = null; + return false; + } + } + /// + /// WEB_安东模块_物料ANDON信息_插入 20140708 wt + /// + /// + /// + /// + /// + public static bool MaterialProblemButtons_Insert(string opname, string materialname) + { + + string procedureName = "WEB_安东模块_物料ANDON信息_插入"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[0].Direction = ParameterDirection.Input; + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@物料描述", materialname); + sqlParameters[1].Direction = ParameterDirection.Input; + bool isOK; + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters); + if (isOK) + { + return true; + } + else + { + return false; + } + } + /// + /// WEB根据工位名称和发动机号查询质量数据 20140625 wt + /// + /// + /// + /// + /// + public static bool QualityData_Select(string opname, string engineId, out DataTable tb) + { + + string procedureName = "WEB_质量查询模块_测量数据合格_查询"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + bool isOK; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", engineId); + DataSet ds; + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out ds); + if (isOK) + { + tb = ds.Tables[0]; + return true; + } + else + { + tb = null; + return false; + } + } + /// + /// WEB根据工位名称和发动机号查询质量数据合格索引(包括了分线的信息、存储过程中根据工位类型区分) 20140626 wt + /// + /// + /// + /// + /// + public static bool QualityDataButton_bgColor_Select(string opname, out DataTable dt) + { + string procedureName = "显示测量数据_工位号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + /// + /// MES界面显示_弹窗消息_查询 + /// + /// + /// + /// + public static bool ShowWindowNotice(string opname, out DataTable dt) + { + string procedureName = "MES界面显示_弹窗消息_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + /// + /// MES界面显示_消息滚动_查询 + /// + /// + /// + /// + public static bool ShowLEDNotice(string opname, out DataTable dt) + { + string procedureName = "MES界面显示_消息滚动_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 上线临时表插入数据 20140609 通过页面直接插入数据库 + /// + /// 工位号 + /// 发动机号 + static public bool SubOnLoadTemp_Insert(string opName, string orderNum, string engineType, string sublineOrderID, out DataTable tb) + { + string procedureName = "电子看板_发动机号_上线临时表_增加"; + //string connectionString = ApplicationConfig.ConnectionString; + DataSet ds; + string errorMessage; + bool isOK; + tb = null; + SqlParameter[] sqlParameters = new SqlParameter[4]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@订单号", orderNum); + sqlParameters[2] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + sqlParameters[3] = new System.Data.SqlClient.SqlParameter("@分线主表数据ID", Convert.ToInt32(sublineOrderID)); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + tb = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + + } + + + /// + /// [电子看板_发动机号_线首工位_查询_根据发动机号和工位号] 20140604 王可心 + /// + /// + /// + static public bool GetEngineIDOpName_Select(string engineID, string opName, out DataTable dt) + { + string errorMessage = ""; + DataSet ds; + bool isOK; + dt = null; + //string connectionString = ApplicationConfig.ConnectionString; + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_根据发动机号和工位号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + isOK= DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + dt = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + + + + /// + /// 电子看板_工序内容_查询 + /// + /// 工位号 + /// 产品型号代码 + /// + static public void Process_Select(string opName, int engineTypeID, out DataTable dt) + { + dt = null; + string sql = "exec 电子看板_工序内容_查询 '" + opName + "'," + engineTypeID.ToString(); + DataAccess.ExecuteDataTable(sql, out dt); + } + + /// + /// 电子看板_装配零件_物料验证_查询 20131231 + /// + /// 工位号 + /// 发动机号 + /// + static public bool PartMaterialVerify_Select(string opName, out DataTable dt) + { + string errorMessage = ""; + DataSet ds; + dt = null; + bool isOK; + + //string connectionString = ApplicationConfig.ConnectionString; + + string procedureName; + procedureName = "电子看板_装配零件_物料验证_查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + //thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + + isOK= DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + dt = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + + /// + /// 设备管理_设备维护内容_查询 + /// + /// + /// + /// + /// ShowMaintainPic + static public bool LoadMachineType(string opName,out DataTable dt) + { + string procedureName; + procedureName = "设备管理_设备维护初始化_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 设备管理_设备维护内容_查询 + /// + /// + /// + /// + /// ShowMaintainPic + static public bool ShowMaintainData(string opName, string MachineType, out DataTable dt) + { + string procedureName; + procedureName = "设备管理_设备维护内容_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@保养类型代码", MachineType); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 设备管理_设备维护图片_查询 + /// + /// + /// + /// + static public void GetMaintainImageFile(string opName, string MachineType, out byte[] pic) + { + string sql; + DataTable dt; + pic = null; + sql = "exec 设备管理_设备维护图片_查询 '" + opName + "'," + MachineType; + DataAccess.ExecuteDataTable(sql, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + pic = (byte[])dt.Rows[0]["保养图片"]; + } + } + } + + /// + /// 显示测量数据_工位数据_查询 + /// + /// + /// + /// + /// + static public bool QualityDataSelect(string opName, string opname, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_工位数据_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@查询工位号", opname); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 显示物料数据_工位数据_查询 + /// + /// + /// + /// + /// + static public bool MaterialDataSelect(string opName, string opname, out DataTable dt) + { + string procedureName; + procedureName = "显示物料数据_工位数据_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@查询工位号", opname); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 操作指南- + /// + /// 工位号 + /// 是否启用备用模式 + /// + public static bool Assembel_RadioNormal_Insert(string opName, int IsNormalOrRepair) + { + string produceName = "测量数据工位_监控系统_拧紧与返修拧紧_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@是否启用备用模式", IsNormalOrRepair); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + /// + /// 测量数据工位_监控系统_返修上下线_上线_增加 + /// + /// + /// + /// + public static bool AssembelRadioNormalWork_Insert(string opName, int upLine) + { + string produceName = "测量数据工位_监控系统_返修上下线_上线_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@是否启用备用模式", upLine); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + /// + /// 启用拧紧_初始化 + /// + /// + /// + public static void cbx_BakOpNameIsWorkStatus_Select(string opName, out DataTable tb) + { + string sql = "SELECT [是否启用备用模式] FROM [dbo].[测量数据工位_监控系统_拧紧与返修拧紧] WHERE [工位号]='" + opName + "'"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + tb = null; + DataAccess.ExecuteDataTable(sql, out tb); + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/Web/MES_Loading.cs b/Common/07WebBusinessFacade/BusinessFacade/Web/MES_Loading.cs new file mode 100644 index 0000000..7d3034a --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/Web/MES_Loading.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Security.Cryptography; +//using SystemFramework; + +namespace bizFacade +{ + public class MES_Loading + { + /// + /// + /// + /// + /// + static public void MES_LoadingOPName(string opName, out DataTable dt) + { + string sql; + sql = " select 线外工位号 as opname from [dbo].[线外工位验证] where 工位号='"+opName+"'"; + DataAccess.ExecuteDataTable(sql, out dt); + } + + + /// + /// MES_界面显示_标签语言_视图_查询 + /// + /// 主模块代码 + /// MesWebCode + /// opName + /// + public static void MES_Loading_select(string mainModule, string MesWebCode,string opName, out DataTable tb) + { + string procedureName = "MES_界面显示_标签语言_视图_查询"; + //string connectionString = ApplicationConfig.ConnectionString; + DataSet ds; + string errorMessage; + bool isOK; + SqlParameter[] sqlParameters = new SqlParameter[3]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@主模块代码", mainModule); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@MesWebCode", MesWebCode); + sqlParameters[2] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out ds); + if (isOK) + { + tb = ds.Tables[0]; + } + else + { + tb = null; + } + + } + /// + /// 测量数据工位_监控系统_操作者工号_增加 + /// + /// + /// + /// + public static bool MES_Loading_Insert(string opName,string userNum) + { + string produceName = "测量数据工位_监控系统_操作者工号_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@操作者工号", userNum); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 测量数据合格_查询 + /// + /// + /// + /// + public static void initImage(string opname, string engineid, out DataTable tb) + { + string procedureName = "测量数据合格_查询"; + //string connectionString = ApplicationConfig.ConnectionString; + DataSet ds; + string errorMessage; + bool isOK; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", engineid); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out ds); + if (isOK) + { + tb = ds.Tables[0]; + } + else + { + tb = null; + } + + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/Web/MES_MachineManage.cs b/Common/07WebBusinessFacade/BusinessFacade/Web/MES_MachineManage.cs new file mode 100644 index 0000000..d9286b6 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/Web/MES_MachineManage.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Security.Cryptography; +//using SystemFramework; + +namespace bizFacade +{ + public class MES_MachineManage + { + /// + /// [设备管理_设备维护记录表_增加] + /// + /// 工位号 + /// 备注 + /// + public static bool Mes_MachineTakeCare_Insert(string opName, string mark) + { + string produceName = "设备管理_设备维护记录表_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@备注", mark); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/Web/ando_load.cs b/Common/07WebBusinessFacade/BusinessFacade/Web/ando_load.cs new file mode 100644 index 0000000..276ae78 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/Web/ando_load.cs @@ -0,0 +1,67 @@ +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Security.Cryptography; +//using SystemFramework; +using System.Text; + +namespace bizFacade +{ + public class ando_load + { + /// + /// 查询ando类型andoTypeSelect + /// + /// + public static bool andoTypeSelect(out DataTable dt) + { + string procedureName = "ANDON_类型_查询"; + return DataAccess.ExecuteStoredProcedure(procedureName, out dt); + } + /// + /// + /// + /// + /// + public static bool andoDetailCount(out DataTable dt) + { + string procedureName = "ANDON_类型_查询"; + return DataAccess.ExecuteStoredProcedure(procedureName, out dt); + } + /// + /// 初始化ando界面 + /// + public static string ando_loading(string opname) + { + System.Data.DataTable dt; + dt=null; + andoTypeSelect(out dt); + string responsetext=""; + StringBuilder sb = new StringBuilder(); + + for(int i=0;i + /// 查询ando类型andoTypeSelect + ///
+ /// + public static bool andoTypeSelect(out DataTable dt) + { + string procedureName = "ANDON_类型_查询"; + return DataAccess.ExecuteStoredProcedure(procedureName, out dt); + } + /// + /// + /// + /// + /// + public static bool andoDetailCount(out DataTable dt) + { + string procedureName = "ANDON_类型_查询"; + return DataAccess.ExecuteStoredProcedure(procedureName, out dt); + } + /// + /// 初始化ando界面 + /// + public static string ando_loading(string opname) + { + System.Data.DataTable dt; + dt=null; + andoTypeSelect(out dt); + string responsetext=""; + StringBuilder sb = new StringBuilder(); + + for(int i=0;i + /// 创建质量ando + ///
+ /// + /// + /// + public static string CreateAndo_Machine(string opname, string AndoTypeCode) + { + System.Data.DataTable dt_list; + //查询ando明细 + ando_matertial.andoListSelect(opname, AndoTypeCode, out dt_list); + + + StringBuilder sb = new StringBuilder(); + + sb.Append("
"); + sb.Append("
"); + sb.Append("
"); + + #region 大图片的div + sb.Append("
"); + sb.Append("\"loading....\""); + sb.Append("
"); + #endregion + + #region 整个ANDON选项DIV + sb.Append("
"); + + #region 左按钮DIV + sb.Append("
"); + sb.Append(""); + sb.Append("
"); + #endregion + + + #region 中间内容DIV + sb.Append("
"); + + #region 可支持移动的div + + sb.Append("
"); + + sb.Append("
"); + + + //附加tabel + string tabelString = CreatAndo_machine_table(opname, AndoTypeCode); + sb.Append(tabelString); + + sb.Append("
"); + sb.Append("
"); + #endregion + + sb.Append("
"); + #endregion + + #region 右按钮div + + sb.Append("
"); + + sb.Append(">\" onclick=\"machine_leftMove()\" />"); + sb.Append("
"); + + #endregion + + sb.Append("
"); + #endregion + #region ando按钮div + + sb.Append("
"); + + sb.Append("
"); + + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + sb.Append("\"loading...\""); + sb.Append(""); + sb.Append("\"loading...\""); + sb.Append("
"); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + + sb.Append("
"); + + sb.Append("
"); + + #endregion + + sb.Append("
"); + + + return sb.ToString(); + //string text = ""; + //int count = dt_list.Rows.Count/2*120; + //return text = "{\"InnerHtml\":\"" + sb.ToString() + "\",\"Count\":\"" + count + "\"}"; + } + /// + /// 创建物料ando的table + /// + /// + /// + /// + public static string CreatAndo_machine_table(string opname, string AndoTypeCode) + { + System.Data.DataTable dt_list; + //查询ando明细 + ando_matertial.andoListSelect(opname, AndoTypeCode, out dt_list); + StringBuilder sb = new StringBuilder(); + int tableCount = dt_list.Rows.Count; + int td_count = (tableCount / 2) + (tableCount % 2);//获取每个tr中应该创建多少个td + int tablewidth = 145 * td_count; + if (tablewidth == 0) + { + tablewidth = 10; + } + string tablewidth2 = Convert.ToString(tablewidth) + "px"; + + #region table + + sb.Append(""); + + //创建第一行 + sb.Append(""); + for (int i = 0; i < td_count; i++) + { + #region 第一行按钮 + sb.Append(""); + + #endregion + } + sb.Append(""); + + + //创建第二行 + sb.Append(""); + for (int i = td_count; i < tableCount; i++) + { + #region 第二行按钮 + sb.Append(""); + + #endregion + } + + //补充第二行的信息 + if ((tableCount % 2) > 0 && (tableCount > 0)) + { + sb.Append(""); + } + sb.Append(""); + + //最后组合成table + sb.Append("
"); + //标签id + string id = "button_ando_machine_" + dt_list.Rows[i]["编号"].ToString(); + + #region 颜色代码 + //标签值 + string value = dt_list.Rows[i]["编号描述2"].ToString(); + string color = dt_list.Rows[i]["颜色代码"].ToString(); + //string inputColor = "background-color:" + color + ""; + if (color == "0") + { + sb.Append(""); + } + if (color == "1") + { + sb.Append(""); + } + if (color == "2") + { + sb.Append(""); + } + #endregion + + sb.Append("
"); + //标签id + string id = "button_ando_machine_" + dt_list.Rows[i]["编号"].ToString(); + + #region 颜色代码 + //标签值 + string value = dt_list.Rows[i]["编号描述2"].ToString(); + string color = dt_list.Rows[i]["颜色代码"].ToString(); + if (color == "0") + { + sb.Append(""); + } + if (color == "1") + { + sb.Append(""); + } + if (color == "2") + { + sb.Append(""); + } + #endregion + + sb.Append(""); + sb.Append("
"); + return sb.ToString(); + #endregion + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/Web/ando_machine_2.cs b/Common/07WebBusinessFacade/BusinessFacade/Web/ando_machine_2.cs new file mode 100644 index 0000000..5d957d9 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/Web/ando_machine_2.cs @@ -0,0 +1,225 @@ +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Security.Cryptography; +//using SystemFramework; +using System.Text; +using System; + +namespace bizFacade +{ + public class ando_machine_2 + { + /// + /// 创建质量ando + /// + /// + /// + /// + public static string CreateAndo_Machine(string opname, string AndoTypeCode) + { + System.Data.DataTable dt_list; + //查询ando明细 + ando_matertial.andoListSelect(opname, AndoTypeCode, out dt_list); + + + StringBuilder sb = new StringBuilder(); + + sb.Append("
"); + sb.Append("
"); + sb.Append("
"); + + #region 大图片的div + sb.Append("
"); + sb.Append("\"loading....\""); + sb.Append("
"); + #endregion + + #region 整个ANDON选项DIV + sb.Append("
"); + + #region 左按钮DIV + sb.Append("
"); + sb.Append(""); + sb.Append("
"); + #endregion + + + #region 中间内容DIV + sb.Append("
"); + + #region 可支持移动的div + + sb.Append("
"); + + sb.Append("
"); + + + //附加tabel + string tabelString = CreatAndo_machine_table(opname, AndoTypeCode); + sb.Append(tabelString); + + sb.Append("
"); + sb.Append("
"); + #endregion + + sb.Append("
"); + #endregion + + #region 右按钮div + + sb.Append("
"); + + sb.Append(">\" onclick=\"machine_leftMove()\" />"); + sb.Append("
"); + + #endregion + + sb.Append("
"); + #endregion + #region ando按钮div + + sb.Append("
"); + + sb.Append("
"); + + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + sb.Append("\"loading...\""); + sb.Append(""); + sb.Append("\"loading...\""); + sb.Append("
"); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + + sb.Append("
"); + + sb.Append("
"); + + #endregion + + sb.Append("
"); + + + return sb.ToString(); + //string text = ""; + //int count = dt_list.Rows.Count/2*120; + //return text = "{\"InnerHtml\":\"" + sb.ToString() + "\",\"Count\":\"" + count + "\"}"; + } + /// + /// 创建物料ando的table + /// + /// + /// + /// + public static string CreatAndo_machine_table(string opname, string AndoTypeCode) + { + System.Data.DataTable dt_list; + //查询ando明细 + ando_matertial.andoListSelect(opname, AndoTypeCode, out dt_list); + StringBuilder sb = new StringBuilder(); + int tableCount = dt_list.Rows.Count; + int td_count = (tableCount / 2) + (tableCount % 2);//获取每个tr中应该创建多少个td + int tablewidth = 145 * td_count; + if (tablewidth == 0) + { + tablewidth = 10; + } + string tablewidth2 = Convert.ToString(tablewidth) + "px"; + + #region table + + sb.Append(""); + + //创建第一行 + sb.Append(""); + for (int i = 0; i < td_count; i++) + { + #region 第一行按钮 + sb.Append(""); + + #endregion + } + sb.Append(""); + + + //创建第二行 + sb.Append(""); + for (int i = td_count; i < tableCount; i++) + { + #region 第二行按钮 + sb.Append(""); + + #endregion + } + + //补充第二行的信息 + if ((tableCount % 2) > 0 && (tableCount > 0)) + { + sb.Append(""); + } + sb.Append(""); + + //最后组合成table + sb.Append("
"); + //标签id + string id = "button_ando_machine_" + dt_list.Rows[i]["编号"].ToString(); + + #region 颜色代码 + //标签值 + string value = dt_list.Rows[i]["编号描述2"].ToString(); + string color = dt_list.Rows[i]["颜色代码"].ToString(); + //string inputColor = "background-color:" + color + ""; + if (color == "0") + { + sb.Append(""); + } + if (color == "1") + { + sb.Append(""); + } + if (color == "2") + { + sb.Append(""); + } + #endregion + + sb.Append("
"); + //标签id + string id = "button_ando_machine_" + dt_list.Rows[i]["编号"].ToString(); + + #region 颜色代码 + //标签值 + string value = dt_list.Rows[i]["编号描述2"].ToString(); + string color = dt_list.Rows[i]["颜色代码"].ToString(); + if (color == "0") + { + sb.Append(""); + } + if (color == "1") + { + sb.Append(""); + } + if (color == "2") + { + sb.Append(""); + } + #endregion + + sb.Append(""); + sb.Append("
"); + return sb.ToString(); + #endregion + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/Web/ando_matertial.cs b/Common/07WebBusinessFacade/BusinessFacade/Web/ando_matertial.cs new file mode 100644 index 0000000..41eb9f9 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/Web/ando_matertial.cs @@ -0,0 +1,605 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Security.Cryptography; +//using SystemFramework; + +namespace bizFacade +{ + public class ando_matertial + { + + /// + /// 物料ando明细查询 ANDON_类型_编号_查询 + /// + /// + /// + public static bool andoListSelect(string opname, string andoTypeCode, out DataTable tb) + { + string procedureName = "ANDON_类型_编号_查询"; + //string connectionString = ApplicationConfig.ConnectionString; + DataSet ds; + string errorMessage; + bool isOK; + tb = null; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@安东类型代码", andoTypeCode); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + tb = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + /// + /// ANDON_呼叫状态_解除(返回table) + /// + /// 工位号 + /// 具体button编号 + /// 安东类型代码 + /// 安东明细代码(补料,错料,不合格) + /// 呼叫内容 + /// + public static bool AndoMaterialResetOutTable(string opname, string number, string andoTypeCode, string andoListCode, string callInfo,out DataTable tb) + { + string procedureName = "ANDON_呼叫状态_解除"; + //string connectionString = ApplicationConfig.ConnectionString; + DataSet ds; + string errorMessage; + bool isOK; + tb = null; + SqlParameter[] sqlParameters = new SqlParameter[5]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[0].Direction = ParameterDirection.Input; + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@编号", number); + sqlParameters[1].Direction = ParameterDirection.Input; + sqlParameters[2] = new System.Data.SqlClient.SqlParameter("@安东类型代码", andoTypeCode); + sqlParameters[2].Direction = ParameterDirection.Input; + sqlParameters[3] = new System.Data.SqlClient.SqlParameter("@安东明细代码", andoListCode); + sqlParameters[3].Direction = ParameterDirection.Input; + sqlParameters[4] = new System.Data.SqlClient.SqlParameter("@解除内容", callInfo); + sqlParameters[4].Direction = ParameterDirection.Input; + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + tb = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + + /// + /// ANDON_呼叫状态_解除 + /// + /// + /// + /// + /// + /// + /// + public static bool AndoMaterialReset(string opname, string number, string andoTypeCode, string andoListCode, string callInfo) + { + + string procedureName = "ANDON_呼叫状态_解除"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + SqlParameter[] sqlParameters = new SqlParameter[5]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[0].Direction = ParameterDirection.Input; + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@编号", number); + sqlParameters[1].Direction = ParameterDirection.Input; + sqlParameters[2] = new System.Data.SqlClient.SqlParameter("@安东类型代码", andoTypeCode); + sqlParameters[2].Direction = ParameterDirection.Input; + sqlParameters[3] = new System.Data.SqlClient.SqlParameter("@安东明细代码", andoListCode); + sqlParameters[3].Direction = ParameterDirection.Input; + sqlParameters[4] = new System.Data.SqlClient.SqlParameter("@解除内容", callInfo); + sqlParameters[4].Direction = ParameterDirection.Input; + bool isOK; + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters); + if (isOK) + { + return true; + } + else + { + return false; + } + } + + + /// + /// ANDON_呼叫状态_呼叫(物料ando插入) + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool andoMaterialCall(string opname, string andoTypeCode, string andoListCode, string number, string callInfo, int callCount, string cardNumber, string noNumber) + { + + string procedureName = "ANDON_呼叫状态_呼叫"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + SqlParameter[] sqlParameters = new SqlParameter[8]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[0].Direction = ParameterDirection.Input; + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@安东类型代码", andoTypeCode); + sqlParameters[1].Direction = ParameterDirection.Input; + sqlParameters[2] = new System.Data.SqlClient.SqlParameter("@安东明细代码", andoListCode); + sqlParameters[2].Direction = ParameterDirection.Input; + sqlParameters[3] = new System.Data.SqlClient.SqlParameter("@编号", number); + sqlParameters[3].Direction = ParameterDirection.Input; + sqlParameters[4] = new System.Data.SqlClient.SqlParameter("@呼叫内容", callInfo); + sqlParameters[4].Direction = ParameterDirection.Input; + sqlParameters[5] = new System.Data.SqlClient.SqlParameter("@呼叫数量", callCount); + sqlParameters[5].Direction = ParameterDirection.Input; + sqlParameters[6] = new System.Data.SqlClient.SqlParameter("@卡片条码", cardNumber); + sqlParameters[6].Direction = ParameterDirection.Input; + sqlParameters[7] = new System.Data.SqlClient.SqlParameter("@不合格代码", noNumber); + sqlParameters[7].Direction = ParameterDirection.Input; + bool isOK; + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters); + if (isOK) + { + return true; + } + else + { + return false; + } + } + /// + /// ANDON_呼叫状态_呼叫(物料ando插入,返回table) + /// + /// 工位号 + /// 安东类型代码 + /// 安东明细代码(缺料,补料,不合格) + /// 编号(具体物料信息) + /// + /// + /// + /// + /// + /// + public static bool andoMaterialCallOutTable(string opname, string andoTypeCode,string andoListCode,string number,string callInfo,int callCount,string cardNumber,string noNumber,out DataTable tb) + { + string procedureName = "ANDON_呼叫状态_呼叫"; + //string connectionString = ApplicationConfig.ConnectionString; + DataSet ds; + string errorMessage; + bool isOK; + tb = null; + SqlParameter[] sqlParameters = new SqlParameter[8]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[0].Direction = ParameterDirection.Input; + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@安东类型代码", andoTypeCode); + sqlParameters[1].Direction = ParameterDirection.Input; + sqlParameters[2] = new System.Data.SqlClient.SqlParameter("@安东明细代码", andoListCode); + sqlParameters[2].Direction = ParameterDirection.Input; + sqlParameters[3] = new System.Data.SqlClient.SqlParameter("@编号", number); + sqlParameters[3].Direction = ParameterDirection.Input; + sqlParameters[4] = new System.Data.SqlClient.SqlParameter("@呼叫内容", callInfo); + sqlParameters[4].Direction = ParameterDirection.Input; + sqlParameters[5] = new System.Data.SqlClient.SqlParameter("@呼叫数量", callCount); + sqlParameters[5].Direction = ParameterDirection.Input; + sqlParameters[6] = new System.Data.SqlClient.SqlParameter("@卡片条码", cardNumber); + sqlParameters[6].Direction = ParameterDirection.Input; + sqlParameters[7] = new System.Data.SqlClient.SqlParameter("@不合格代码", noNumber); + sqlParameters[7].Direction = ParameterDirection.Input; + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + tb = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + /// + /// 创建物料andon + /// + /// + /// + public static string CreateAndo_Material(string opname,string AndoTypeCode) + { + System.Data.DataTable dt_list; + //查询ando明细 + andoListSelect(opname, AndoTypeCode, out dt_list); + + + StringBuilder sb = new StringBuilder(); + //if (dt_list != null) + //{ + // if (dt_list.Rows.Count > 0) + // { + sb.Append("
"); + sb.Append("
"); + sb.Append("
"); + + #region 大图片的div + sb.Append("
"); + sb.Append("\"loading....\""); + sb.Append("
"); + #endregion + + #region 整个ANDON选项DIV + sb.Append("
"); + + #region 左按钮DIV + sb.Append("
"); + sb.Append(""); + sb.Append("
"); + #endregion + + + #region 中间内容DIV + sb.Append("
"); + + #region 可支持移动的div + + sb.Append("
"); + + sb.Append("
"); + + + //附加tabel + string tabelString=CreatAndo_Material_table(opname,AndoTypeCode); + sb.Append(tabelString); + + sb.Append("
"); + sb.Append("
"); + #endregion + + sb.Append("
"); + #endregion + + #region 右按钮div + + sb.Append("
"); + + sb.Append(">\" onclick=\"leftMove()\" />"); + sb.Append("
"); + + #endregion + + sb.Append("
"); + #endregion + #region ando按钮div + + sb.Append("
"); + + sb.Append("
"); + + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + sb.Append("\"loading...\""); + sb.Append(""); + sb.Append("\"loading...\""); + sb.Append("
"); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + + sb.Append("
"); + + sb.Append("
"); + + #endregion + + sb.Append("
"); + + // } + + //} + return sb.ToString(); + } + /// + /// 更新物料安东的中间的tabel + /// + /// 工位号 + /// 物料ando类型明细 + /// + public static string CreatAndo_Material_table(string opname, string AndoTypeCode) + { + System.Data.DataTable dt_list; + //查询ando明细 + andoListSelect(opname, AndoTypeCode, out dt_list); + StringBuilder sb = new StringBuilder(); + int tableCount = dt_list.Rows.Count; + int td_count = (tableCount / 2) + (tableCount % 2);//获取每个tr中应该创建多少个td + int tablewidth = 145 * td_count; + if (tablewidth == 0) + { + tablewidth = 10; + } + string tablewidth2 = Convert.ToString(tablewidth) + "px"; + + #region table + + sb.Append(""); + + //创建第一行 + sb.Append(""); + for (int i = 0; i < td_count; i++) + { + #region 第一行按钮 + sb.Append(""); + + #endregion + } + sb.Append(""); + + + //创建第二行 + sb.Append(""); + for (int i = td_count; i < tableCount; i++) + { + #region 第二行按钮 + sb.Append(""); + + #endregion + } + + //补充第二行的信息 + if ((tableCount % 2) > 0 && (tableCount > 0)) + { + sb.Append(""); + } + sb.Append(""); + + //最后组合成table + sb.Append("
"); + //标签id + string id = "button_ando_material_" + dt_list.Rows[i]["编号"].ToString(); + + #region 颜色代码 + //标签值 + string value = dt_list.Rows[i]["编号描述2"].ToString(); + string color = dt_list.Rows[i]["颜色代码"].ToString(); + //string inputColor = "background-color:" + color + ""; + if (color == "0") + { + sb.Append(""); + } + if (color == "1") + { + sb.Append(""); + } + if (color == "2") + { + sb.Append(""); + } + #endregion + + sb.Append("
"); + //标签id + string id = "button_ando_material_" + dt_list.Rows[i]["编号"].ToString(); + + #region 颜色代码 + //标签值 + string value = dt_list.Rows[i]["编号描述2"].ToString(); + string color = dt_list.Rows[i]["颜色代码"].ToString(); + //string inputColor = "background-color:" + color + ""; + if (color == "0") + { + sb.Append(""); + } + if (color == "1") + { + sb.Append(""); + } + if (color == "2") + { + sb.Append(""); + } + #endregion + + sb.Append(""); + sb.Append("
"); + return sb.ToString(); + + + // if (tableCount > 4) + // { + // sb.Append(""); + // int i = 0; + // for (i = 0; i < dt_list.Rows.Count; i++) + // { + // //总条数 + // int seecond = dt_list.Rows.Count; + // //总条数和2取余 + // int seecond1 = seecond % 2; + // if ((seecond % 2) == 1) + // { + // seecond = seecond / 2 + 1; + // } + // else + // { + // seecond = dt_list.Rows.Count / 2; + // } + // if (i <= seecond) + // { + // #region 第一行按钮 + + + // sb.Append(""); + // //标签id + // string id = "button_ando_material_" + dt_list.Rows[i]["编号"].ToString(); + + // #region 颜色代码 + // //标签值 + // string value = dt_list.Rows[i]["编号描述2"].ToString(); + // string color = dt_list.Rows[i]["颜色代码"].ToString(); + // //string inputColor = "background-color:" + color + ""; + // if (color == "0") + // { + // sb.Append(""); + // } + // if (color == "1") + // { + // sb.Append(""); + // } + // if (color == "2") + // { + // sb.Append(""); + // } + // #endregion + + // sb.Append(""); + + // #endregion + + // } + // } + // sb.Append(""); + // sb.Append(""); + // for (i = 0; i < dt_list.Rows.Count; i++) + // { + // //如果第一行超过一半的按钮就重新放一行 + // int second1 = dt_list.Rows.Count; + // if ((second1) % 2 == 1) + // { + // second1 = second1 / 2 + 1; + + // } + // else + // { + // second1 = dt_list.Rows.Count / 2; + // } + // if (i > second1) + // { + // #region 第二行按钮 + + + // sb.Append(""); + // //标签id + // string id = "button_ando_material_" + dt_list.Rows[i]["编号"].ToString(); + + // #region 颜色代码 + + // //标签值 + // string value = dt_list.Rows[i]["编号描述2"].ToString(); + // string color = dt_list.Rows[i]["颜色代码"].ToString(); + // //string inputColor = "background-color:" + color + ""; + // if (color == "0") + // { + // sb.Append(""); + // } + // if (color == "1") + // { + // sb.Append(""); + // } + // if (color == "2") + // { + // sb.Append(""); + // } + // #endregion + + // sb.Append(""); + // #endregion + + // } + // } + // sb.Append(""); + // } + // //小于4个物料ando按钮 + // else + // { + // sb.Append(""); + // int i = 0; + // for (i = 0; i < dt_list.Rows.Count; i++) + // { + // //如果按钮数小于一半,都放在第一行 + // if (i < dt_list.Rows.Count) + // { + // #region 第一行按钮 + + + // sb.Append(""); + // //标签id + // string id = "button_ando_material_" + dt_list.Rows[i]["编号"].ToString(); + + // #region 颜色代码 + + // //标签值 + // string value = dt_list.Rows[i]["编号描述2"].ToString(); + // string color = dt_list.Rows[i]["颜色代码"].ToString(); + // //string inputColor = "background-color:" + color + ""; + // if (color == "0") + // { + // sb.Append(""); + // } + // if (color == "1") + // { + // sb.Append(""); + // } + // if (color == "2") + // { + // sb.Append(""); + // } + // #endregion + + // sb.Append(""); + + // #endregion + + // } + // } + // sb.Append(""); + // } + //sb.Append(""); + + //return sb.ToString(); + + #endregion + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/Web/ando_matertial_2.cs b/Common/07WebBusinessFacade/BusinessFacade/Web/ando_matertial_2.cs new file mode 100644 index 0000000..7010604 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/Web/ando_matertial_2.cs @@ -0,0 +1,605 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Security.Cryptography; +//using SystemFramework; + +namespace bizFacade +{ + public class ando_matertial_2 + { + + /// + /// 物料ando明细查询 ANDON_类型_编号_查询 + /// + /// + /// + public static bool andoListSelect(string opname, string andoTypeCode, out DataTable tb) + { + string procedureName = "ANDON_类型_编号_查询"; + //string connectionString = ApplicationConfig.ConnectionString; + DataSet ds; + string errorMessage; + bool isOK; + tb = null; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@安东类型代码", andoTypeCode); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + tb = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + /// + /// ANDON_呼叫状态_解除(返回table) + /// + /// 工位号 + /// 具体button编号 + /// 安东类型代码 + /// 安东明细代码(补料,错料,不合格) + /// 呼叫内容 + /// + public static bool AndoMaterialResetOutTable(string opname, string number, string andoTypeCode, string andoListCode, string callInfo,out DataTable tb) + { + string procedureName = "ANDON_呼叫状态_解除"; + //string connectionString = ApplicationConfig.ConnectionString; + DataSet ds; + string errorMessage; + bool isOK; + tb = null; + SqlParameter[] sqlParameters = new SqlParameter[5]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[0].Direction = ParameterDirection.Input; + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@编号", number); + sqlParameters[1].Direction = ParameterDirection.Input; + sqlParameters[2] = new System.Data.SqlClient.SqlParameter("@安东类型代码", andoTypeCode); + sqlParameters[2].Direction = ParameterDirection.Input; + sqlParameters[3] = new System.Data.SqlClient.SqlParameter("@安东明细代码", andoListCode); + sqlParameters[3].Direction = ParameterDirection.Input; + sqlParameters[4] = new System.Data.SqlClient.SqlParameter("@解除内容", callInfo); + sqlParameters[4].Direction = ParameterDirection.Input; + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + tb = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + + /// + /// ANDON_呼叫状态_解除 + /// + /// + /// + /// + /// + /// + /// + public static bool AndoMaterialReset(string opname, string number, string andoTypeCode, string andoListCode, string callInfo) + { + + string procedureName = "ANDON_呼叫状态_解除"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + SqlParameter[] sqlParameters = new SqlParameter[5]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[0].Direction = ParameterDirection.Input; + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@编号", number); + sqlParameters[1].Direction = ParameterDirection.Input; + sqlParameters[2] = new System.Data.SqlClient.SqlParameter("@安东类型代码", andoTypeCode); + sqlParameters[2].Direction = ParameterDirection.Input; + sqlParameters[3] = new System.Data.SqlClient.SqlParameter("@安东明细代码", andoListCode); + sqlParameters[3].Direction = ParameterDirection.Input; + sqlParameters[4] = new System.Data.SqlClient.SqlParameter("@解除内容", callInfo); + sqlParameters[4].Direction = ParameterDirection.Input; + bool isOK; + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters); + if (isOK) + { + return true; + } + else + { + return false; + } + } + + + /// + /// ANDON_呼叫状态_呼叫(物料ando插入) + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool andoMaterialCall(string opname, string andoTypeCode, string andoListCode, string number, string callInfo, int callCount, string cardNumber, string noNumber) + { + + string procedureName = "ANDON_呼叫状态_呼叫"; + //string connectionString = ApplicationConfig.ConnectionString; + string errorMessage; + SqlParameter[] sqlParameters = new SqlParameter[8]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[0].Direction = ParameterDirection.Input; + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@安东类型代码", andoTypeCode); + sqlParameters[1].Direction = ParameterDirection.Input; + sqlParameters[2] = new System.Data.SqlClient.SqlParameter("@安东明细代码", andoListCode); + sqlParameters[2].Direction = ParameterDirection.Input; + sqlParameters[3] = new System.Data.SqlClient.SqlParameter("@编号", number); + sqlParameters[3].Direction = ParameterDirection.Input; + sqlParameters[4] = new System.Data.SqlClient.SqlParameter("@呼叫内容", callInfo); + sqlParameters[4].Direction = ParameterDirection.Input; + sqlParameters[5] = new System.Data.SqlClient.SqlParameter("@呼叫数量", callCount); + sqlParameters[5].Direction = ParameterDirection.Input; + sqlParameters[6] = new System.Data.SqlClient.SqlParameter("@卡片条码", cardNumber); + sqlParameters[6].Direction = ParameterDirection.Input; + sqlParameters[7] = new System.Data.SqlClient.SqlParameter("@不合格代码", noNumber); + sqlParameters[7].Direction = ParameterDirection.Input; + bool isOK; + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters); + if (isOK) + { + return true; + } + else + { + return false; + } + } + /// + /// ANDON_呼叫状态_呼叫(物料ando插入,返回table) + /// + /// 工位号 + /// 安东类型代码 + /// 安东明细代码(缺料,补料,不合格) + /// 编号(具体物料信息) + /// + /// + /// + /// + /// + /// + public static bool andoMaterialCallOutTable(string opname, string andoTypeCode,string andoListCode,string number,string callInfo,int callCount,string cardNumber,string noNumber,out DataTable tb) + { + string procedureName = "ANDON_呼叫状态_呼叫"; + //string connectionString = ApplicationConfig.ConnectionString; + DataSet ds; + string errorMessage; + bool isOK; + tb = null; + SqlParameter[] sqlParameters = new SqlParameter[8]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[0].Direction = ParameterDirection.Input; + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@安东类型代码", andoTypeCode); + sqlParameters[1].Direction = ParameterDirection.Input; + sqlParameters[2] = new System.Data.SqlClient.SqlParameter("@安东明细代码", andoListCode); + sqlParameters[2].Direction = ParameterDirection.Input; + sqlParameters[3] = new System.Data.SqlClient.SqlParameter("@编号", number); + sqlParameters[3].Direction = ParameterDirection.Input; + sqlParameters[4] = new System.Data.SqlClient.SqlParameter("@呼叫内容", callInfo); + sqlParameters[4].Direction = ParameterDirection.Input; + sqlParameters[5] = new System.Data.SqlClient.SqlParameter("@呼叫数量", callCount); + sqlParameters[5].Direction = ParameterDirection.Input; + sqlParameters[6] = new System.Data.SqlClient.SqlParameter("@卡片条码", cardNumber); + sqlParameters[6].Direction = ParameterDirection.Input; + sqlParameters[7] = new System.Data.SqlClient.SqlParameter("@不合格代码", noNumber); + sqlParameters[7].Direction = ParameterDirection.Input; + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + tb = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + /// + /// 创建物料andon + /// + /// + /// + public static string CreateAndo_Material(string opname,string AndoTypeCode) + { + System.Data.DataTable dt_list; + //查询ando明细 + andoListSelect(opname, AndoTypeCode, out dt_list); + + + StringBuilder sb = new StringBuilder(); + //if (dt_list != null) + //{ + // if (dt_list.Rows.Count > 0) + // { + sb.Append("
"); + sb.Append("
"); + sb.Append("
"); + + #region 大图片的div + sb.Append("
"); + sb.Append("\"loading....\""); + sb.Append("
"); + #endregion + + #region 整个ANDON选项DIV + sb.Append("
"); + + #region 左按钮DIV + sb.Append("
"); + sb.Append(""); + sb.Append("
"); + #endregion + + + #region 中间内容DIV + sb.Append("
"); + + #region 可支持移动的div + + sb.Append("
"); + + sb.Append("
"); + + + //附加tabel + string tabelString=CreatAndo_Material_table(opname,AndoTypeCode); + sb.Append(tabelString); + + sb.Append("
"); + sb.Append("
"); + #endregion + + sb.Append("
"); + #endregion + + #region 右按钮div + + sb.Append("
"); + + sb.Append(">\" onclick=\"leftMove()\" />"); + sb.Append("
"); + + #endregion + + sb.Append("
"); + #endregion + #region ando按钮div + + sb.Append("
"); + + sb.Append("
"); + + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + sb.Append("\"loading...\""); + sb.Append(""); + sb.Append("\"loading...\""); + sb.Append("
"); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + + sb.Append("
"); + + sb.Append("
"); + + #endregion + + sb.Append("
"); + + // } + + //} + return sb.ToString(); + } + /// + /// 更新物料安东的中间的tabel + /// + /// 工位号 + /// 物料ando类型明细 + /// + public static string CreatAndo_Material_table(string opname, string AndoTypeCode) + { + System.Data.DataTable dt_list; + //查询ando明细 + andoListSelect(opname, AndoTypeCode, out dt_list); + StringBuilder sb = new StringBuilder(); + int tableCount = dt_list.Rows.Count; + int td_count = (tableCount / 2) + (tableCount % 2);//获取每个tr中应该创建多少个td + int tablewidth = 145 * td_count; + if (tablewidth == 0) + { + tablewidth = 10; + } + string tablewidth2 = Convert.ToString(tablewidth) + "px"; + + #region table + + sb.Append(""); + + //创建第一行 + sb.Append(""); + for (int i = 0; i < td_count; i++) + { + #region 第一行按钮 + sb.Append(""); + + #endregion + } + sb.Append(""); + + + //创建第二行 + sb.Append(""); + for (int i = td_count; i < tableCount; i++) + { + #region 第二行按钮 + sb.Append(""); + + #endregion + } + + //补充第二行的信息 + if ((tableCount % 2) > 0 && (tableCount > 0)) + { + sb.Append(""); + } + sb.Append(""); + + //最后组合成table + sb.Append("
"); + //标签id + string id = "button_ando_material_" + dt_list.Rows[i]["编号"].ToString(); + + #region 颜色代码 + //标签值 + string value = dt_list.Rows[i]["编号描述2"].ToString(); + string color = dt_list.Rows[i]["颜色代码"].ToString(); + //string inputColor = "background-color:" + color + ""; + if (color == "0") + { + sb.Append(""); + } + if (color == "1") + { + sb.Append(""); + } + if (color == "2") + { + sb.Append(""); + } + #endregion + + sb.Append("
"); + //标签id + string id = "button_ando_material_" + dt_list.Rows[i]["编号"].ToString(); + + #region 颜色代码 + //标签值 + string value = dt_list.Rows[i]["编号描述2"].ToString(); + string color = dt_list.Rows[i]["颜色代码"].ToString(); + //string inputColor = "background-color:" + color + ""; + if (color == "0") + { + sb.Append(""); + } + if (color == "1") + { + sb.Append(""); + } + if (color == "2") + { + sb.Append(""); + } + #endregion + + sb.Append(""); + sb.Append("
"); + return sb.ToString(); + + + // if (tableCount > 4) + // { + // sb.Append(""); + // int i = 0; + // for (i = 0; i < dt_list.Rows.Count; i++) + // { + // //总条数 + // int seecond = dt_list.Rows.Count; + // //总条数和2取余 + // int seecond1 = seecond % 2; + // if ((seecond % 2) == 1) + // { + // seecond = seecond / 2 + 1; + // } + // else + // { + // seecond = dt_list.Rows.Count / 2; + // } + // if (i <= seecond) + // { + // #region 第一行按钮 + + + // sb.Append(""); + // //标签id + // string id = "button_ando_material_" + dt_list.Rows[i]["编号"].ToString(); + + // #region 颜色代码 + // //标签值 + // string value = dt_list.Rows[i]["编号描述2"].ToString(); + // string color = dt_list.Rows[i]["颜色代码"].ToString(); + // //string inputColor = "background-color:" + color + ""; + // if (color == "0") + // { + // sb.Append(""); + // } + // if (color == "1") + // { + // sb.Append(""); + // } + // if (color == "2") + // { + // sb.Append(""); + // } + // #endregion + + // sb.Append(""); + + // #endregion + + // } + // } + // sb.Append(""); + // sb.Append(""); + // for (i = 0; i < dt_list.Rows.Count; i++) + // { + // //如果第一行超过一半的按钮就重新放一行 + // int second1 = dt_list.Rows.Count; + // if ((second1) % 2 == 1) + // { + // second1 = second1 / 2 + 1; + + // } + // else + // { + // second1 = dt_list.Rows.Count / 2; + // } + // if (i > second1) + // { + // #region 第二行按钮 + + + // sb.Append(""); + // //标签id + // string id = "button_ando_material_" + dt_list.Rows[i]["编号"].ToString(); + + // #region 颜色代码 + + // //标签值 + // string value = dt_list.Rows[i]["编号描述2"].ToString(); + // string color = dt_list.Rows[i]["颜色代码"].ToString(); + // //string inputColor = "background-color:" + color + ""; + // if (color == "0") + // { + // sb.Append(""); + // } + // if (color == "1") + // { + // sb.Append(""); + // } + // if (color == "2") + // { + // sb.Append(""); + // } + // #endregion + + // sb.Append(""); + // #endregion + + // } + // } + // sb.Append(""); + // } + // //小于4个物料ando按钮 + // else + // { + // sb.Append(""); + // int i = 0; + // for (i = 0; i < dt_list.Rows.Count; i++) + // { + // //如果按钮数小于一半,都放在第一行 + // if (i < dt_list.Rows.Count) + // { + // #region 第一行按钮 + + + // sb.Append(""); + // //标签id + // string id = "button_ando_material_" + dt_list.Rows[i]["编号"].ToString(); + + // #region 颜色代码 + + // //标签值 + // string value = dt_list.Rows[i]["编号描述2"].ToString(); + // string color = dt_list.Rows[i]["颜色代码"].ToString(); + // //string inputColor = "background-color:" + color + ""; + // if (color == "0") + // { + // sb.Append(""); + // } + // if (color == "1") + // { + // sb.Append(""); + // } + // if (color == "2") + // { + // sb.Append(""); + // } + // #endregion + + // sb.Append(""); + + // #endregion + + // } + // } + // sb.Append(""); + // } + //sb.Append(""); + + //return sb.ToString(); + + #endregion + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/Web/ando_quality.cs b/Common/07WebBusinessFacade/BusinessFacade/Web/ando_quality.cs new file mode 100644 index 0000000..b702800 --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/Web/ando_quality.cs @@ -0,0 +1,225 @@ +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Security.Cryptography; +//using SystemFramework; +using System.Text; +using System; + +namespace bizFacade +{ + public class ando_quality + { + /// + /// 创建质量ando + /// + /// + /// + /// + public static string CreateAndo_quality(string opname, string AndoTypeCode) + { + System.Data.DataTable dt_list; + //查询ando明细 + ando_matertial.andoListSelect(opname, AndoTypeCode, out dt_list); + + + StringBuilder sb = new StringBuilder(); + + sb.Append("
"); + sb.Append("
"); + sb.Append("
"); + + #region 大图片的div + sb.Append("
"); + sb.Append("\"loading....\""); + sb.Append("
"); + #endregion + + #region 整个ANDON选项DIV + sb.Append("
"); + + #region 左按钮DIV + sb.Append("
"); + sb.Append(""); + sb.Append("
"); + #endregion + + + #region 中间内容DIV + sb.Append("
"); + + #region 可支持移动的div + + sb.Append("
"); + + sb.Append("
"); + + + //附加tabel + string tabelString = CreatAndo_quality_table(opname, AndoTypeCode); + sb.Append(tabelString); + + sb.Append("
"); + sb.Append("
"); + #endregion + + sb.Append("
"); + #endregion + + #region 右按钮div + + sb.Append("
"); + + sb.Append(">\" onclick=\"qualty_leftMove()\" />"); + sb.Append("
"); + + #endregion + + sb.Append("
"); + #endregion + #region ando按钮div + + sb.Append("
"); + + sb.Append("
"); + + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + sb.Append("\"loading...\""); + sb.Append(""); + sb.Append("\"loading...\""); + sb.Append("
"); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + + sb.Append("
"); + + sb.Append("
"); + + #endregion + + sb.Append("
"); + + + return sb.ToString(); + //string text = ""; + //int count = dt_list.Rows.Count/2*120; + //return text = "{\"InnerHtml\":\"" + sb.ToString() + "\",\"Count\":\"" + count + "\"}"; + } + /// + /// 创建物料ando的table + /// + /// + /// + /// + public static string CreatAndo_quality_table(string opname, string AndoTypeCode) + { + System.Data.DataTable dt_list; + //查询ando明细 + ando_matertial.andoListSelect(opname, AndoTypeCode, out dt_list); + StringBuilder sb = new StringBuilder(); + int tableCount = dt_list.Rows.Count; + int td_count = (tableCount / 2) + (tableCount % 2);//获取每个tr中应该创建多少个td + int tablewidth = 145 * td_count; + if (tablewidth == 0) + { + tablewidth = 10; + } + string tablewidth2 = Convert.ToString(tablewidth) + "px"; + + #region table + + sb.Append(""); + + //创建第一行 + sb.Append(""); + for (int i = 0; i < td_count; i++) + { + #region 第一行按钮 + sb.Append(""); + + #endregion + } + sb.Append(""); + + + //创建第二行 + sb.Append(""); + for (int i = td_count; i < tableCount; i++) + { + #region 第二行按钮 + sb.Append(""); + + #endregion + } + + //补充第二行的信息 + if ((tableCount % 2) > 0 && (tableCount > 0)) + { + sb.Append(""); + } + sb.Append(""); + + //最后组合成table + sb.Append("
"); + //标签id + string id = "button_ando_quality_" + dt_list.Rows[i]["编号"].ToString(); + + #region 颜色代码 + //标签值 + string value = dt_list.Rows[i]["编号描述2"].ToString(); + string color = dt_list.Rows[i]["颜色代码"].ToString(); + //string inputColor = "background-color:" + color + ""; + if (color == "0") + { + sb.Append(""); + } + if (color == "1") + { + sb.Append(""); + } + if (color == "2") + { + sb.Append(""); + } + #endregion + + sb.Append("
"); + //标签id + string id = "button_ando_quality_" + dt_list.Rows[i]["编号"].ToString(); + + #region 颜色代码 + //标签值 + string value = dt_list.Rows[i]["编号描述2"].ToString(); + string color = dt_list.Rows[i]["颜色代码"].ToString(); + if (color == "0") + { + sb.Append(""); + } + if (color == "1") + { + sb.Append(""); + } + if (color == "2") + { + sb.Append(""); + } + #endregion + + sb.Append(""); + sb.Append("
"); + return sb.ToString(); + #endregion + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/Web/ando_quality_2.cs b/Common/07WebBusinessFacade/BusinessFacade/Web/ando_quality_2.cs new file mode 100644 index 0000000..e745f0a --- /dev/null +++ b/Common/07WebBusinessFacade/BusinessFacade/Web/ando_quality_2.cs @@ -0,0 +1,225 @@ +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +using System.Security.Cryptography; +//using SystemFramework; +using System.Text; +using System; + +namespace bizFacade +{ + public class ando_quality_2 + { + /// + /// 创建质量ando + /// + /// + /// + /// + public static string CreateAndo_quality(string opname, string AndoTypeCode) + { + System.Data.DataTable dt_list; + //查询ando明细 + ando_matertial.andoListSelect(opname, AndoTypeCode, out dt_list); + + + StringBuilder sb = new StringBuilder(); + + sb.Append("
"); + sb.Append("
"); + sb.Append("
"); + + #region 大图片的div + sb.Append("
"); + sb.Append("\"loading....\""); + sb.Append("
"); + #endregion + + #region 整个ANDON选项DIV + sb.Append("
"); + + #region 左按钮DIV + sb.Append("
"); + sb.Append(""); + sb.Append("
"); + #endregion + + + #region 中间内容DIV + sb.Append("
"); + + #region 可支持移动的div + + sb.Append("
"); + + sb.Append("
"); + + + //附加tabel + string tabelString = CreatAndo_quality_table(opname, AndoTypeCode); + sb.Append(tabelString); + + sb.Append("
"); + sb.Append("
"); + #endregion + + sb.Append("
"); + #endregion + + #region 右按钮div + + sb.Append("
"); + + sb.Append(">\" onclick=\"qualty_leftMove()\" />"); + sb.Append("
"); + + #endregion + + sb.Append("
"); + #endregion + #region ando按钮div + + sb.Append("
"); + + sb.Append("
"); + + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + sb.Append("\"loading...\""); + sb.Append(""); + sb.Append("\"loading...\""); + sb.Append("
"); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + + sb.Append("
"); + + sb.Append("
"); + + #endregion + + sb.Append("
"); + + + return sb.ToString(); + //string text = ""; + //int count = dt_list.Rows.Count/2*120; + //return text = "{\"InnerHtml\":\"" + sb.ToString() + "\",\"Count\":\"" + count + "\"}"; + } + /// + /// 创建物料ando的table + /// + /// + /// + /// + public static string CreatAndo_quality_table(string opname, string AndoTypeCode) + { + System.Data.DataTable dt_list; + //查询ando明细 + ando_matertial.andoListSelect(opname, AndoTypeCode, out dt_list); + StringBuilder sb = new StringBuilder(); + int tableCount = dt_list.Rows.Count; + int td_count = (tableCount / 2) + (tableCount % 2);//获取每个tr中应该创建多少个td + int tablewidth = 145 * td_count; + if (tablewidth == 0) + { + tablewidth = 10; + } + string tablewidth2 = Convert.ToString(tablewidth) + "px"; + + #region table + + sb.Append(""); + + //创建第一行 + sb.Append(""); + for (int i = 0; i < td_count; i++) + { + #region 第一行按钮 + sb.Append(""); + + #endregion + } + sb.Append(""); + + + //创建第二行 + sb.Append(""); + for (int i = td_count; i < tableCount; i++) + { + #region 第二行按钮 + sb.Append(""); + + #endregion + } + + //补充第二行的信息 + if ((tableCount % 2) > 0 && (tableCount > 0)) + { + sb.Append(""); + } + sb.Append(""); + + //最后组合成table + sb.Append("
"); + //标签id + string id = "button_ando_quality_" + dt_list.Rows[i]["编号"].ToString(); + + #region 颜色代码 + //标签值 + string value = dt_list.Rows[i]["编号描述2"].ToString(); + string color = dt_list.Rows[i]["颜色代码"].ToString(); + //string inputColor = "background-color:" + color + ""; + if (color == "0") + { + sb.Append(""); + } + if (color == "1") + { + sb.Append(""); + } + if (color == "2") + { + sb.Append(""); + } + #endregion + + sb.Append("
"); + //标签id + string id = "button_ando_quality_" + dt_list.Rows[i]["编号"].ToString(); + + #region 颜色代码 + //标签值 + string value = dt_list.Rows[i]["编号描述2"].ToString(); + string color = dt_list.Rows[i]["颜色代码"].ToString(); + if (color == "0") + { + sb.Append(""); + } + if (color == "1") + { + sb.Append(""); + } + if (color == "2") + { + sb.Append(""); + } + #endregion + + sb.Append(""); + sb.Append("
"); + return sb.ToString(); + #endregion + } + } +} diff --git a/Common/07WebBusinessFacade/BusinessFacade/Web/vssver2.scc b/Common/07WebBusinessFacade/BusinessFacade/Web/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..34129fcc9a976ec9289098293b83a04aaec5d817 GIT binary patch literal 541 zcmXpJVq~~_m%l5bInsUAj6{**Nns+ASsYbKObiVC3=9m(Kzg3NyLHCqNBWFFehQGk z;O!HA7(W%r_e|uCopI(NSUwHN7yP$(#*X*T!TfX}e?7C>O&C7|$X_h;gN4KYDOf%e z$S+yK6r3>^!p{Qo8~E>ijo^9$md^(Ah3@(1t}uk~bAbGIHyM46tk+=qTp(Z1|9`-Q zt;>D`nGAVA!n7|%^-PoF8IXJPfqdDWeK8q)ufXaHfc$B!=Km{9A^buhzhZ`tYsUu& zUq#>7Gq^l82}U`U7H8(A78koECMTw(>W8N$F(l@t + + + + Debug + AnyCPU + {D98BE764-ADEB-488D-9714-61E308AA8201} + Library + Properties + WebFun_base + 08WebFun_base + v4.8 + 512 + true + + + + true + full + false + ..\..\dll\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\dll\MQTTnet.dll + + + ..\..\dll\MQTTnet.Extensions.ManagedClient.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {f55da1a0-a982-4479-8c47-0d9a5aaf3e18} + 00MesWorkMqtt + + + {0d1af432-439a-4920-8692-43ae139f5530} + 01_01DoWhatPlc + + + {f434e066-4c59-47c8-aa82-6f48cc84501a} + 04-DataBaseAccess + + + {f0a0c525-03fd-428a-9b17-7f54aa0e4475} + 07BusinessFacade + + + + \ No newline at end of file diff --git a/Common/08WebFun_base/WebFun_base/Class1.cs b/Common/08WebFun_base/WebFun_base/Class1.cs new file mode 100644 index 0000000..d11634b --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/Class1.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WebFun_base +{ + public class Class1 + { + } +} diff --git a/Common/08WebFun_base/WebFun_base/MesWebFun_MateriallPull.cs b/Common/08WebFun_base/WebFun_base/MesWebFun_MateriallPull.cs new file mode 100644 index 0000000..ad95946 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MesWebFun_MateriallPull.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.Text; +using bizFacade; +using System.Data; +//using SystemFramework; + + +namespace MesWebFun_MateriallPull +{ + public partial class MesWebFun_MateriallPull + { + public static string MateriallFuctionRequstBase(string cmd, string opName) + { + string responseText = ""; + switch (cmd) + { + case "AMES_getMaterialInfo": + responseText = Init_WorkStationMaterial(opName); + break; + //--------物料拉动-批次接收----- + case "AMES_InitMaterial_Dialog_MaterialNum": + responseText = InitMaterial_Dialog_MaterialNum(opName); + break; + //case "AMES_getMaterialNumInfo": + // responseText = getMaterialNumInfo(opName); + // break; + //--------物料拉动-库存盘点----- + case "AMES_Init_MaterialNum_Combobox": + responseText = Init_MaterialNum_Combobox(opName); + break; + //case "AMES_ConsumeStockCount": + // responseText = Consume_stockcount(opName); + // break; + //case "AMES_initStockCount": + // responseText = initStockCount(opName); + // break; + case "AMES_Init_Final_OrderNumber_Combobox": + responseText = Init_Final_OrderNumber_Combobox(); + break; + //--------物料拉动-FTT----- + case "AMES_Init_FinalList_Combobox": + responseText = Init_FinalList_Combobox(opName); + break; + case "AMES_Init_DefectCode_Combobox": + responseText = Init_DefectCode_Combobox(opName); + break; + //case "AMES_Insert_FTT_Informatinon": + // responseText = Insert_FTT_Informatinon(opName); + // break; + //case "AMES_Insert_FTT_Confirm": + // responseText = Insert_FTT_Confirm(opName); + // break; + case "AMES_ConvertOpname_Ftt": + responseText = ConvertOpname_Ftt(opName); + break; + //--------物料拉动-打卡上线----- + case "AMES_GetClasses": + responseText = GetClasses(); + break; + case "AMES_Confirmclasses": + responseText = Confirmclasses(); + break; + case "AMES_initOnline": + responseText = initOnline(opName); + break; + //case "AMES_WorkingHours_OnlineInfo": + // responseText = WorkingHours_OnlineInfo(opName); + // break; + ////工时补录 + //case "AMES_OrderNum_Query": + // responseText = OrderNum_Query(); + // break; + //case "AMES_init_WorkTime": + // responseText = init_WorkTime(opName); + // break; + //case "AMES_Worktime_completeCount": + // responseText = Worktime_completeCount(); + // break; + //case "AMES_init_Statistics": + // responseText = init_Statistics(opName); + // break; + //case "AMES_Confirm_Person": + // responseText = Confirm_Person(); + // break; + //case "AMES_Init_OrderNum_data": + // responseText = Init_OrderNum_data(); + // break; + ////班次名称查询 + //case "AMES_SelectClassCode": + // responseText = ClassesCodeSelect(); + // break; + ////工时补录增加 + //case "AMES_Insert_WorkTime": + // responseText = Insert_WorkTime(opName); + // break; + ////--------物料拉动-配送单接收----- + //case "AMES_receiveDistributionOrder": + // responseText = ReceiveDistributionOrder(); + // break; + //--------物料拉动-直供上线----- + //case "AMES_initDirectUpload": + // responseText = initDirectUpload(opName,); + // break; + //case "AMES_directUpload_Verify": + // responseText = DirectUpload_Verify(opName,,); + // break; + //case "AMES_directUpload_Barcode_Verify_OK": + // responseText = DirectUpload_Barcode_Verify_OK(opName,); + // break; + } + return responseText; + } + + public bool IsReusable + { + get + { + return false; + } + } + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MesWebFun_MateriallPullFun.cs b/Common/08WebFun_base/WebFun_base/MesWebFun_MateriallPullFun.cs new file mode 100644 index 0000000..76429b0 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MesWebFun_MateriallPullFun.cs @@ -0,0 +1,870 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.Text; +using bizFacade; +using System.Data; +//using SystemFramework; +using MesWebFun_MateriallPull.BarCodeServer_Pro; + +namespace MesWebFun_MateriallPull +{ + public partial class MesWebFun_MateriallPull + { + private static string Init_WorkStationMaterial(string OpName) + { + DataTable dt; + MaterialPull.getWorkStationMaterialInfo(OpName, out dt); + if (dt != null) + { + return JsonHelper.CreateJsonParameters(dt, true, dt.Rows.Count); + } + else + { + return ""; + } + } + + #region 批次接收 + + /// + /// 物料号获取 + /// + /// 1) + { + for (int i = 0; i < dt.Rows.Count; i++) + { + if (i == 0) + { + sb.Append("\"id\":" + i + ",\"text\":\"" + dt.Rows[0][0] + "\",\"selected\":true},{"); + } + if (i != dt.Rows.Count - 1 & i != 0) + { + sb.Append("\"id\":" + i + ",\"text\":\"" + dt.Rows[i][0] + "\"},{"); + } + else if (i == dt.Rows.Count - 1) + { + sb.Append("\"id\":" + i + ",\"text\":\"" + dt.Rows[i][0] + "\"}]"); + } + } + } + } + return sb.ToString(); + } + + /// + /// 获取卡片一览信息 + /// + /// + /// 物料拉动_库存盘点 + /// + /// + private static string initStockCount(string OpName, string MaterialNum) + { + string text = ""; + System.Data.DataTable dt = null; + + //string MaterialNum = HttpContext.Current.Request["MaterialNum"]; + MaterialPull.init_StockCount(OpName, MaterialNum, out dt); + if (dt.Rows.Count > 0) + { + text = JsonHelper.DataTableToJson(dt); + } + return text; + } + + private static string Init_MaterialNum_Combobox(string OpName) + { + string text = ""; + System.Data.DataTable dt = null; + + MaterialPull.Init_MaterialNumCombobox(OpName, out dt); + text = JsonHelper.DataTableToJson(dt); + return text; + } + + private static string Init_Final_OrderNumber_Combobox() + { + string text = ""; + System.Data.DataTable dt = null; + MaterialPull.Init_FinalOrderNumberCombobox(out dt); + text = JsonHelper.DataTableToJson(dt); + return text; + } + + private static string Consume_stockcount(string OpName, string ConsumeNum, string OrderNumber,string CardNum) + { + //string ConsumeNum = HttpContext.Current.Request["ConsumeNum"]; + //string OrderNumber = HttpContext.Current.Request["OrderNumber"]; + + //string CardNum = HttpContext.Current.Request["CardNum"]; + MaterialPull.Consume_StockCount(OrderNumber, ConsumeNum, OpName, CardNum); + return ""; + } + + #endregion 库存盘点 + + #region FTT模块 + + /// + /// 物料拉动_FTT + /// + /// + private static string ConvertOpname_Ftt(string Opname) + { + string text = ""; + System.Data.DataTable dt = null; + MaterialPull.OpName_Convert_Select(Opname, out dt); + if (dt.Rows.Count > 0) + { + text = JsonHelper.DataTableToJson(dt); + } + return text; + } + + private static string Insert_FTT_Confirm(string Opname, string Final_EngineNum, string DefectGroup, string DefectCode) + { + string text = ""; + System.Data.DataTable dt = null; + //string Final_EngineNum = HttpContext.Current.Request["Final_EngineNum"]; + //string DefectGroup = HttpContext.Current.Request["DefectGroup"]; + //string DefectCode = HttpContext.Current.Request["DefectCode"]; + MaterialPull.Confirm_EngineNum(Final_EngineNum, DefectGroup, DefectCode, Opname, out dt); + if (dt.Rows.Count > 0) + { + text = dt.Rows[0][0].ToString(); + } + return text; + } + + private static string Insert_FTT_Informatinon(string Opname, string EngineNum, string DefectGroup, string DefectCode, string ProblemDate, int callCount) + { + string Msg = ""; + //string EngineNum = HttpContext.Current.Request["Final_EngineNum"]; + //string DefectGroup = HttpContext.Current.Request["DefectGroup"]; + //string DefectCode = HttpContext.Current.Request["DefectCode"]; + //string ProblemDate = HttpContext.Current.Request["ProblemDate"]; + //int callCount = Convert.ToInt32(HttpContext.Current.Request["callCount"]); + MaterialPull.Insert_FTTInformation(Opname, "2", EngineNum, DefectGroup, DefectCode, ProblemDate, callCount, out Msg); + + return Msg; + } + + private static string Init_FinalList_Combobox(string Opname) + { + string text = ""; + System.Data.DataTable dt = null; + MaterialPull.Init_FinalListCombobox(Opname, out dt); + if (dt.Rows.Count > 0) + { + text = JsonHelper.DataTableToJson(dt); + } + return text; + } + + private static string Init_DefectCode_Combobox(string Opname) + { + string text = ""; + System.Data.DataTable dt = null; + MaterialPull.Init_DefectCodeCombobox(Opname, out dt); + if (dt.Rows.Count > 0) + { + text = JsonHelper.DataTableToJson(dt); + } + return text; + } + + #endregion FTT模块 + + #region 打卡上线模块 + + /// + /// 物料拉动_打卡上线 + /// + /// + private static string GetClasses() + { + string text = null; + System.Data.DataTable dt = null; + MaterialPull.Getclasses(out dt); + text = JsonHelper.DataTableToJson(dt); + return text; + } + + private static string initOnline(string opName) + { + StringBuilder sb = new StringBuilder(); + System.Data.DataTable dt = null; + string classes = ""; + string operatorName = ""; + string loginTime = ""; + string operatorCode = ""; + string opname = ""; + MaterialPull.Search_OnlineInfo(opName, out dt); + if (dt != null) + { + sb.Append("["); + if (dt.Rows.Count > 0) + { + for (int i = 0; i < dt.Rows.Count; i++) + { + classes = dt.Rows[i]["班次"].ToString(); + System.Data.DataTable dt_output = null; + MaterialPull.ClassName_Select(classes, out dt_output); + if (dt_output != null) + { + if (dt_output.Rows.Count > 0) + { + classes = dt_output.Rows[0]["班次描述"].ToString(); + } + } + opname = dt.Rows[i]["工位号"].ToString(); + operatorCode = dt.Rows[i]["操作者工号"].ToString(); + operatorName = dt.Rows[i]["操作者姓名"].ToString(); + loginTime = dt.Rows[i]["操作时间"].ToString(); + sb.Append("{\"工位号\":\"" + opname + "\",\"操作者工号\":\"" + operatorCode + "\",\"操作者姓名\":\"" + operatorName + "\",\"班次\":\"" + classes + "\",\"操作时间\":\"" + loginTime + "\"},"); + } + sb.Remove(sb.Length - 1, 1); + } + } + sb.Append("]"); + return sb.ToString(); + } + + private static string Confirmclasses() + { + string Confirmclass = ""; + System.Data.DataTable dt_output = null; + MaterialPull.ConfirmClass(out Confirmclass); + string ConfirmclassName = ""; + MaterialPull.ClassName_Select(Confirmclass, out dt_output); + if (dt_output != null) + { + if (dt_output.Rows.Count > 0) + { + ConfirmclassName = dt_output.Rows[0]["班次描述"].ToString(); + } + } + + return ConfirmclassName; + } + + private static string WorkingHours_OnlineInfo(string Opname, string Password, string Classes, string OperatorName) + { + //string Password = ""; + //string Classes = ""; + //string OperatorName = ""; + string Msg = ""; + //Password = HttpContext.Current.Request["Password"]; + //Classes = HttpContext.Current.Request["Classes"]; + //OperatorName = HttpContext.Current.Request["OperatorName"]; + MaterialPull.Insert_WorkingHours(Opname, OperatorName, Password, Classes, out Msg); + + return Msg; + } + + #endregion 打卡上线模块 + + #region 工时 + + private static string OrderNum_Query(string start_time, string end_time) + { + string text = ""; + // string end_time = ""; + // string start_time = ""; + System.Data.DataTable dt = null; + + // start_time = HttpContext.Current.Request["Plan_start_time"]; + + // end_time = HttpContext.Current.Request["Plan_end_time"]; + + start_time = start_time + " 00:00:00"; + end_time = end_time + " 23:59:59"; + + MaterialPull.Init_OrderNum_Query(start_time, end_time, out dt); + if (dt.Rows.Count > 0) + { + text = JsonHelper.DataTableToJson(dt); + } + return text; + } + + //工时补录初始化 + private static string init_WorkTime(string Opname, string Ordernum) + { + StringBuilder sb = new StringBuilder(); + + string text = ""; + int Num = 1; + string classes = ""; + string opname = ""; + string operatorCode = ""; + string operatorName = ""; + string compeleteCount = ""; + string OrderNum = ""; + string UploadTime = ""; + System.Data.DataTable dt = null; + // string Ordernum = HttpContext.Current.Request["OrderNum"]; + MaterialPull.Init_Worktime(Ordernum, Opname, Num, out dt); + if (dt != null) + { + sb.Append("["); + if (dt.Rows.Count > 0) + { + for (int i = 0; i < dt.Rows.Count; i++) + { + System.Data.DataTable dt_output = null; + classes = dt.Rows[i]["班次"].ToString(); + MaterialPull.ClassName_Select(classes, out dt_output); + if (dt_output != null) + { + if (dt_output.Rows.Count > 0) + { + classes = dt_output.Rows[0]["班次描述"].ToString(); + } + } + OrderNum = dt.Rows[i]["订单号"].ToString(); + opname = dt.Rows[i]["工位号"].ToString(); + operatorCode = dt.Rows[i]["操作者工号"].ToString(); + operatorName = dt.Rows[i]["员工姓名"].ToString(); + compeleteCount = dt.Rows[i]["报工数量"].ToString(); + UploadTime = dt.Rows[i]["报工时间"].ToString(); + sb.Append("{\"订单号\":\"" + OrderNum + "\",\"工位号\":\"" + opname + "\",\"员工姓名\":\"" + operatorName + "\",\"操作者工号\":\"" + operatorCode + "\",\"报工数量\":\"" + compeleteCount + "\",\"班次\":\"" + classes + "\",\"报工时间\":\"" + UploadTime + "\"},"); + } + sb.Remove(sb.Length - 1, 1); + } + } + sb.Append("]"); + return sb.ToString(); + } + + private static string Worktime_completeCount(string OrderNum) + { + string text = "0"; + System.Data.DataTable dt = null; + // string OrderNum = HttpContext.Current.Request["OrderNum"]; + MaterialPull.workTime_CompleteCount(OrderNum, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = dt.Rows[0][0].ToString(); + } + } + return text; + } + + private static string init_Statistics(string Opname, string Ordernum) + { + string text = ""; + System.Data.DataTable dt = null; + // string Ordernum = HttpContext.Current.Request["OrderNum"]; + MaterialPull.init_Statistics(Ordernum, Opname, out dt); + if (dt.Rows.Count > 0) + { + text = JsonHelper.DataTableToJson(dt); + } + return text; + } + + /// + /// 校验工时补录人员 + /// + /// + private static string Confirm_Person(string OperatorName) + { + string text = "0"; + System.Data.DataTable dt = null; + // string OperatorName = HttpContext.Current.Request["OperatorName"]; + MaterialPull.Confirm_Person(OperatorName, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = dt.Rows[0][0].ToString(); + } + } + return text; + } + + //查询产品型号 + private static string Init_OrderNum_data(string Ordernum) + { + string text = ""; + System.Data.DataTable dt = null; + // string Ordernum = HttpContext.Current.Request["OrderNum"]; + MaterialPull.Init_Ordernum_data(Ordernum, out dt); + if (dt.Rows.Count > 0) + { + text = JsonHelper.DataTableToJson(dt); + } + return text; + } + + private static string ClassesCodeSelect(string ClassesName) + { + string ClassCode = ""; + System.Data.DataTable dt_output = null; + // string ClassesName = HttpContext.Current.Request["ClassesName"]; + MaterialPull.ClassCode_Select(ClassesName, out dt_output); + if (dt_output != null) + { + if (dt_output.Rows.Count > 0) + { + ClassCode = dt_output.Rows[0]["班次代码"].ToString(); + } + } + return ClassCode; + } + + //工时补录增加 + private static string Insert_WorkTime(string Opname, string Ordernum, string OperatorName, string Classes, string EngineType, int Count, string UploadTime) + { + string text = ""; + //string Ordernum = HttpContext.Current.Request["OrderNum"]; + //string OperatorName = HttpContext.Current.Request["OperatorName"]; + //string Classes = HttpContext.Current.Request["Classes"]; + //string EngineType = HttpContext.Current.Request["EngineType"]; + //int Count = Convert.ToInt32(HttpContext.Current.Request["Count"]); + //string UploadTime = HttpContext.Current.Request["UploadTime"]; + + MaterialPull.Workinghours_Insert(Ordernum, EngineType, Opname, Count, OperatorName, Classes, UploadTime); + return text; + } + + #endregion 工时 + + #region 配送单接收模块 + + /// + /// 物料拉动-配送单接收 + /// + /// 0) + { + text = "配送单号: " + distributionNum + " 已经接收!"; + return text; + } + else + { + if (distributionNum == "") + { + text = "请扫描配送单号!"; + return text; + } + text = MaterialPull_Document_Exec(distributionNum); + } + } + } + catch + { } + return text; + } + + private static bool isExec = false;//防止多次接收 + + private static string MaterialPull_Document_Exec(string distributionNum) + { + string text = ""; + if (!isExec)//为false才允许接收 + { + //string distributionNum = HttpContext.Current.Request["distributionNum"]; + isExec = true; + text = MaterialPull_Document_Select(distributionNum); + } + else + { + text = "不允许接收!"; + } + return text; + } + + private static string MaterialPull_Document_Select(string distributionNum) + { + //string distributionNum = HttpContext.Current.Request["distributionNum"]; + string process_Message; + try + { + string wkc = ""; + System.Data.DataTable dt_wkc; + MaterialPull.WorkStationInfo_Select(out dt_wkc); + if (dt_wkc != null) + { + if (dt_wkc.Rows.Count > 0) + { + wkc = dt_wkc.Rows[0]["工作中心"].ToString(); + } + } + if (wkc == "") + { + process_Message = "工作中心为空!"; + return process_Message; + } + string document_Num = distributionNum.ToString(); + System.Data.DataTable dt_Document; + //调试、先屏蔽 + var BarCodeServer_Document = new BarCodeServer_Pro.BarCodeSever(); + //sql版本需要用dataset承接 + DataSet ds_Document; + ds_Document = BarCodeServer_Document.Web_MaterialPull_DocumentNum_Select(document_Num, wkc); + dt_Document = ds_Document.Tables[0]; + //Orucal版本需要用dataset承接 + //dt_Document = BarCodeServer_Document.Web_MaterialPull_DocumentNum_Select(document_Num, wkc); + if (dt_Document != null) + { + if (dt_Document.Rows.Count > 0) + { + //将条码信息插入到"配送单"表,状态标识为0,暂时不做处理 + if (MaterialPull.MaterialPull_DocumentInfo_Add(dt_Document)) + { + //执行接收处理 + process_Message = MaterialPull_Document_Receive(document_Num, BarCodeServer_Document); + } + else + { + process_Message = "-1@失败,[" + document_Num + "]不能重复接收!"; + } + } + else + { + process_Message = "-1@失败,[" + document_Num + "]无此配送单信息!"; + } + } + else + { + process_Message = "-1@失败,[" + document_Num + "]无此配送单信息!"; + } + } + catch (Exception ex) + { + process_Message = "-1@未知错误,联系管理员!"; + } + isExec = false; + return process_Message; + } + + //执行接收,传入webservice + private static string MaterialPull_Document_Receive(string document_Num, BarCodeSever BarCodeServer_Document) + { + string process_Message = ""; + try + { + string r_source_id = "", r_orderNum = "", r_plant_id = "", r_wkc = "", + r_workNum = "", r_delivery_num = "", r_item_code = "", r_recept_flag = "", r_type = ""; + string p_GroupId = ""; + string documentInfo = ""; + + //产生接收记录,获得GROUPID,还有一个作用就是防止重复接收 + MaterialPull.MaterialPull_DocumentInfo_CreateRecord(document_Num, out documentInfo); + if (documentInfo.Length > 2) + { + //产生接收记录成功 + if (documentInfo.Substring(0, 2) == "0@") + { + p_GroupId = documentInfo.Substring(2, documentInfo.Length - 2); + if (p_GroupId == "") + return "-1@失败,[" + document_Num + "]产生接收记录失败"; + System.Data.DataTable dt_record; + MaterialPull.MaterialPull_DocumentInfo_ReceiveRecord_Select(document_Num, p_GroupId, out dt_record); + if (dt_record != null) + { + if (dt_record.Rows.Count > 0) + { + r_source_id = dt_record.Rows[0]["ID"].ToString(); + r_orderNum = dt_record.Rows[0]["订单号"].ToString(); + r_plant_id = dt_record.Rows[0]["工厂"].ToString(); + r_wkc = dt_record.Rows[0]["工作中心"].ToString(); + r_workNum = dt_record.Rows[0]["工位号"].ToString(); + r_delivery_num = dt_record.Rows[0]["配送单号"].ToString(); + r_item_code = dt_record.Rows[0]["物料号"].ToString(); + r_recept_flag = dt_record.Rows[0]["是否接收"].ToString(); + r_type = dt_record.Rows[0]["类型"].ToString(); + + string outResult; + + outResult = BarCodeServer_Document.Web_MaterialPull_DocumentNum_VerifyOK(r_source_id, r_orderNum, r_plant_id, r_wkc, + r_workNum, r_delivery_num, r_item_code, r_recept_flag, r_type, p_GroupId); + if (outResult.Length > 2) + { + //调用成功的话 返回“0@成功0@” + //将调用信息更新到接收记录表中 + //执行调用成功存储过程,将临时表中数据加到库存中 + if (outResult.Substring(0, 2) == "0@") + { + System.Data.DataSet Select_AndonCallInfo_DS = BarCodeServer_Document.Select_DocumentReceptCord_Result(document_Num, p_GroupId); + System.Data.DataTable Select_AndonCallInfo = Select_AndonCallInfo_DS.Tables[0]; + if (Select_AndonCallInfo != null) + { + if (Select_AndonCallInfo.Rows.Count > 0) + { + string PROCESS_STATUS = Select_AndonCallInfo.Rows[0]["PROCESS_STATUS"].ToString(); + if (PROCESS_STATUS != "SUCCESS") + { + MaterialPull.MaterialPull_DocumentInfo_NoticeOK(document_Num, p_GroupId, 0, outResult); + } + else + { + MaterialPull.MaterialPull_DocumentInfo_NoticeOK(document_Num, p_GroupId, 1, outResult); + } + } + else + { + MaterialPull.MaterialPull_DocumentInfo_NoticeOK(document_Num, p_GroupId, 0, outResult); + } + } + else + { + MaterialPull.MaterialPull_DocumentInfo_NoticeOK(document_Num, p_GroupId, 0, outResult); + } + } + else + { + MaterialPull.MaterialPull_DocumentInfo_NoticeOK(document_Num, p_GroupId, 0, outResult); + } + } + process_Message = outResult + "[" + document_Num + "]"; + } + else + { + process_Message = "-1@失败,[" + document_Num + "]产生接收记录失败"; + } + } + else + { + process_Message = "-1@失败,[" + document_Num + "]产生接收记录失败"; + } + } + else + { + process_Message = documentInfo; + } + } + } + catch + { + process_Message = "-1@未知错误,[" + document_Num + "]联系管理员!"; + } + return process_Message; + } + + #endregion 配送单接收模块 + + #region 直供上线模块 + + /// + /// 物料拉动-直供上线 + /// + /// + private static string initDirectUpload(string OpName,string document_Num) + { + string text = "[{}]"; + try + { + DataTable dt_VarifyTemp = new DataTable(); + string process_Message; + + + string wkc = DirectUpload_Ini_WKC(); + // string document_Num = HttpContext.Current.Request["Barcode"]; + if (document_Num == null) + return text; + System.Data.DataTable dt_Document; + System.Data.DataSet ds_Document; + var direct = new BarCodeServer_Pro.BarCodeSever(); + ds_Document = direct.Web_DirectUpload_Document_Select(document_Num, wkc); + dt_Document = ds_Document.Tables[0]; + MaterialPull.DirectUpload_VerifyTempTable_Delete(OpName); + MaterialPull.DirectUpload_VerifyTempTable_Add(OpName, dt_Document); + MaterialPull.DirectUpload_VerifyTempTable_Select(OpName, document_Num, out process_Message, out dt_VarifyTemp); + if (dt_VarifyTemp == null) + { + process_Message = "条码查询失败!请重新扫描"; + return text = "{\"result\":\"1\"}"; ; + } + + if (dt_VarifyTemp.Rows.Count == 0) + { + process_Message = "条码查询失败!请重新扫描"; + } + + text = JsonHelper.DataTableToJson(dt_VarifyTemp); + } + catch (Exception ex) + { } + return text; + } + + private static string DirectUpload_Ini_WKC() + { + string work_center_code = ""; + System.Data.DataTable dt_wkc; + dt_wkc = MaterialPull.DirectUpload_WorkCenterCode_Select(); + if (dt_wkc != null) + { + if (dt_wkc.Rows.Count > 0) + { + work_center_code = dt_wkc.Rows[0]["工作中心"].ToString(); + } + } + return work_center_code; + } + + private static string DirectUpload_Verify(string OpName, string document_Num, string barcode) + { + string text = ""; + try + { + string process_Message = ""; + //string document_Num = HttpContext.Current.Request["documentNum"];//送货单行条码 + //string barcode = HttpContext.Current.Request["barcode"];//卡片条码 + System.Data.DataTable dt_VarifyTemp; + MaterialPull.DirectUpload_VerifyTempTable_Barcode_Select(OpName, document_Num, barcode, out process_Message, out dt_VarifyTemp); + text = JsonHelper.DataTableToJson(dt_VarifyTemp); + } + catch + { } + return text; + } + + private static string DirectUpload_Barcode_Verify_OK(string OpName, string document_Num) + { + string text = ""; + try + { + // string document_Num = HttpContext.Current.Request["documentNum"];//送货单行条码 + if (document_Num == null) + return text; + string process_Message_verify = ""; + string p_GroupId = ""; + + string r_source_id = "", r_orderNum = "", r_plant_id = "", r_wkc = "", + r_workNum = "", r_delivery_num = "", r_item_code = "", r_recept_flag = ""; + + System.Data.DataTable dt_ReceiveRecord; + + MaterialPull.DirectUpload_VerifyTempTable_VerifyOK(OpName, document_Num, out process_Message_verify); + if (process_Message_verify.Length > 2) + { + //产生接收记录成功 + if (process_Message_verify.Substring(0, 2) == "0@") + { + p_GroupId = process_Message_verify.Substring(2, process_Message_verify.Length - 2); + if (p_GroupId == "") + return text; + MaterialPull.DirectUpload_ReceiveRecord_Select(OpName, document_Num, p_GroupId, out dt_ReceiveRecord); + if (dt_ReceiveRecord != null) + { + if (dt_ReceiveRecord.Rows.Count > 0) + { + r_source_id = dt_ReceiveRecord.Rows[0]["ID"].ToString(); + r_orderNum = dt_ReceiveRecord.Rows[0]["订单号"].ToString(); + r_plant_id = dt_ReceiveRecord.Rows[0]["工厂"].ToString(); + r_wkc = dt_ReceiveRecord.Rows[0]["工作中心"].ToString(); + r_workNum = dt_ReceiveRecord.Rows[0]["工位号"].ToString(); + r_delivery_num = dt_ReceiveRecord.Rows[0]["配送单号"].ToString(); + r_item_code = dt_ReceiveRecord.Rows[0]["物料号"].ToString(); + r_recept_flag = dt_ReceiveRecord.Rows[0]["是否接收"].ToString(); + + r_workNum = DirectUpload_Ini_Opname(r_workNum);//产生接收记录工位号与SAP一致 + + string outResult; + var direct = new BarCodeServer_Pro.BarCodeSever(); + outResult = direct.Web_DirectUpload_Document_VerifyOK(r_source_id, r_orderNum, r_plant_id, r_wkc, + r_workNum, r_delivery_num, r_item_code, r_recept_flag, p_GroupId); + if (outResult.Length > 2) + { + //调用成功的话 返回“0@成功0@” + //将调用信息更新到接收记录表中 + //执行调用成功存储过程,将临时表中数据加到库存中 + if (outResult.Substring(0, 2) == "0@") + { + MaterialPull.DirectUpload_VerifyTempTable_NoticeOK(OpName, document_Num, p_GroupId, 1, outResult); + } + else + { + MaterialPull.DirectUpload_VerifyTempTable_NoticeOK(OpName, document_Num, p_GroupId, 0, outResult); + } + text = JsonHelper.ObjectToJson(outResult); + } + } + } + } + //已经接收,不允许重复接收 + else + { + text = JsonHelper.ObjectToJson(process_Message_verify); + } + } + } + catch + { } + return text; + } + + private static string DirectUpload_Ini_Opname(string opName_Ori) + { + string opName_Convert = ""; + System.Data.DataTable dt_opName_Convert; + dt_opName_Convert = MaterialPull.DirectUpload_OpName_Select(opName_Ori); + if (dt_opName_Convert != null) + { + if (dt_opName_Convert.Rows.Count > 0) + { + opName_Convert = dt_opName_Convert.Rows[0]["指南工位号"].ToString(); + } + } + return opName_Convert; + } + + #endregion 直供上线模块 + } +} \ No newline at end of file diff --git a/Common/08WebFun_base/WebFun_base/MesWebFun_Special.cs b/Common/08WebFun_base/WebFun_base/MesWebFun_Special.cs new file mode 100644 index 0000000..90b7362 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MesWebFun_Special.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.Text; +using bizFacade; +using System.Data; +////using SystemFramework; +using DataLinkMesWork; + +namespace MesWebFun +{ + public class MesWebFun_Special + { + /// + /// 提供调用特殊工位类型方法的调用入口 + /// + /// + /// + public static string SpecialFuctionRequstBase( string cmd,string opName) + { + // string filepath = context.Request.UrlReferrer.ToString(); + // string[] fileItem = filepath.Split('/'); + // string item = fileItem[fileItem.Length - 1]; + // string[] itemUrl = item.Split('?'); + // string destUrl = itemUrl[0];//取得页面值 + // string mesWebFun = ApplicationConfig.MesWebFun[destUrl].ToString(); + // string type = HttpContext.Current.Request["type"]; + string responseText = ""; + // switch (mesWebFun) + { + //case "01": + //WebFunction01 fun01 = new WebFunction01(); + // responseText = fun01.ProcessRequest(context); + // break; + //case "02": + // WebFunction02 fun02 = new WebFunction02(); + // responseText = fun02.ProcessRequest(context); + // break; + //case "04": + // WebFunction04 fun04 = new WebFunction04(); + // responseText = fun04.ProcessRequest(context); + // break; + //case "05": + // WebFunction05 fun05 = new WebFunction05(); + // responseText = fun05.ProcessRequest(context); + // break; + //case "06": + // WebFunction06 fun06 = new WebFunction06(); + // responseText = fun06.ProcessRequest(context); + // break; + //case "07": + // WebFunction07 fun07 = new WebFunction07(); + // responseText = fun07.ProcessRequest(context); + // break; + //case "08": + // WebFunction08 fun08 = new WebFunction08(); + // responseText = fun08.ProcessRequest(context); + // break; + //case "10": + // WebFunction10 fun10 = new WebFunction10(); + // responseText = fun10.ProcessRequest(context); + // break; + //case "11": + // WebFunction11 fun11 = new WebFunction11(); + // responseText = fun11.ProcessRequest(context); + // break; + //case "12": + // WebFunction12 fun12 = new WebFunction12(); + // responseText = fun12.ProcessRequest(context); + // break; + //case "13": + // WebFunction13 fun13 = new WebFunction13(); + // responseText = fun13.ProcessRequest(context); + // break; + //case "14": + // WebFunction14 fun14 = new WebFunction14(); + // responseText = fun14.ProcessRequest(context); + // break; + //case "15": + // WebFunction15 fun15 = new WebFunction15(); + // responseText = fun15.ProcessRequest(context); + // break; + //case "16": + // WebFunction16 fun16 = new WebFunction16(); + // responseText = fun16.ProcessRequest(context); + // break; + //case "17": + // WebFunction17 fun17 = new WebFunction17(); + // responseText = fun17.ProcessRequest(context); + // break; + } + return responseText; + } + + public bool IsReusable + { + get + { + return false; + } + } + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MesWebFun_base.cs b/Common/08WebFun_base/WebFun_base/MesWebFun_base.cs new file mode 100644 index 0000000..eaaeed9 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MesWebFun_base.cs @@ -0,0 +1,231 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.Text; +using bizFacade; +using System.Data; +//using SystemFramework; +namespace MesWebFun_base +{ + public partial class MesWebFun_base + { + public string ProcessRequest(string cmd,string opName/*,string engineID*/) + { + string responseText = ""; + switch (cmd) + { + //托盘信息 + case "MobySelect": + responseText = MobySelect(opName); + break; + //操作图片 + case "PictureShow": + responseText = PictureShow(opName); + break; + //物料信息 + case "MaterialList": + responseText = MaterialList(opName); + break; + //操作指南 + case "ProcessList": + responseText = ProcessList(opName); + break; + case "ShaftPosition": + responseText = ShaftPotion_Select(opName); + break; + //选择订单_增加订单号 + //case "InsertOrderNum": + // responseText = InsertOrderNum(,opName); + // break; + //选择订单_增加发动机型号 + //case "InsertEngineNum": + // responseText = InsertEngineNum(opName,,); + // break; + //订单完工_选择机型 + case "Orderenginetypeselect": + responseText = Orderenginetypeselect(); + break; + //物料拉动_确认接受 + //case "AffirmReceive": + // responseText = AffirmReceive(opName,); + // break; + case "ShowTimelyQuality": + responseText = Quality_Select(opName); + break; + //case "MesloadingSelect": + // responseText = MesloadingSelect(opName); + // break; + //工步属性 + case "StepProperty": + responseText = StepProperty(opName); + break; + //订单信息 + case "OrderFormList": + responseText = OrderFormList(opName); + break; + //查询单号 + case "MaterialPush_ListNumer": + responseText = MaterialPush_ListNumer(opName); + break; + //根据单号查询详细信息 + //case "MaterialPush_Details": + // responseText = MaterialPush_Details(opName); + // break; + case "QualityDataButton_bgColor_Select": + responseText = QualityDataButton_bgColor_Select(opName); + break; + //查询具体ando类型明细 + case "InitComboboxAndoDetail": + responseText = InitComboboxAndoDetail(); + break;//InitMaterailAndo + case "InitMaterailAndo": + responseText = InitMaterailAndo(opName); + break; + //case "InitMaterailAndoCount": + // responseText = InitMaterailAndoCount(opName); + // break; + //物料ando_呼叫 + //case "submitAndoMaterialCall": + // responseText = submitAndoMaterialCall(opName); + // break; + //ando界面_物料ando_更新物料安东table + //case "updataAndoMaterialTabel": + // responseText = updataAndoMaterialTabel(opName); + // break; + //ando界面_质量ando_更新质量安东table + //case "updataAndoQualityTabel": + // responseText = updataAndoQualityTabel(opName); + // break; + ////ando界面_物料ando_物料ando复位 + //case "submitAndoMaterialReset": + // responseText = submitAndoMaterialReset(opName); + // break; + ////ando界面_复位 + //case "submitAndoQualityReset": + // responseText = submitAndoQualityReset(opName); + // break; + //////////////////////设备管理 + case "LoadMachineType": //初始化设备维护类型 + responseText = LoadMachineType(opName); + break; + //case "ShowMaintainData": + // responseText = ShowMaintainData(opName); + // break; + //case "ShowMaintainPic": + // responseText = ShowMaintainPic(opName); + // break; + //case "equipmentmanagementSubmit": + // responseText = equipmentmanagementSubmit(opName); + // break;//equipmentmanagementSubmit + /////////////////////////质量查询 + //case "QualityDataSelect": + // responseText = QualityDataSelect(opName); + // break; + //弹窗消息 + case "ShowWindowNotice": + responseText = ShowWindowNotice(opName); + break; + //消息滚动 + case "ShowLEDNotice": + responseText = ShowLEDNotice(opName); + break; + case "GetOrderForm"://获取生产订单 + responseText = GetOrderForm(opName); + break; + case "GetEngineType"://获取发动机型号 + responseText = GetEngineType(opName); + break; + case "ShowOpNameMessage"://显示工位名称、操作工编号 + responseText = ShowOpNameMessage(opName); + break; + case "WebLoginIn"://系统初始化时,复位一些信息 + responseText = WebLoginIn(opName); + break; + case "MaterialCheckPosition"://物料检测指导 + responseText = MaterialCheckPosition(opName); + break; + //case "functionButtonConfirmOk"://合格放行 + // responseText = functionButtonConfirmOk(opName); + // break; + ////物料追溯数据查询 + //case "MaterialDataSelect": + // responseText = MaterialDataSelect(opName); + // break; + //case "MaterialSelect"://电子看板_装配零件_查询 + // responseText = MaterialSelect(opName); + // break; + //case "MaterialManualUpdateBetch"://手动修改批次信息以及生产厂家 + // responseText = MaterialManualUpdateBetch(opName); + // break; + //case "Insert_OnlineOutline"://将在线,离线,屏蔽更新到数据库中 + // responseText = Insert_OnlineOutline(opName); + // break; + case "Init_OnlineOutline"://功能按钮 - 从数据库中初始化在线 / 离线 / 屏蔽的combobox + responseText = Init_OnlineOutline(opName); + break; + case "InitOpNameOuputCount"://初始化节拍数据 + responseText = InitOpNameOuputCount(opName); + break; + //case "Insert_ConfirmOk"://电子看板_发动机号_合格放行_记录_增加 + // responseText = Insert_ConfirmOk(opName); + // break; + case "OrderFormList_OrderComplete"://订单完工,上线数量大于计划数量,界面提示 + responseText = OrderFormList_OrderComplete(opName); + break; + case "GetLoginUrl": + responseText = GetLoginOutUrl(); + break; + //case "SetRepaireNum": + // responseText = Insert_RepiareNum(opName); + // break; + case "GetRepaireNum": + responseText = GetRepaireNum(opName); + break; + case "Init_TreeData"://返修上线 + responseText = Init_TreeData(opName); + break; + //case "Quality_Select_Repair"://返修上线选择质量数据 + // responseText = Quality_Select_Repair(opName, engineID); + // break; + //case "Insert_selectTreeData"://返修上线-将选择的根节点数据更新到数据库中 + // responseText = Insert_selectTreeData(opName); + // break; + case "QualityDataButton_bgColor_alert_Select": + responseText = QualityDataButton_bgColor_alert_Select(opName); + break; + ////物料追溯数据查询_根据发动机号 20170319 + //case "MaterialDataSelect_F_EnergineID": + // responseText = MaterialDataSelect_F_EnergineID(opName); + // break; + case "GetPdfSrc": + responseText = GetPdfSrc(opName); //获取操作指南的PDF路径 + break; + default: + string[] sArray = cmd.Split('_'); + string Funtype = sArray[0]; + if (Funtype == "AMES") + { + responseText = MesWebFun_MateriallPull.MesWebFun_MateriallPull.MateriallFuctionRequstBase(cmd, opName); + } + else + { + responseText = MesWebFun.MesWebFun_Special.SpecialFuctionRequstBase(cmd, opName); + } + break; + } + return responseText; + } + + + public bool IsReusable + { + get + { + return false; + } + } + + + + } +} \ No newline at end of file diff --git a/Common/08WebFun_base/WebFun_base/MesWebFun_baseFun.cs b/Common/08WebFun_base/WebFun_base/MesWebFun_baseFun.cs new file mode 100644 index 0000000..2ce7031 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MesWebFun_baseFun.cs @@ -0,0 +1,1848 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.Text; +using bizFacade; +using System.Data; +//using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MesWebFun_base + { + /// + /// 电子看板_发动机号_合格放行_记录_增加 + /// + /// + private string Insert_ConfirmOk(string opName, string operatorNum, string type) + { + string text = ""; + try + { + // string operatorNum = HttpContext.Current.Request["userName"];//放行者工号 + // string type = HttpContext.Current.Request["recordType"];//放行类型 + MES.InsertRecord_ComfirmOkGO(opName, operatorNum, type); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Insert_ConfirmOk"); + } + return text; + } + + /// + /// 订单完工,上线数量大于计划数量,界面提示 + /// + /// + private string OrderFormList_OrderComplete(string opName) + { + string text = ""; + try + { + int isCompleted;//订单数量是否完全上线 + int num_plan;//计划数量 + int num_complete;//上线数量 + MES.Select_OrderFormList_OrderComplete(opName, out isCompleted, out num_plan, out num_complete); + text = "{\"isCompleted\":\"" + isCompleted + "\",\"num_plan\":\"" + num_plan + "\",\"num_complete\":\"" + num_complete + "\"}"; + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:OrderFormList_OrderComplete"); + } + return text; + } + + /// + /// 初始化节拍数据 + /// + /// + private string InitOpNameOuputCount(string opnameValue) + { + string text = ""; + try + { + int outputValue = 0; //工位产量 + int nowOutputValue = 0; //在线产量 + int opNameBeatValue = 0; //工位节拍 + int NowOpNameBeatValue = 0; //在线节拍 + int classNumber = 0;//班次代码 + MES.InitOpNameOuputCount(opnameValue, out outputValue, out nowOutputValue, out opNameBeatValue, out NowOpNameBeatValue, out classNumber); + text = "{\"outputValue\":\"" + outputValue + "\",\"nowOutputValue\":\"" + nowOutputValue + "\",\"opNameBeatValue\":\"" + opNameBeatValue + "\",\"NowOpNameBeatValue\":\"" + NowOpNameBeatValue + "\",\"classNumber\":\"" + classNumber + "\"}"; + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:InitOpNameOuputCount"); + } + return text; + } + + /// + /// 功能按钮 - 从数据库中初始化在线 / 离线 / 屏蔽的combobox + /// + /// + private string Init_OnlineOutline(string opnameValue) + { + string text = ""; + try + { + System.Data.DataTable dt = null; + MES.Init_OnlineOutline(opnameValue, out dt); + string value = ""; + if (dt != null) + { + if (dt.Rows.Count > 0) + { + value = dt.Rows[0]["工位状态"].ToString(); + } + } + text = "{\"value\":\"" + value + "\"}"; + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Init_OnlineOutline"); + } + return text; + } + + /// + /// 功能按钮---将在线,离线,屏蔽更新到数据库中 + /// + /// + private string Insert_OnlineOutline(string opnameValue, string selectValue) + { + string text = ""; + try + { + //string opnameValue = HttpContext.Current.Request["opnameValue"];//工位号 + //string selectValue = HttpContext.Current.Request["selectValue"];//选择的值 + if (selectValue == "") + { + selectValue = "0"; + } + int selectValueint = Convert.ToInt32(selectValue); + bool falg = MES.Insert_OnlineOutline(opnameValue, selectValueint); + if (falg) + { + text = "{\"falg\":\"1\"}"; + } + else + { + text = "{\"falg\":\"0\"}"; + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Insert_OnlineOutline"); + } + return text; + } + + /// + /// 合格放行 + /// + /// + private string functionButtonConfirmOk(string userName, string passWord) + { + string text = ""; + try + { + string roleFlag = ""; + string loginFlag = ""; + System.Data.DataTable dt_User = null; + //string userName = HttpContext.Current.Request["function_button_confirmOkGo_userName"]; + //string passWord = HttpContext.Current.Request["function_button_confirmOkGo_passWord"]; + + BaseDataSystemMES.UserInfo_Login(userName, passWord, out dt_User); + if (dt_User != null) + { + if (dt_User.Rows.Count == 1) + { + int roleCodSum = Convert.ToInt32(dt_User.Rows[0][0].ToString()); + bool IsOK = false; + RoleDistribution(roleCodSum, out IsOK); + if (IsOK == true) + { + roleFlag = "1"; + loginFlag = "1"; + } + else + { + roleFlag = "0"; + } + } + else + { + loginFlag = "0"; + } + } + else + { + loginFlag = "0"; + } + text = "{\"roleFlag\":\"" + roleFlag + "\",\"loginFlag\":\"" + loginFlag + "\"}"; + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:functionButtonConfirmOk"); + } + return text; + } + + /// + /// 看用户是否有权限访问该页面 + /// + /// + /// + private void RoleDistribution(int roleCodSum, out bool IsOK) + { + IsOK = false; + //登录工位MES的权限是256 如果role&256>0则有权限登录MES软件 + int roleCode = 64; + //ArrayList aList = new ArrayList(); + if ((roleCodSum & roleCode) > 0) + { + ////加了没用上 + //aList.Add(roleCode); + + switch (roleCode) + { + case 64: + { + //一级用户管理 + IsOK = true; + } + break; + + default: + break; + } + } + } + + /// + /// 选择订单_增加订单号 + /// + /// + private string InsertOrderNum(string orderlist, string opName) + { + //string orderlist = HttpContext.Current.Request["orderNum"]; + MES.OrderNum_Add(opName, orderlist); + return orderlist; + } + + /// + /// 选择订单_增加发动机型号 + /// + /// + private string InsertEngineNum(string opName, string enginetype, string enginetypecode) + { + string orderlist = ""; + //string enginetype = HttpContext.Current.Request["enginetype"]; + //string enginetypecode = HttpContext.Current.Request["enginetypecode"]; + int enginetypeID = Convert.ToInt32(enginetypecode); + MES.EngineNum_Add(opName, enginetype, enginetypeID); + return orderlist; + } + + /// + /// 物料拉动_确认接受 + /// + /// + private string AffirmReceive(string opName, string DistributionNums) + { + string text = ""; + try + { + bool falg = false; + //string DistributionNums = HttpContext.Current.Request["DistributionNums"]; + string[] array = DistributionNums.Split(','); + string DistributionNum = ""; + for (int i = 0; i < array.Length; i++) + { + DistributionNum = array[i]; + falg = MaterialPull.DistributionNum(opName, DistributionNum); + } + if (falg) + { + text = "{\"falg\":\"1\"}"; + } + else + { + text = "{\"falg\":\"0\"}"; + } + } + catch (Exception err) + { + //////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:AffirmReceive"); + } + return text; + } + + /// + /// 设备管理_设备保养记录增加 + /// + /// + private string equipmentmanagementSubmit(string opname, string mark) + { + string text = ""; + try + { + bool flag; + // string mark = HttpContext.Current.Request["mark"]; + flag = bizFacade.MES_MachineManage.Mes_MachineTakeCare_Insert(opname, mark); + if (flag) + { + text = "{\"flag\":\"1\"}"; + } + else + { + text = "{\"flag\":\"0\"}"; + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:equipmentmanagementSubmit"); + } + return text; + } + + /// + /// 获取对应工位的质量数据 + /// + /// + private string QualityDataSelect(string opName, string opname) + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + //string opName = HttpContext.Current.Request["value"]; + //string opname = HttpContext.Current.Request["opname"]; + MES.QualityDataSelect(opName, opname, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + qualitydata = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:QualityDataSelect"); + } + return qualitydata; + } + + + + /// 获取设备保养类型 + /// + /// + private string LoadMachineType(string opName) + { + string Maintain = ""; + try + { + System.Data.DataTable dt = null; + //string opName = HttpContext.Current.Request["value"]; + MES.LoadMachineType(opName, out dt); + if (dt.Rows.Count > 0) + { + Maintain = JsonHelper.DataTableToJson(dt); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:LoadMachineType"); + } + return Maintain; + } + + + /// 获取设备保养内容 + /// + /// + private string ShowMaintainData(string opName, string MachineType) + { + string Maintain = ""; + try + { + System.Data.DataTable dt = null; + //string opName = HttpContext.Current.Request["value"]; + //string MachineType = HttpContext.Current.Request["machinetype"]; + MES.ShowMaintainData(opName, MachineType, out dt); + if (dt.Rows.Count > 0) + { + Maintain = JsonHelper.CreateJsonParameters(dt); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:ShowMaintainData"); + } + return Maintain; + } + + /// + /// 获取设备保养图片 + /// + /// + private string ShowMaintainPic(string opName, string MachineType) + { + string Maintain = ""; + try + { + //string opName = HttpContext.Current.Request["value"]; + //string MachineType = HttpContext.Current.Request["machinetype"]; + byte[] imgBytesIn; + MES.GetMaintainImageFile(opName, MachineType, out imgBytesIn); + if (imgBytesIn == null) + { + return Maintain; + } + Maintain = Convert.ToBase64String(imgBytesIn); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:ShowMaintainPic"); + } + return Maintain; + } + + /// + /// 物料ando复位 + /// + /// + private string submitAndoMaterialReset(string opname, string andoTypeCode, string andoListCode, string number) + { + string text = ""; + try + { + string number1 = ""; + //string andoTypeCode = HttpContext.Current.Request["andoTypeCode"]; + //string andoListCode = HttpContext.Current.Request["andoListCode"]; + //string number = HttpContext.Current.Request["number"]; + + string[] number_array = number.Split(','); + string number_value = ""; + string callInfo = "复位信息"; + + for (int i = 0; i < number_array.Length - 1; i++) + { + number_value = number_array[i].ToString(); + string[] valuelist = number_value.Split('_'); + if (valuelist.Length >= 4) + { + number1 = valuelist[3]; + bizFacade.ando_matertial.AndoMaterialReset(opname, number1, andoTypeCode, andoListCode, callInfo); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:submitAndoMaterialReset"); + } + + return text; + } + + /// + /// ando界面_质量ando复位 + /// + /// + private string submitAndoQualityReset(string opname, string andoTypeCode, string andoListCode, string number) + { + string text = ""; + try + { + string number1 = ""; + //string andoTypeCode = HttpContext.Current.Request["andoTypeCode"]; + //string andoListCode = HttpContext.Current.Request["andoListCode"]; + //string number = HttpContext.Current.Request["number"]; + string[] valuelist = number.Split('_'); + if (valuelist.Length >= 4) + { + number1 = valuelist[3]; + } + + //呼叫内容 + string callInfo = "复位信息"; + bool flag = bizFacade.ando_matertial.AndoMaterialReset(opname, number1, andoTypeCode, andoListCode, callInfo); + if (flag) + { + text = "{\"flag\":\"1\"}"; + } + else + { + text = "{\"flag\":\"0\"}"; + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:submitAndoQualityReset"); + } + return text; + } + + /// + /// 物料ando_更新ando的具体的tabel + /// + /// + private string updataAndoMaterialTabel(string opname, string andoTypeCode) + { + string text = ""; + try + { + //string andoTypeCode = HttpContext.Current.Request["andoTypeCode"]; + text = bizFacade.ando_matertial.CreatAndo_Material_table(opname, andoTypeCode); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:updataAndoMaterialTabel"); + } + return text; + } + + /// + /// 质量ando_更新ando的具体的tabel + /// + /// + private string updataAndoQualityTabel(string opname, string andoTypeCode) + { + string text = ""; + try + { + // string andoTypeCode = HttpContext.Current.Request["andoTypeCode"]; + text = bizFacade.ando_quality.CreatAndo_quality_table(opname, andoTypeCode); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:updataAndoQualityTabel"); + } + return text; + } + + /// + /// ando界面_提交物料ando信息(插入呼叫信息) + /// + /// + private string submitAndoMaterialCall(string opname, string andoTypeCode, string andoListCode, string number) + { + string text = ""; + try + { + string number1 = ""; + //System.Data.DataTable tb; + //string andoTypeCode = HttpContext.Current.Request["andoTypeCode"]; + //string andoListCode = HttpContext.Current.Request["andoListCode"]; + //string number = HttpContext.Current.Request["number"]; + string[] number_array = number.Split(','); + string number_value = ""; + string callInfo = "0"; + int callCount = 0; + string cardNumber = "0"; + string noNumber = "0"; + + for (int i = 0; i < number_array.Length - 1; i++) + { + number_value = number_array[i].ToString(); + string[] valuelist = number_value.Split('_'); + if (valuelist.Length >= 4) + { + number1 = valuelist[3]; + bizFacade.ando_matertial.andoMaterialCall(opname, andoTypeCode, andoListCode, number1, callInfo, callCount, cardNumber, noNumber); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:submitAndoMaterialCall"); + } + return text; + } + + /// + /// 安东界面_质量ando_呼叫提交 + /// + /// + private string submitAndoQualityCall() + { + string text = ""; + //string number1 = ""; + //string opname = HttpContext.Current.Request["opname"]; + //string andoTypeCode = HttpContext.Current.Request["andoTypeCode"]; + //string andoListCode = HttpContext.Current.Request["andoListCode"]; + //string number = HttpContext.Current.Request["number"]; + //string[] valuelist = number.Split('_'); + //if (valuelist.Length >= 4) + //{ + // number1 = valuelist[3]; + //} + //string callInfo = "0"; + //int callCount = 5; + //string cardNumber = "0"; + //string noNumber = "0"; + //bool flag = bizFacade.ando_matertial.andoMaterialCall(opname, andoTypeCode, andoListCode, number1, callInfo, callCount, cardNumber, noNumber); + //if (flag) + //{ + // text = "{\"flag\":\"1\"}"; + //} + //else + //{ + // text = "{\"flag\":\"0\"}"; + //} + return text; + } + + /// + /// 查询物料ando条数,为了左移动的 + /// + /// + private string InitMaterailAndoCount(string opname, string andoTypeCode) + { + string text = ""; + try + { + System.Data.DataTable dt_material; + System.Data.DataTable dt_quality; + System.Data.DataTable dt_machine; + //string andoTypeCode = HttpContext.Current.Request["andoTypeCode"]; + //查询物料ando具体的button个数 + bizFacade.ando_matertial.andoListSelect(opname, "1", out dt_material); + int count_material = 0; + + //不为空 + if (dt_material != null) + { + if (dt_material.Rows.Count == 0) + { + count_material = 0; + } + else + { + count_material = dt_material.Rows.Count; + } + } + //查询质量ando具体的button个数 + bizFacade.ando_matertial.andoListSelect(opname, "2", out dt_quality); + int count_quality = 0; + if (dt_quality != null) + { + if (dt_quality.Rows.Count == 0) + { + count_quality = 0; + } + else + { + count_quality = dt_quality.Rows.Count; + } + } + //查询设备ando具体的button个数 + bizFacade.ando_matertial.andoListSelect(opname, "3", out dt_machine); + + int count_machine = 0; + if (dt_machine != null) + { + if (dt_machine.Rows.Count == 0) + { + count_machine = 0; + } + else + { + count_machine = dt_machine.Rows.Count; + } + } + text = "{\"material_count\":\"" + count_material + "\",\"machine_count\":\"" + count_machine + "\",\"quality_count\":\"" + count_quality + "\"}"; + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:InitMaterailAndoCount"); + } + return text; + } + + /// + /// 初始化ando + /// + /// + private string InitMaterailAndo(string opname) + { + string text = ""; + try + { + text = bizFacade.ando_load.ando_loading(opname); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:InitMaterailAndo"); + } + return text; + } + + /// + /// ando_查询具体ando类型明细 + /// + /// + private string InitComboboxAndoDetail() + { + string text = ""; + //System.Data.DataTable dt = null; + //string andoType="1"; + //bizFacade.ando.select_ando_detail(andoType, out dt); + //text = JsonHelper.DataTableToJson(dt); + return text; + } + + /// + /// 初始化装配线MES + /// + /// + private string MesloadingSelect(string opname, string languageType, string mainModule) + { + string text = ""; + try + { + System.Data.DataTable dt = null; + + //string languageType = HttpContext.Current.Request["mainModule"]; + //string mainModule = HttpContext.Current.Request["MesWebCode"]; + bizFacade.MES_Loading.MES_Loading_select(languageType, mainModule, opname, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = JsonHelper.DataTableToJson(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MesloadingSelect"); + } + return text; + } + + /// + /// 查询托盘信息 + /// + /// + private string MobySelect(string OpName) + { + string data = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string workCode = ""; // 制造编号 + string projectName = ""; // 项目名称 + string splitCode = ""; // 间隔号 + string unidCode = ""; // 单元号 + string engineType = ""; // 本体类型 + string engineTypeModel = ""; // 附件类型 + string startTime = ""; // 开始时间 + MES.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, + out workCode, out projectName, out splitCode, out unidCode, out engineType, out engineTypeModel,out startTime); + data = orderNum + "&" + EngineTypeID + "&" + EngineType + "&" + EngineID + "&" + PartPallet_Code + "&" + IsrepairBarcode + "&" + repairBarcode + "&" + + workCode + "&" + projectName + "&" + splitCode + "&" + unidCode + "&" + engineType + "&" + engineTypeModel + "&" + startTime; + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MobySelect"); + } + return data; + } + + /// + /// 查询操作图片 + /// + /// + private string PictureShow(string OpName) + { + string data = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string workCode = ""; // 制造编号 + string projectName = ""; // 项目名称 + string splitCode = ""; // 间隔号 + string unidCode = ""; // 单元号 + string engineType = ""; // 本体类型 + string engineTypeModel = ""; // 附件类型 + string startTime = ""; // 开始时间 + MES.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, + out workCode, out projectName, out splitCode, out unidCode, out engineType, out engineTypeModel, out startTime); + byte[] imgBytesIn; + BaseDataSystemMES.GetImageFile(OpName, EngineTypeID.ToString(), out imgBytesIn); + if (imgBytesIn == null) + { + return data; + } + data = Convert.ToBase64String(imgBytesIn); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:PictureShow"); + } + return data; + } + + /// + /// 查询物料 + /// + /// + private string MaterialList(string OpName) + { + string jsonStr_Materail = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string workCode = ""; // 制造编号 + string projectName = ""; // 项目名称 + string splitCode = ""; // 间隔号 + string unidCode = ""; // 单元号 + string engineType = ""; // 本体类型 + string engineTypeModel = ""; // 附件类型 + string startTime = ""; // 开始时间 + MES.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, + out workCode, out projectName, out splitCode, out unidCode, out engineType, out engineTypeModel, out startTime); + DataTable dt_Material; + + MES.PartMaterialVerify_Select(OpName, EngineTypeID, EngineType, out dt_Material); + if (dt_Material != null) + { + if (dt_Material.Rows.Count > 0) + { + jsonStr_Materail = JsonHelper.CreateJsonParameters(dt_Material); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialList"); + } + return jsonStr_Materail; + } + + /// + /// 查询物料库存信息 + /// + /// + private string MaterialListStock(string OpName) + { + string jsonStr_Materail = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string workCode = ""; // 制造编号 + string projectName = ""; // 项目名称 + string splitCode = ""; // 间隔号 + string unidCode = ""; // 单元号 + string engineType = ""; // 本体类型 + string engineTypeModel = ""; // 附件类型 + string startTime = ""; // 开始时间 + MES.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, + out workCode, out projectName, out splitCode, out unidCode, out engineType, out engineTypeModel, out startTime); + DataTable dt_Material; + + MES.PartMaterialVerify_Select(OpName, EngineTypeID, EngineType, out dt_Material); + if (dt_Material != null) + { + if (dt_Material.Rows.Count > 0) + { + jsonStr_Materail = JsonHelper.CreateJsonParameters(dt_Material); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialList"); + } + return jsonStr_Materail; + } + + /// + /// 查询操作指南 + /// + /// + private string ProcessList(string OpName) + { + string jsonStr_Process = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string workCode = ""; // 制造编号 + string projectName = ""; // 项目名称 + string splitCode = ""; // 间隔号 + string unidCode = ""; // 单元号 + string engineType = ""; // 本体类型 + string engineTypeModel = ""; // 附件类型 + string startTime = ""; // 开始时间 + MES.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, + out workCode, out projectName, out splitCode, out unidCode, out engineType, out engineTypeModel, out startTime); + + DataTable dt_Proccess; + MES.Process_Select(OpName, EngineTypeID, EngineType, out dt_Proccess); + if (dt_Proccess != null) + { + if (dt_Proccess.Rows.Count > 0) + { + jsonStr_Process = JsonHelper.CreateJsonParameters(dt_Proccess); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:ProcessList"); + } + return jsonStr_Process; + } + + /// + /// 创建动态div + /// + /// + private string ShaftPotion_Select(string OpName) + { + string text = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string workCode = ""; // 制造编号 + string projectName = ""; // 项目名称 + string splitCode = ""; // 间隔号 + string unidCode = ""; // 单元号 + string engineType = ""; // 本体类型 + string engineTypeModel = ""; // 附件类型 + string startTime = ""; // 开始时间 + MES.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, + out workCode, out projectName, out splitCode, out unidCode, out engineType, out engineTypeModel, out startTime); + + DataTable dt; + MES.ShaftPositionSelect(OpName, EngineTypeID, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = JsonHelper.DataTableToJson(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:ShaftPotion_Select"); + } + return text; + } + + /// + /// 实时显示质量数据 + /// + /// + private string Quality_Select(string OpName) + { + string text = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string workCode = ""; // 制造编号 + string projectName = ""; // 项目名称 + string splitCode = ""; // 间隔号 + string unidCode = ""; // 单元号 + string engineType = ""; // 本体类型 + string engineTypeModel = ""; // 附件类型 + string startTime = ""; // 开始时间 + MES.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, + out workCode, out projectName, out splitCode, out unidCode, out engineType, out engineTypeModel, out startTime); + + DataTable dt; + MES.QualitySelect(OpName, EngineID, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Quality_Select"); + } + return text; + } + + /// + /// 获得工步属性 + /// + /// + private string StepProperty(string opName) + { + string stepProperty = "512"; + System.Data.DataTable dt = null; + bizFacade.UserLogin.GetUrl(opName, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + stepProperty = dt.Rows[0]["工步属性"].ToString(); + } + } + return stepProperty; + } + + /// + /// 获得订单信息 + /// + /// + private string OrderFormList(string opName) + { + string orderlist = ""; + try + { + System.Data.DataTable dt = null; + MES.OrderFormList_Select(opName, out dt); + //对其进行判断 + if (dt != null) + { + if (dt.Rows.Count > 0) + { + int planCount;//计划数量 + int finishCount;//完成数量 + int isOverCount;//是否超标,0表示未完成,1表示正好完成,2表示超过预期 + int isSelect;//选择标志 + int isCanSelect;//是否有订单选择权限 + string status;//状态 + for (int i = 0; i < dt.Rows.Count; i++) + { + planCount = 0; + finishCount = 0; + isOverCount = 0; + isSelect = 0; + isCanSelect = 0; + status = ""; + + if (dt.Rows[i]["计划数量"].ToString() != "") + { + planCount = Convert.ToInt32(dt.Rows[i]["计划数量"]); + } + if (dt.Rows[i]["完成数量"].ToString() != "") + { + finishCount = Convert.ToInt32(dt.Rows[i]["完成数量"]); + } + if (dt.Rows[i]["选择标志"].ToString() != "") + { + isSelect = Convert.ToInt32(dt.Rows[i]["选择标志"]); + } + if (dt.Rows[i]["订单选择权限"].ToString() != "") + { + isCanSelect = Convert.ToInt32(dt.Rows[i]["订单选择权限"]); + } + if (isSelect == 1)//表示选择当前订单,显示"√" + { + status = "√"; + } + if (finishCount == planCount)//完成数量>计划数量则表示超标 + { + isOverCount = 1; + } + if (finishCount > planCount)//完成数量>计划数量则表示超标 + { + isOverCount = 2; + } + //重新赋值 + dt.Rows[i]["状态"] = status; + dt.Rows[i]["是否超标"] = isOverCount;//0表示未完成,1表示正好完成,2表示超过预期 + dt.Rows[i]["选择标志"] = isSelect; + dt.Rows[i]["订单选择权限"] = isCanSelect; + } + } + } + + orderlist = JsonHelper.CreateJsonParameters(dt); + //orderlist = CreateJsonParameters(dt); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:OrderFormList"); + } + return orderlist; + } + + private static string CreateJsonParameters(DataTable dt) + { + StringBuilder JsonString = new StringBuilder(); + //Exception Handling + if (dt != null) + { + JsonString.Append("{ "); + JsonString.Append("\"total\":"); + JsonString.Append(dt.Rows.Count); + JsonString.Append(","); + JsonString.Append("\"rows\":[ "); + for (int i = 0; i < dt.Rows.Count; i++) + { + JsonString.Append("{ "); + for (int j = 0; j < dt.Columns.Count; j++) + { + if (j < dt.Columns.Count - 1) + { + //if (dt.Rows[i][j] == DBNull.Value) continue; + if (dt.Columns[j].DataType == typeof(bool)) + { + JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + + dt.Rows[i][j].ToString().ToLower() + ","); + } + else if (dt.Columns[j].DataType == typeof(string)) + { + JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\","); + } + else + { + JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\","); + } + } + else if (j == dt.Columns.Count - 1) + { + //if (dt.Rows[i][j] == DBNull.Value) continue; + if (dt.Columns[j].DataType == typeof(bool)) + { + JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + + dt.Rows[i][j].ToString().ToLower()); + } + else if (dt.Columns[j].DataType == typeof(string)) + { + JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\""); + } + else + { + JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\""); + } + } + } + /*end Of String*/ + if (i == dt.Rows.Count - 1) + { + JsonString.Append("} "); + } + else + { + JsonString.Append("}, "); + } + } + JsonString.Append("]"); + JsonString.Append("}"); + return JsonString.ToString().Replace("\n", ""); + } + else + { + return null; + } + } + + /// + /// 获得机型 + /// + /// + private string Orderenginetypeselect() + { + string enginetypelist = ""; + try + { + System.Data.DataTable dt = null; + ShaftPosition.EngineType_Select(out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + enginetypelist = JsonHelper.DataTableToJson(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Orderenginetypeselect"); + } + return enginetypelist; + } + + /// + /// 物料拉动_获取单号 + /// + /// + private string MaterialPush_ListNumer(string opName) + { + string listNumber = ""; + try + { + System.Data.DataTable dt = null; + MaterialPull.MaterialPush_ListNumer_Select(0, "", 1, opName, 0, "", out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + listNumber = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialPush_ListNumer"); + } + return listNumber; + } + + /// + /// 物料拉动_根据单号获取详细信息 + /// + /// + private string MaterialPush_Details(string opname, string listNumer) + { + string listDetails = ""; + try + { + System.Data.DataTable dt = null; + //单号 + //string listNumer = HttpContext.Current.Request["listNumber"]; + MaterialPull.MaterialPush_Details_Select(listNumer, opname, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + listDetails = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialPush_Details"); + } + return listDetails; + } + + /// + /// 物料拉动_根据单号获取详细信息 + /// + /// + private string QualityDataButton_bgColor_Select(string opname) + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //单号 + MES.QualityDataButton_bgColor_Select(opname, out dt); + if (dt != null) + { + if (dt.Rows.Count >= 0) + { + text = Buttons.Createbuttons(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:QualityDataButton_bgColor_Select"); + } + return text; + } + + /// + /// 消息提醒 + /// + /// + private string ShowWindowNotice(string opname) + { + string text = ""; + try + { + System.Data.DataTable dt = null; + MES.ShowWindowNotice(opname, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = JsonHelper.DataTableToJson(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:ShowWindowNotice"); + } + return text; + } + + /// + /// 消息滚动 + /// + /// + private string ShowLEDNotice(string opname) + { + string text = ""; + try + { + System.Data.DataTable dt = null; + MES.ShowLEDNotice(opname, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = JsonHelper.DataTableToJson(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:ShowLEDNotice"); + } + return text; + } + + /// + /// 获取生产订单 + /// + /// + private string GetOrderForm(string opname) + { + string text = ""; + try + { + System.Data.DataTable dt = null; + MES.OpName_MIS_OrderForm_Select(opname, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = dt.Rows[0]["订单号"].ToString(); + return text; + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:GetOrderForm"); + } + return text; + } + + /// + /// 获取发动机型号 + /// + /// + private string GetEngineType(string opname) + { + string text = ""; + try + { + System.Data.DataTable dt = null; + MES.OpName_MIS_EngineType_Select(opname, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = dt.Rows[0]["产品型号代码"].ToString() + "&" + dt.Rows[0]["发动机型号"].ToString(); + return text; + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:GetEngineType"); + } + return ("" + "&" + ""); + } + + /// + /// + /// + /// + private string ShowOpNameMessage(string opname) + { + string text = ""; + try + { + System.Data.DataTable dt = null; + BaseDataSystemMES.GetOpNameByOpName(opname, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = dt.Rows[0]["工序名称"].ToString() + "&" + dt.Rows[0]["操作者工号"].ToString() + "&" + dt.Rows[0]["是否启用物料拉动"].ToString(); + return text; + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:ShowOpNameMessage"); + } + return ("" + "&" + "" + "&" + "0"); + } + + /// + /// 系统初始化时 + /// + /// + private string WebLoginIn(string opname) + { + string text = ""; + MES.WebLoginIn(opname); + return text; + } + + /// + /// 物料检测 + /// + /// + private string MaterialCheckPosition(string OpName) + { + string text = ""; + try + { + DataTable dt; + + MES.MaterialCheckSelect(OpName, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = JsonHelper.DataTableToJson(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialCheckPosition"); + } + return text; + } + + /// + /// 获取对应工位的物料数据 + /// + /// + private string MaterialDataSelect(string opName, string opname) + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + //string opName = HttpContext.Current.Request["value"]; + //string opname = HttpContext.Current.Request["opname"]; + MES.MaterialDataSelect(opName, opname, out dt); + if (dt != null) + { + //if (dt.Rows.Count > 0) + { + qualitydata = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialDataSelect"); + } + return qualitydata; + } + + /// + /// 电子看板_装配零件_查询 + /// + /// + private string MaterialSelect(string opName, string enginetypeid, string enginetype) + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //string enginetypeid = HttpContext.Current.Request["enginetypeid"]; + //string enginetype = HttpContext.Current.Request["enginetype"]; + ShaftPosition.Material_Select(opName, enginetypeid, enginetype, out dt); + + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialSelect"); + } + return text; + } + + public string GetLoginOutUrl() + { + string url = System.Configuration.ConfigurationManager.AppSettings["Linklogin"].ToString(); + return url; + } + + /// + /// 手动修改批次信息 + /// + /// + private string MaterialManualUpdateBetch(string opName,string arrays, string enginetype) + { + string text = ""; + try + { + //string arrays = HttpContext.Current.Request["arrays"];//组合 + //string enginetype = HttpContext.Current.Request["enginetype"];//产品型号 + + //创建datatable + DataRow row; + DataTable dt = new DataTable(); + dt.Columns.AddRange(new DataColumn[] { + new DataColumn("零件图号"), + new DataColumn("零件批号"), + new DataColumn("生产厂家") }); + + string[] collection = arrays.Split('^');//获取 + if (collection.Length > 0) + { + for (int i = 0; i < collection.Length; i++) + { + string a = collection[i]; + string[] a_array = a.Split('&'); + if (a_array.Length > 2) + { + row = dt.NewRow(); + string materialid = a_array[0].ToString(); + string betch = a_array[1].ToString(); + string factory = a_array[2].ToString(); + row["零件图号"] = materialid; + row["零件批号"] = betch; + row["生产厂家"] = factory; + dt.Rows.Add(row); + } + } + + //修改到数据库 + if (dt != null) + { + if (dt.Rows.Count > 0) + { + MES.Material_Betch_Update(opName, enginetype, dt); + } + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialManualUpdateBetch"); + } + return text; + } + + /// + /// 获得返修数量信息 + /// + /// + private string GetRepaireNum(string opname) + { + string text = ""; + try + { + System.Data.DataTable dt = null; + MES.OpName_MIS_RepiareNum_Select(opname, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = dt.Rows[0]["当前数量"].ToString() + "&" + dt.Rows[0]["设置数量"].ToString(); + return text; + } + else + { + return text = "0&0"; + } + } + else + { + return text = "0&0"; + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:GetEngineType"); + } + return ("" + "&" + ""); + } + + /// + /// 插入返修数量 + /// + /// + private string Insert_RepiareNum(string opnameValue, string selectValue) + { + string text = ""; + try + { + //string selectValue = HttpContext.Current.Request["CurrentNum"];//选择值 + if (selectValue == "") + { + selectValue = "0"; + } + int selectValueint = Convert.ToInt32(selectValue); + bool falg = MES.Insert_RepiareNum(opnameValue, selectValueint); + if (falg) + { + text = "{\"falg\":\"1\"}"; + } + else + { + text = "{\"falg\":\"0\"}"; + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Insert_RepiareNum"); + } + return text; + } + + /// + /// 初始化返修选择tree数据 + /// + /// + private string Init_TreeData(string opnameValue) + { + string text = ""; + try + { + System.Data.DataTable dt; + //string opnameValue = HttpContext.Current.Request["Opname"];//工位号 + MES.Init_TreeData(opnameValue, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Init_TreeData"); + } + return text; + } + + /// + /// 返修上线--初始化质量数据 + /// + /// + private string Quality_Select_Repair(string OpName, string EngineID) + { + string text = ""; + try + { + DataTable dt; + MES.QualitySelect(OpName, EngineID, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Quality_Select_Repair"); + } + return text; + } + + /// + /// 返修上线-将选择的根节点数据更新到数据库中 + /// + /// + private string Insert_selectTreeData(string opName, string engineTypeId, string selectIdsArray) + { + string text = ""; + try + { + //string engineTypeId = HttpContext.Current.Request["engineTypeId"];//产品型号代码 + //string selectIdsArray = HttpContext.Current.Request["selectId"];//选中的节点数据数据 + //创建datatable + DataRow row; + DataTable dt = new DataTable(); + dt.Columns.AddRange(new DataColumn[] { + new DataColumn("工位号"), + new DataColumn("产品型号代码"), + new DataColumn("序号") }); + string[] collection = selectIdsArray.Split(',');//获取 + if (collection.Length > 0) + { + for (int i = 0; i < collection.Length - 1; i++) + { + string idValue = collection[i]; + row = dt.NewRow(); + string opNameValue = opName; + int engineTypeIdValue = Convert.ToInt32(engineTypeId); + int selectId = Convert.ToInt32(idValue); + row["工位号"] = opNameValue; + row["产品型号代码"] = engineTypeIdValue; + row["序号"] = selectId; + dt.Rows.Add(row); + } + //修改到数据库 + if (dt != null) + { + if (dt.Rows.Count > 0) + { + MES.Insert_selectTreeData(dt); + } + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Insert_selectTreeData"); + } + + return text; + } + + /// + /// 质量报警_根据按钮获取详细信息 20170318 + /// + /// + private string QualityDataButton_bgColor_alert_Select(string opname) + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //单号 + //string opname = HttpContext.Current.Request["value"]; + //string lineout_barcode = HttpContext.Current.Request["lineout_barcode"]; + MES.QualityDataButton_bgColor_alert_Select(opname, out dt); + if (dt != null) + { + if (dt.Rows.Count >= 0) + { + text = Buttons.Createbuttons_alert(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:QualityDataButton_bgColor_alert_Select"); + } + return text; + } + + /// + /// 获取对应工位的物料数据_根据发动机 20170319 + /// + /// + private string MaterialDataSelect_F_EnergineID(string opname, string energineID) + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + //string energineID = HttpContext.Current.Request["value"]; + MES.MaterialDataSelect_F_EnergineID(opname, energineID, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + qualitydata = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialDataSelect"); + } + return qualitydata; + } + + /// + /// 获取操作指南的PDF路径 + /// + /// + private string GetPdfSrc(string opName) + { + string PdfSrc = ""; + try + { + System.Data.DataTable dt = null; + + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string workCode = ""; // 制造编号 + string projectName = ""; // 项目名称 + string splitCode = ""; // 间隔号 + string unidCode = ""; // 单元号 + string engineType = ""; // 本体类型 + string engineTypeModel = ""; // 附件类型 + string startTime = ""; // 开始时间 + MES.Moby_Select(opName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, + out workCode, out projectName, out splitCode, out unidCode, out engineType, out engineTypeModel, out startTime); + BaseDataSystemMES.GetPdfSrc(opName, EngineTypeID.ToString(), out PdfSrc); + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:GetPdfSrc"); + } + return PdfSrc; + } + + } +} \ No newline at end of file diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Tab_OperateGuid.cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Tab_OperateGuid.cs new file mode 100644 index 0000000..e2dcfd6 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Tab_OperateGuid.cs @@ -0,0 +1,232 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MisWebInterface + { + + // /*该js文件用于处理"操作指南"业务逻辑处理*/ + + // bool IsShow = false; + // //是否显示绿脸_全局变量 + // bool IsShowGreenSmile = false; + // //是否显示红脸_全局变量 + // bool IsShowRedSmile = false; + // //显示绿色笑脸 + + // //显示红色笑脸 + + + // //显示绿色笑脸 + // void ShowGreenSmile_match() + // { + // $('#RedAndGreenSmile_match').attr("src", ""); + // if (IsShowGreenSmile_match == true) + // { + // $('#RedAndGreenSmile_match').attr("src", "../images/img_MatchSuccess.png"); + // $('#RedAndGreenDiv_match').css({ + // "display": "block" + // }); + // IsShowGreenSmile_match = false; + // } + // else + // { + // $('#RedAndGreenDiv_match').css({ + // "display": "none" + // }); //设置不显示 + // } + // } + // //显示红色笑脸 + // void ShowRedSmile_match() + // { + // $('#RedAndGreenSmile_match').attr("src", ""); + // if (IsShowRedSmile_match == true) + // { + // $('#RedAndGreenSmile_match').attr("src", "../images/img_MatchFail.png"); + // $('#RedAndGreenDiv_match').css({ + // "display": "block" + // }); //设置显示 + // IsShowRedSmile_match = false; + // } + // else + // { + // $('#RedAndGreenDiv_match').css({ + // "display": "none" + // }); //设置不显示 + // } + // } + + // //初始化工艺卡 + // void initoperationcard() + // { + // var cardwidth = $("#div_tab_operationcard").width(); + // var cardheight = $("#div_tab_operationcard").height(); + // $("#pdf_operationcard").media({ width: cardwidth, height: cardheight }); + // } + + // //初始化操作指南 + // void initProcessData() + // { + // var serialNumWidth = $("#div_tab_assembly_craft").width() * 0.1; + // var processWidth = $("#div_tab_assembly_craft").width() * 0.4; + // var technologyRequestWidth = $("#div_tab_assembly_craft").width() * 0.3; + // var processPropetyWidth = $("#div_tab_assembly_craft").width() * 0.2; + // $('#datagrid_processinfo').datagrid({ + // url: '', + // title: '', + // sortOrder: 'desc', //升序降序 //2017-01-03 + // idField: 'JSON_工步号', + // fit: true, + // fitColumns: true, + // rownumbers: true, + // columns: + // [[ + // { title: "序号", field: 'JSON_工步号', width: 70, align: 'left', hidden: true }, + // { title: '工序内容', field: 'JSON_操作内容', width: 264, align: 'left', resizable: false }, + // { title: '工步属性', field: 'JSON_工步属性名称', width: 180, align: 'left', resizable: false } + // ]], + // nowrap: false, + // fit: true, + // singleSelect: true, + // rowStyler: function(rowIndex, rowData) { + // if (rowIndex % 2 == 0) + // { + // return 'background-color:#D0D8E8; height:45px'; + // } + // else + // { + // return 'background-color:#E9EDF4; height:45px'; + // } + // } + // }); + // } + + + + + // //初始化物料(物料拉动模块) + // void initAssembleDataMaterrial() + // { + // var serialNumWidth = $("#div_tab_assembly_material").width() * 0.1; + // var materialNumWidth = $("#div_tab_assembly_material").width() * 0.2; + // var materialNameWidth = $("#div_tab_assembly_material").width() * 0.2; + // var demandCountWidth = $("#div_tab_assembly_material").width() * 0.1; + // var reserveCountWidth = $("#div_tab_assembly_material").width() * 0.2; + // var batchNumWidth = $("#div_tab_assembly_material").width() * 0.2; + // $('#datagridview_div_tab_distributematerrial').datagrid({ + // url: '', + // title: '', + // idField: 'JSON_标号', + // columns: + // [[ + // { title: '序号', field: 'JSON_标号', width: 60, align: 'left', hidden: true }, + // { title: '零件图号', field: 'JSON_零件图号', width: 150, align: 'left', resizable: false }, + // { title: '零件名称', field: 'JSON_零件名称', width: 150, align: 'left', resizable: false }, + // { title: '零件数量', field: 'JSON_零件数量', width: 60, align: 'left', resizable: false }, + // { title: '库存数量', field: 'JSON_库存数量', width: 60, align: 'left', hidden: false }, + // { title: '卡片条码', field: 'JSON_卡片条码', width: 150, align: 'left', hidden: false }, + // ]], + // nowrap: false, + // fit: true,fitColumns: true, + // singleSelect: true, + // rownumbers: true + // }); + // } + + //显示操作指南 + string ReceivedSignal_ProcessList(string opName) + { + + //url: '../submit/OpName.ashx?type=ProcessList&value=' + opName, + var responseStr = _MesWebFun_base.ProcessRequest("ProcessList", opName); + return responseStr; + + } + + //显示物料 + string ReceivedSignal_MaterialList(string opName) + { + // initAssembleData(); + // url: '../submit/OpName.ashx?type=MaterialList&value=' + opName, + var responseStr = _MesWebFun_base.ProcessRequest("MaterialList", opName); + return responseStr; + + } + + //显示操作图片√ + string ReceivedSignal_PictureShow(string opName) + { + //url: '../submit/OpName.ashx?type=PictureShow&value=' + opName, + var responseStr = _MesWebFun_base.ProcessRequest("PictureShow", opName); + return responseStr; + + } + + // void pdf_operationcardshowORhidden(title) + // { + // $("#div_tab_operationcard").toggle(); + // var tab = $('#div_tab').tabs('getSelected'); + // var launageType = $("#Hidden_language").val(); + // if (launageType == 1) + // { + // if (tab.title == "操作指南") + // { + // $('#div_tab').tabs('update', { + // tab: tab, + // options: + // { + // title: "工艺卡" // 新tab的title + // } + // }); + // } + // else + // { + // $('#div_tab').tabs('update', { + // tab: tab, + // options: + // { + // title: "操作指南" // 新tab的title + // } + // }); + // } + // } + // if (launageType == 2) + // { + // if (tab.title == "OperageGuid") + // { + // $('#div_tab').tabs('update', { + // tab: tab, + // options: + // { + // title: "ProcessCard" // 新tab的title + // } + // }); + // } + // else + // { + // $('#div_tab').tabs('update', { + // tab: tab, + // options: + // { + // title: "OperageGuid" // 新tab的title + // } + // }); + // } + // } + // } + + + + + + + + + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(2).cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(2).cs new file mode 100644 index 0000000..d848117 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(2).cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MisWebInterface + { + + + + + + + + + + + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(3).cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(3).cs new file mode 100644 index 0000000..748cad9 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(3).cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +////using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MisWebInterface + { + + + + + + + + + + + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(4).cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(4).cs new file mode 100644 index 0000000..d848117 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(4).cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MisWebInterface + { + + + + + + + + + + + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(5).cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(5).cs new file mode 100644 index 0000000..d848117 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(5).cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MisWebInterface + { + + + + + + + + + + + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(6).cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(6).cs new file mode 100644 index 0000000..d848117 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(6).cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MisWebInterface + { + + + + + + + + + + + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(7).cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(7).cs new file mode 100644 index 0000000..d848117 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(7).cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MisWebInterface + { + + + + + + + + + + + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(8).cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(8).cs new file mode 100644 index 0000000..d848117 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(8).cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MisWebInterface + { + + + + + + + + + + + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(9).cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(9).cs new file mode 100644 index 0000000..ddde9bb --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制(9).cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//////using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MisWebInterface + { + + + + + + + + + + + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制.cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制.cs new file mode 100644 index 0000000..748cad9 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制 - 复制.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +////using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MisWebInterface + { + + + + + + + + + + + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制.cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制.cs new file mode 100644 index 0000000..d848117 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/WWW - 复制.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MisWebInterface + { + + + + + + + + + + + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Common_Barcode.cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Common_Barcode.cs new file mode 100644 index 0000000..4553b12 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Common_Barcode.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MisWebInterface + { + + + + /*该js文件用于处理显示"条码"业务逻辑处理*/ + + //MES主界面_扫描条码_点击扫描条码事件 + void scanbarcodesubmit() + { + // var opName = $("#tbx_opname").val(); + // var value = $("#tbx_scanbarcode").val(); + // var sendmessage = "MSG,Barcode|" + opName + "|" + value; + // sendMessage(sendmessage); + //$.messager.show({ + // title: '提示', + // msg: '条码扫描成功!', + // timeout: 2000, + // showType: 'slide' + //}); + + } + + + + + + + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Common_ShowEngineID.cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Common_ShowEngineID.cs new file mode 100644 index 0000000..448c558 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Common_ShowEngineID.cs @@ -0,0 +1,175 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MisWebInterface + { + + // /*该js文件用于处理显示"工件信息"业务逻辑处理*/ + // string isOpenMaterialPush = "0"; //是否启用物料拉动 + + // //显示托盘信息 + // void ShowPalletInfo(string m_Value) + // { + // var s_valueArrays = m_Value.Split('&'); + // if (s_valueArrays.Length > 0) + // { + // var s_palletinfo = s_valueArrays[0]; //托盘状态 + // switch (s_palletinfo) + // { + // case "0": //托盘错误 + // //$('#txt_status').val('托盘错误'); + // //$('#txt_status').css({ 'background-color': 'red' }); + // break; + // case "1": //合格 + // //$('#txt_status').val('合格'); + // //$('#txt_status').css({ 'background-color': 'green' }); + // break; + // case "2": //不合格 + // //$('#txt_status').val('不合格'); + // //$('#txt_status').css({ 'background-color': 'red' }); + // break; + // case "3": //返修 + // //$('#txt_status').val('返修'); + // //$('#txt_status').css({ 'background-color': 'yellow' }); + // break; + // case "4": //空托盘 + // //$('#txt_status').val('空托盘'); + // //$('#txt_status').css({ 'background-color': 'white' }); + // break; + // default: + // //$('#txt_status').val('系统错误'); + // //$('#txt_status').css({ 'background-color': 'red' }); + // break; + // } + // } + // } + + // //显示分线托盘信息 + // void ShowPalletInfo_Subline(m_Value) + // { //2017-1-3 + // var s_valueArrays = m_Value.split('&'); + // if (s_valueArrays.length > 0) + // { + // var s_palletinfo = s_valueArrays[0]; //托盘状态 + // switch (s_palletinfo) + // { + // case "0": //托盘错误 + // $('#txt_status_subline').val('托盘错误'); + // $('#txt_status_subline').css({ 'background-color': 'red' }); + // document.getElementById("img_ForceMatch_SubLine").src = "../images/red.png"; + // break; + // case "1": //合格 + // $('#txt_status_subline').val('合格'); + // $('#txt_status_subline').css({ 'background-color': 'green' }); + // document.getElementById("img_ForceMatch_SubLine").src = "../images/green.png"; + // break; + // case "2": //不合格 + // $('#txt_status_subline').val('不合格'); + // $('#txt_status_subline').css({ 'background-color': 'red' }); + // document.getElementById("img_ForceMatch_SubLine").src = "../images/red.png"; + // break; + // case "3": //返修 + // $('#txt_status_subline').val('返修'); + // $('#txt_status_subline').css({ 'background-color': 'yellow' }); + // document.getElementById("img_ForceMatch_SubLine").src = "../images/green.png"; + // break; + // case "4": //空托盘 + // $('#txt_status_subline').val('空托盘'); + // $('#txt_status_subline').css({ 'background-color': 'white' }); + // document.getElementById("img_ForceMatch_SubLine").src = "../images/red.png"; + // break; + // default: + // $('#txt_status_subline').val('系统错误'); + // $('#txt_status_subline').css({ 'background-color': 'red' }); + // document.getElementById("img_ForceMatch_SubLine").src = "../images/red.png"; + // break; + // } + // } + // } + + //显示托盘信息√ + string ReceivedSignal_MobySelect(string opName) + { + //url: '../submit/OpName.ashx?type=MobySelect&value=' + opName + '', + var responseStr = _MesWebFun_base.ProcessRequest("MobySelect", opName); + return responseStr; + } + + // //初始化时,显示当前工位、工件信息 + // void Init_ReceivedSignal_MobySelect() + // { + // var opName = $("#tbx_opname").val(); + // $.ajax({ + // type: "POST", + // url: '../submit/OpName.ashx?type=ShowOpNameMessage&value=' + opName + '', + // success: function(data) { + // if (data != "" && data != null) + // { + // var dataArrays = data.split('&'); //返回多参数,拆分 + // var craftname = dataArrays[0]; //工序名称 + // var operator = dataArrays[1]; //操作者工号 + // isOpenMaterialPush = dataArrays[2]; //是否启动物料拉动 + // $("#tbx_opnamediscription").val(craftname); + // $("#tbt_operator").val(operator); + // } + // } + // }); + // ReceivedSignal_MobySelect();//显示工件信息 + // } + // //显示分线托盘信息√ + // void ReceivedSignal_MobySelect_Subline(m_Value) + // { + // var opName = m_Value; + // $.ajax({ + // type: "POST", + // url: '../submit/OpName.ashx?type=MobySelect&value=' + opName + '', + // success: function(data) { + // if (data != "" && data != null) + // { + // var dataArrays = data.split('&'); //返回多参数,拆分 + // var orderNum = dataArrays[0]; + // var EngineTypeID = dataArrays[1]; + // var EngineType = dataArrays[2]; + // var EngineID = dataArrays[3]; + // var PartPallet_Code = dataArrays[4]; + // var IsrepairBarcode = dataArrays[5]; + // var repairBarcode = dataArrays[6]; + // $("#txt_enginetype_subline").val(EngineType); + // $("#txt_num_subline").val(EngineID); + // $("#txt_num_subline_Pallet").val(PartPallet_Code); + // } + // } + // }) + //} + + + + + + + + + + + + + + + + + + + + + + + + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Common_ShowQuality.cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Common_ShowQuality.cs new file mode 100644 index 0000000..fac43b6 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Common_ShowQuality.cs @@ -0,0 +1,65 @@ +//using System; +//using System.Collections.Generic; +//using System.Linq; +//using System.Text; +//using System.Threading.Tasks; +//using SystemFramework; + +//namespace MesWebFun_base +//{ +// public partial class MisWebInterface +// { + +// /*该js文件用于处理显示"质量数据"业务逻辑处理*/ + + +// //初始化质量状态数据--主界面 +// void initQualityData() +// { +// var opName = $("#tbx_opname").val(); +// var serialnumWidth = $("#div_quality").width() * 0.2; +// var twistWidth = $("#div_quality").width() * 0.37; +// var cornerWidth = $("#div_quality").width() * 0.37; +// datagrid_Quality = $('#datagrid_quality').datagrid({ +// url: '', +// title: '', +// sortName: '', //按哪个字段排序,将把这个提交给服务器 +// sortOrder: 'desc', //升序降序 +// idField: '', +// //columns: [[ +// // { title: "名称", field: 'JSON_名称', width: 60, align: 'center' }, +// // { title: '项目1', field: 'JSON_测量项目1', width: 50, align: 'center' }, +// // { title: '项目2', field: 'JSON_测量项目2', width: 50, align: 'center' }, +// // { title: '合格标志', field: 'JSON_合格标志', align: 'center', hidden: true } +// // ]], +// nowrap: false, +// fit: true,fitColumns: true, +// singleSelect: true, +// rowStyler: function(index, row) { +// if (row.JSON_合格标志 == "1") +// { +// return 'background-color:green'; +// } +// else +// { + +// return 'background-color:red'; +// } +// } +// }); +// } + + + + + + + + + + + + + +// } +//} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Common_ShowTime.cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Common_ShowTime.cs new file mode 100644 index 0000000..3c952d4 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Common_ShowTime.cs @@ -0,0 +1,187 @@ +//using System; +//using System.Collections.Generic; +//using System.Linq; +//using System.Text; +//using System.Threading.Tasks; +//using SystemFramework; + +//namespace MesWebFun_base +//{ +// public partial class MisWebInterface +// { + + + +// /*该js文件用于处理显示"当前时间"业务逻辑处理*/ + +// //js实时显示日期 +// void showtime_data() +// { +// var today, hour, second, minute, year, month, date; +// var strDate; +// today = new Date(); +// var n_day = today.getDay(); +// switch (n_day) +// { +// case 0: +// { +// strDate = "星期日" +// } +// break; +// case 1: +// { +// strDate = "星期一" +// } +// break; +// case 2: +// { +// strDate = "星期二" +// } +// break; +// case 3: +// { +// strDate = "星期三" +// } +// break; +// case 4: +// { +// strDate = "星期四" +// } +// break; +// case 5: +// { +// strDate = "星期五" +// } +// break; +// case 6: +// { +// strDate = "星期六" +// } +// break; +// case 7: +// { +// strDate = "星期日" +// } +// break; +// } +// year = today.getFullYear(); +// month = today.getMonth() + 1; +// date = today.getDate(); +// hour = today.getHours(); +// minute = today.getMinutes(); +// second = today.getSeconds(); + +// if (month < 10) +// { +// month_New = "0" + month; +// } +// else +// { +// month_New = month; +// } + +// if (date < 10) +// { +// date_New = "0" + date; +// } +// else +// { +// date_New = date; +// } +// document.getElementById('time').innerHTML = year + "-" + month_New + "-" + date_New; //显示时间 +// setTimeout("showtime_data();", 1000000); //设定函数自动执行时间为 1000 ms(1 s) +// } + +// //实时显示时间 +// void showtime_time() +// { +// var today, hour, second, minute, year, month, date; +// var strDate; +// today = new Date(); +// var n_day = today.getDay(); +// switch (n_day) +// { +// case 0: +// { +// strDate = "星期日" +// } +// break; +// case 1: +// { +// strDate = "星期一" +// } +// break; +// case 2: +// { +// strDate = "星期二" +// } +// break; +// case 3: +// { +// strDate = "星期三" +// } +// break; +// case 4: +// { +// strDate = "星期四" +// } +// break; +// case 5: +// { +// strDate = "星期五" +// } +// break; +// case 6: +// { +// strDate = "星期六" +// } +// break; +// case 7: +// { +// strDate = "星期日" +// } +// break; +// } +// year = today.getFullYear(); +// month = today.getMonth() + 1; +// date = today.getDate(); +// hour = today.getHours(); +// if (hour < 10) +// { +// hour_New = "0" + hour; +// } +// else +// { +// hour_New = hour; +// } +// minute = today.getMinutes(); +// if (minute < 10) +// { +// minute_New = "0" + minute; +// } +// else +// { +// minute_New = minute; +// } +// second = today.getSeconds(); +// if (second < 10) +// { +// second_New = "0" + second; +// } +// else +// { +// second_New = second; +// } +// document.getElementById('Span_time').innerHTML = hour_New + ":" + minute_New + ":" + second_New + "  " + strDate; ; //显示时间 +// setTimeout("showtime_time();", 1000); //设定函数自动执行时间为 1000 ms(1 s) +// } + + + + + + + + +// } +//} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_FixGuiad.cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_FixGuiad.cs new file mode 100644 index 0000000..682366f --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_FixGuiad.cs @@ -0,0 +1,327 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MisWebInterface + { + + // /*该js文件用于处理"详细具体指导(拧紧、检测、称重等业务指导)"业务逻辑处理*/ + + // ////////////////////////////////////////////////////////4 + + // var jsonArrayStatic; //全局json + // var CircleDivList; //全局记录包含image的div + // var CircleDivListCount = 0; + // var CircleImageList; //全局记录全部的拧紧或者压装小圆圈图片 + // var CircleImageListCount = 0; + + + //动态创建拧紧指导div + string InitShowGuidCircle(string opName) + { + // url: '../submit/OpName.ashx?type=ShaftPosition&value=' + opName, + var responseStr = _MesWebFun_base.ProcessRequest("ShaftPosition", opName); + return responseStr; + } + // //创建div + // void SetUpCircleDiv(data) + // { + // CircleDivList = { }; + // CircleImageList = { }; + // CircleImageListCount = 0; + // CircleImageListCount = 0; + + // var CircleImage = "
"; //默认 + // var CricleColor = "ni_png_0910"; //默认 + // var CricleColor_1 = "ni_png_0910"; //拧紧类型 + // var CricleColor_2 = "bluerectangle"; //其它类型 + // var height = $(window).height(); + // var width = $(window).width(); + // if (data != "" && data != null) + // { + + // for (var i = 0; i < data.length; i++) + // { + // var divImgWidth = $("#div_tab_assembly_craft_main").width(); + // var CircleDivID = "CircleDivID" + i; + // var CircleImageID = "CircleImageID" + i; + // var CircleLabelID = "CircleLabelID" + i; + // var LocationX_data = (data[i].测量位置X / 1000) * width; + // //var LocationX = divImgWidth + LocationX_data + 8; + // var LocationX = divImgWidth + LocationX_data; + // //var LocationY = data[i].测量位置Y + 115; + // var LocationY = (data[i].测量位置Y / 760) * height; + // var contrlosWidth = data[i].控件宽度; + // var contrlosHeight = data[i].控件高度; + // var instruction = data[i].说明; + // var controlcode = data[i].控件类型; + // var isrepaire = data[i].是否返修; + + // var number = data[i].序号; + + // if (controlcode == "1") + // {//其它类型 + // CricleColor = CricleColor_1; + // } + + // else + // {//其它类型 + // CricleColor = CricleColor_2; + // } + + // switch (data[i].拧紧完成) + // { + // case 1: + // CricleColor = "green"; + // break; + // default: + // CricleColor = "ni_png_0910"; + // break; + + // } + + // //普通拧紧 + // if (isrepaire == 0) + // { + + // if (controlcode == "1") + // {//拧紧类型 + // CircleImage = "
" + // + "" + // + "
" + // } + + // else + // {//其它类型 + // CircleImage = "
" + // + "" + instruction + "" + // + "" + // + "
" + // } + // } + // //返修拧紧 + // else + // { + // if (data[i].拧紧完成 == "2") + // { + // CricleColor = "red"; + // } + + // if (controlcode == "1") + // {//拧紧类型 + // CircleImage = "
" + // + "" + // + "
" + // } + + // } + + + // $('#div_tab_assembly_craft').append(CircleImage); + // $('#' + CircleDivID).css( + // { + // "top": LocationY + "px", + // "left": LocationX + "px", + // "z-index": "4", + // "width": contrlosWidth, + // "height": contrlosHeight, + // "position": "absolute" + // }); + + // $('#' + CircleImageID).css( + // { + // "width": contrlosWidth, + // "height": contrlosHeight + // } + // ); + + // if (controlcode != "1") + // {//其它类型 + // $('#' + CircleLabelID).css( + // { + // "top": 7 + "px", + // "left": 17 + "px", + // "z-index": "4", + // "position": "absolute" + // } + // ); + // } + + // CircleDivList[i] = CircleDivID; + // CircleImageList[number] = CircleImageID; //改过[i] + // CircleDivListCount++; + // CircleImageListCount++; + // } + // } + // } + + // //移除控件 + // void ClearCircle() + // { + // //console.info(CircleDivListCount); + // if (CircleDivListCount > 0) + // { + // for (var i = CircleDivListCount - 1; i >= 0; i--) + // { + // var id = CircleDivList[i]; + // $('#' + id).remove(); + // } + // } + // } + + // //获取第一次拧紧的组号和套筒号 + // void GetFirstGroupNumAndBoltCode(data) + // { + // var groupindex = 0; + // var boltcode = 0; + // var isfinish = 0; //拧紧完成 + + // var isOK = 0;//是否存在未拧紧轴 + // if (data != "" && data != null) + // { + // for (var j = 0; j < data.length; j++) + // { + // if (data[j].拧紧完成 == 0) + // { + // isOK = 1; + // } + // } + + + // for (var i = 0; i < data.length; i++) + // { + // isfinish = data[i].拧紧完成; + // groupindex = data[i].组号; + // boltcode = data[i].套筒号; + + // if (isOK == 1) + // { + // if (isfinish == 0) + // { + // return groupindex; + // } + // } + // else + // { + // if (isfinish == 2) + // { + // return groupindex; + // } + // } + // } + // } + // } + + // //根据序列号,显示对应的状态(status为0表示不合格,status为1为合格,status为2为还未开始,status为4为开始拧紧) + // void ShowStep(GroupNum, status, jsonArray) + // { + + // //先判断是否还有未完成拧紧或者的位置 + // var imageid; + // var imagesrc; + // var Num; + // var ReadGroupNum; + // var boltCode; //套筒号 + // var controlcode; //控件类型 + + // // ShowAndHideFixAgainButton(false); //默认隐藏 + // if (CircleImageListCount > 0) + // { + // for (var i = 0; i < jsonArray.length; i++) + // { + // ReadGroupNum = jsonArray[i].组号; + // if (GroupNum == ReadGroupNum) + // { + // Num = jsonArray[i].序号; + // controlcode = jsonArray[i].控件类型; + // imageid = CircleImageList[Num]; //改过-1 + + + // if (status == 0) + // { + // if (controlcode == "1") + // { + // imagesrc = "../images/red.png"; + // } + // else + // { + // imagesrc = "../images/redrectangle.png"; + // //清空套筒号 + // ClearBoltCode(); + // } + // } + // if (status == 1) + // { + // if (controlcode == "1") + // { + // imagesrc = "../images/green.png"; + // } + // else + // { + // imagesrc = "../images/greenrectangle.png"; + // //清空套筒号 + // ClearBoltCode(); + // } + // //开始拧紧下一个 + // } + // if (status == 2) + // { + // if (controlcode == "1") + // { + // imagesrc = "../images/ni_png_0910.png"; + // } + // else + // { + // imagesrc = "../images/bluerectangle.png"; + // //清空套筒号 + // ClearBoltCode(); + // } + // } + // if (status == 4) + // { + // if (controlcode == "1") + // { + // imagesrc = "../images/StartWorkCircle.gif"; + // } + // else + // { + // imagesrc = "../images/blinkrectangle.gif"; + // //清空套筒号 + // ClearBoltCode(); + // } + // } + + + // $('#' + imageid).attr("src", imagesrc); + // } + // } + // } + // } + + + + + + + + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Init.cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Init.cs new file mode 100644 index 0000000..2309ad7 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Init.cs @@ -0,0 +1,816 @@ +//using System; +//using System.Collections.Generic; +//using System.Linq; +//using System.Text; +//using System.Threading.Tasks; +//using SystemFramework; + +//namespace MesWebFun_base +//{ +// public partial class MisWebInterface +// { + + +// /*该js文件用于处理"页面初始化"业务逻辑处理*/ + +// //记录TabSelect时的Tab顺序 +// var Tab_Index = '操作指南'; +// //记录操作指南区域的先后顺序:1显示操作指南,0显示工艺卡 +// var Index = 1; +// var btnconfig = +// { +// btn: { +// close:' 重新工作', +// comfrie:' 继续工作' +// } +// } +//var dditConfig = { +// btn: { +// close:' 重新工作', +// comfrie:' 继续工作' +// }, +// hintLayer: { +// icon: 7, +// title: ["涂胶-拧紧超时报警","background-color:#4476A7"], +// area: ['600px', '320px'], +// skin: 'layui-layer-molv', +// offset: '240px', +// btn: [btnconfig.btn.comfrie, btnconfig.btn.close] +// }, +// hintLayer1: { +// icon: 1, +// area: ['360px', '250px'], +// title: "提示信息", +// skin: 'layerStyle', +// offset: '350px', +// btn: ["确定登录", "取消登录"] +//} +//} +////初始化MES界面 +//void loadingMes() +//{ +// var opName = $("#tbx_opname").val(); +// //初始化Mes界面_更新上面的数据 +// loadingMesData(); +// $.ajax({ +// url: '../submit/OpName.ashx?type=MesloadingSelect&value=' + opName, +// data: +// { +// mainModule: 1, //主模块代码 +// MesWebCode: 2//页面代码 +// }, +// dataType: 'json', +// success: function(data) { +// if (data != null && data != "") +// { +// for (i = 0; i < data.length; i++) +// { +// switch (data[i].标签属性) +// { +// case "lbl": +// { +// updataLbl(data[i]); +// } +// break; +// case "tab": +// { +// updataTab(data[i]); +// } +// break; +// case "btn": +// { +// updataBtn(data[i]); +// } +// break; +// } +// } +// } +// else +// { +// return; +// } +// } +// }) +// //更新lbl +// void updataLbl(data) +//{ +// try +// { +// var key = data.标签ID; +// var value = data.标签文字; +// $('#' + key).text(value); +// } +// catch (Error) +// { +// } +//} +////更新btn +//void updataBtn(data) +//{ +// var key = data.标签ID; +// var value = data.标签文字; +// $('#' + key).val(value); +//} +////更新tab +//void updataTab(data) +//{ +// //第一步取到tab的控件 +// var tab_key = data.所属父级ID; +// var launageType = data.语言编号; +// $("#Hidden_language").val(launageType); +// var value = data.模块描述; +// //console.info(value); +// var tab_index = data.模块编号; + +// if (data.是否禁用 == 0 && data.是否禁用 != undefined) +// { +// var tab_child = $('#' + tab_key).tabs('getTab', value); +// if (tab_child != null) +// { +// $('#' + tab_key).tabs('update', { +// tab: tab_child, +// options: +// { +// title: value // 新tab的title +// } +// }); +// } +// } else +//{ +// $('#' + tab_key).tabs('close', value); +// $('#' + tab_key).tabs('select', 0); +//} +// } +//} +////初始化Mes界面_更新上面的input +//void loadingMesData() +//{ +//} + +////打开功能按钮对话框 +//void OpenPanel() +//{ +// $("#div_btnfunction_main").toggle(); +//} + +////根据对象以及百分比获取实际absolutely长度大小 +//void FixWidth(sender, percent) +//{ +// alert('0'); +// return $('#' + sender).width() * percent; +//} + +////获取html页面参数 +//void getvalue(name) +//{ +// var str = window.location.search; +// if (str.indexOf(name) != -1) +// { +// var pos_start = str.indexOf(name) + name.length + 1; +// var pos_end = str.indexOf("&", pos_start); +// if (pos_end == -1) +// { +// return str.substring(pos_start); +// } +// else +// { +// return str.substring(pos_start, pos_end) +// } +// } +// else +// { +// return "没有这个name值"; +// } +//} + +////初始化工步属性 +//void IniStepProperty() +//{ +// var opName = $("#tbx_opname").val(); +// $.ajax({ +// type: "POST", +// url: '../submit/OpName.ashx?type=StepProperty&value=' + opName + '', +// success: function(data) { +// if (data != null && data != "") +// { +// var stepProperty = data.toString(); +// $("#Hidden_stepProperty").val(stepProperty); +// } +// } +// }) +//} + +////在线,离线,启用点击事件 +//void show_Pannel_status1() +//{ +// $('#combobox_btnfunction_status').combobox('showPanel'); +//} +////功能按钮-从数据库中初始化在线/离线/屏蔽的combobox +//void initOnlineOutlineCombobox() +//{ +// var opName = $("#tbx_opname").val(); +// $.ajax({ +// type: "POST", +// url: "../submit/OpName.ashx?type=Init_OnlineOutline", +// data: +// { +// opnameValue: opName +// }, +// dataType: 'json', +// success: function(data) { +// if (data != null && data != "") +// { +// if (data.value == "2") +// { +// $("#btn_function").css("background-color", "red"); +// $("#combobox_btnfunction_status").combobox("setValue", "2"); +// } +// else +// { +// $("#btn_function").css("background-color", "green"); +// $("#combobox_btnfunction_status").combobox("setValue", "0"); +// } +// } +// } +// }); +//} +////初始化combox--功能按钮 +//void initCombobox() +//{ +// var opName = $("#tbx_opname").val(); +// var headwidth = $("#div_btnfunction_status").width(); +// var headheight = $("#div_btnfunction_status").height(); +// $("#combobox_btnfunction_status").combobox({ +// width: 130, +// height: 35, +// //panelHeight: headheight, +// panelHeight: 80, +// valueField: "id", +// textField: "line", +// value: "在线", +// data: +// [{ +// id: "0", +// line: "在线" +// }, { +// id: "2", +// line: "屏蔽" +// }], +// editable: false, +// onSelect: function(record) { +// var opName = $("#tbx_opname").val(); +// var text = $("#combobox_btnfunction_status").combobox("getText"); +// var value = $("#combobox_btnfunction_status").combobox("getValue"); +// if (value == 2) +// { +// $("#btn_function").css("background-color", "red"); +// } +// else +// { +// $("#btn_function").css("background-color", "green"); +// } +// //插入到数据库 +// $.ajax({ +// type: "POST", +// url: "../submit/OpName.ashx?type=Insert_OnlineOutline", +// data: +// { +// opnameValue: opName, +// selectValue: value +// }, +// dataType: 'json', +// success: function(data) { +// if (data != null && data != "") +// { +// if (data.falg == "1") +// { +// //发送信号 +// var sendmessage = "MSG,OnLineState|" + opName + "|" + value; +// sendMessage(sendmessage); +// } +// else +// { +// } +// } +// } +// }); +// } +// }); +//} //初始化tab + +//var slectTabFlag = 1; + +////初始化tab +//void initTab() +//{ +// var meswidth = $("#div_mes_main").width(); +// var timewidth = $("#div_time_main").width(); +// // var tabWidth = (meswidth - timewidth) * 0.975; +// var tabWidth = (meswidth - timewidth) * 0.83; +// var tabHeight = $("#div_time_main").height(); +// $('#div_tab').tabs({ +// border: false, +// tabWidth: tabWidth / 6, +// tabHeight: tabHeight, +// onSelect: function(title, index) { +// switch (title) +// { +// case '操作指南': +// SettingIndex(title); +// initProcessData(); +// initAssembleData(); +// ShowCraft(); +// break; +// case '工艺卡': +// SettingIndex(title); +// ShowCraft(); +// break; +// case '订单完工': +// SettingIndex(title); +// initOrderInfoData(); +// ReloadOrderInfoData(); +// break; +// case '物料拉动': +// SettingIndex(title); +// initOrderInfoData(); +// ReloadOrderInfoData(); +// break; +// case '质量查询': +// SettingIndex(title); +// IniQualityButtons_bgColor(); +// initStationdata(); +// repairMark = 0; +// break; +// case '设备管理': +// SettingIndex(title); +// initMaintainInfodata(); +// var tab = $('#div_tab').tabs('getSelected'); +// tab.panel('refresh'); +// break; +// case 'ANDON': +// SettingIndex(title); +// ///测试 +// init_Combobox_ando_call(); +// init_combobox_ando_reset(); +// InitMaterailAndo(); +// //alert($("#tbx_opname").val()); +// $('#div_andon_table_material').css({ +// "left": "0px" +// }); +////初始化物料ando弹出的div +//Init_ando_popup(); +////初始化质量ando弹出的div +//Init_ando_quality_popup(); +////初始化设备ando弹出的div +//Init_ando_machine_popup(); +//break; +// case '返修管理': +// SettingIndex(title); +//initStationdataRepair(); +//IniQualityButtons_bgColorRepair(); +//repairMark = 1; +//break; +// } +// } +// }); +//} + +////点击Tab设置Index +//void SettingIndex(index) +//{ +// switch (index) +// { +// case '操作指南': //操作指南 +// if (Tab_Index != '操作指南') +// { +// Index = 0; +// Tab_Index = '操作指南'; +// return; +// } +// else +// { +// if (Index == 1) +// { +// Index = 0; +// return; +// } +// if (Index == 0) +// { +// Index = 1; +// return; +// } +// } +// break; +// case '工艺卡': //工艺卡 +// if (Tab_Index != '工艺卡') +// { +// Index = 0; +// Tab_Index = '操作指南'; +// return; +// } +// else +// { +// if (Index == 1) +// { +// Index = 0; +// return; +// } +// if (Index == 0) +// { +// Index = 1; +// return; +// } +// } +// break; +// case '订单完工': //订单完工 +// Tab_Index = index; +// Index = 0; +// return; +// break; +// case '物料拉动': //物料拉动 +// Tab_Index = index; +// Index = 0; +// return; +// break; +// case '质量查询': //质量查询 +// Tab_Index = index; +// Index = 0; +// return; +// break; +// case '设备管理': //设备管理 +// Tab_Index = index; +// Index = 0; +// return; +// break; +// case 'ANDON': //Andon +// Tab_Index = index; +// Index = 0; +// return; +// break; +// case '返修管理': //返修管理 +// Tab_Index = index; +// Index = 0; +// return; +// break; +// default: +// Tab_Index = 0; +// Index = 0; +// return; +// break; +// } +//} + +////显示工序卡和操作指南头 +//void ShowCraft() +//{ +// if (Index == 0) +// { +// var tab = $('#div_tab').tabs('getSelected'); +// var launageType = $("#Hidden_language").val(); +// if (launageType == 1) +// { +// $('#div_tab').tabs('update', { +// tab: tab, +// options: +// { +// title: "操作指南" // 新tab的title +// } +// }); +// } +// if (launageType == 2) +//{ +// $('#div_tab').tabs('update', { +// tab: tab, +// options: +// { +// title: "OperageGuid" // 新tab的title +// } +// }); +//} +// $("#div_tab_operationcard").css({ +// "display": "none" +// }); +// } +// else +//{ +// //20170331 CORBIN +// var opName = $('#tbx_opname').val(); + +// $.ajax({ +// type: "POST", +// url: '../submit/OpName.ashx?type=GetPdfSrc&value=' + opName, +// success: function(data) { +// if (data != "" || data == null) +// { +// if (document.getElementById('pdf_operationcard') != null) +// { +// $('#pdf_operationcard').attr("src", data); +// initoperationcard(); +// } +// } +// else +// { +// $('#pdf_operationcard').attr("src", "../pdf/确认是否上传PDF.pdf"); +// initoperationcard(); +// } +// } +// }) + +// //20170331 CORBIN + +// $("#div_tab_operationcard").css({ +// "display": "block" +// }); +// var tab = $('#div_tab').tabs('getSelected'); +// var launageType = $("#Hidden_language").val(); +// if (launageType == 1) +// { +// $('#div_tab').tabs('update', { +// tab: tab, +// options: +// { +// title: "工艺卡" // 新tab的title +// } +// }); +// } +// if (launageType == 2) +// { +// $('#div_tab').tabs('update', { +// tab: tab, +// options: +// { +// title: "ProcessCard" // 新tab的title +// } +// }); +// } +//} +//} + +////测试虚拟键盘 +//void test_tbx_scanbarcode() +//{ +// VirtualKeyboard.toggle('', 'softkey'); +// $("#kb_langselector,#kb_mappingselector,#copyrights").css("display", "none"); +//} + +////工位刚登入时,将一些信息复位掉 +//void Web_Login() +//{ +// var opName = $("#tbx_opname").val(); +// $.ajax({ +// type: "POST", +// url: '../submit/OpName.ashx?type=WebLoginIn&value=' + opName + '', +// success: function(data) { +// if (data != null && data != "") +// { +// } +// } +// }); +////初始化界面 +////显示操作指南 ph- 2014年11月18日 +//ReceivedSignal_ProcessList(); //显示操作指南 +//ReceivedSignal_MaterialList(); //显示物料 +//ReceivedSignal_PictureShow(); //显示操作图片 +//ShowLEDNotice(); //初始化LED +//} + +//void InitMaterialLeave_dialog() +//{ +// //open方法 +// layer.open({ +// icon: 7, +// closeBtn: 1, +// skin: 'layui-layer-lan', +// area:['600px', '350px'], +// content: $("#MaterialLeave_dialog").html(), +// btn:["确定" ], +// yes: function(index, layero) { +// layer.close(index); +// } +// }); +//} +////质量门 +//void MaterailQuality_dialoga() +//{ +// //open方法 +// layer.open({ +// icon: 7, +// closeBtn: 1, +// skin: 'layui-layer-lan', +// area:['600px', '350px'], +// content: $("#MaterailQuality_dialog").html(), +// btn:["确定"], +// yes: function(index, layero) { +// layer.close(index); +// } +// }); +//} +////涂胶延时提醒 +//void InitdelayTime_dialog() +//{ +// //open方法 +// layer.open({ +// icon: 7, +// title:["延时提醒提示"], +// closeBtn: 1, +// skin: 'layui-layer-lan', +// area:['600px', '350px'], +// content: $("#delayTime_dialog").html(), +// btn:["继续工作", "重新工作", ], +// yes: function(index, layero) { +// var opName = $("#tbx_opname").val(); +// var sendmessage = "MSG,ContinueFixAllow|" + opName + "|1"; +// sendMessage(sendmessage); +// layer.close(index); +// }, +// btn2: function(index, layero) { +// layer.close(index); +// }, +// }); +//} +////打印条码提醒 +//void InitPrintConfirm_dialog() +//{ +// $('#PrintConfirm_dialog').dialog({ +// title: '打印条码扫描验证错误', +// width: 600, +// height: 270, +// modal: true, +// closed: true, +// buttons: +// [{ +// text: '继续工作', +// iconCls: 'icon-ok', +// handler: function() { +// var opName = $("#tbx_opname").val(); +// var sendmessage = "MSG,PrinterrorAlter|" + opName + "|1"; +// sendMessage(sendmessage); +// $('#PrintConfirm_dialog').dialog('close'); +// } +// }, { +// text: '重新工作', +// iconCls: 'icon-cancel', +// handler: function() { +// $('#PrintConfirm_dialog').dialog('close'); +// } +// }] +// }); +//} +////OP2150涂胶延时提醒 +//void InitTightdelayTime_dialog() +//{ +// //open方法 +// layer.open({ +// icon: 7, +// title:["涂胶延时提醒"], +// closeBtn: 1, +// skin: 'layui-layer-lan', +// area:['600px', '350px'], +// content: $("#tightTime_dialog").html(), +// btn:["继续工作", "重新工作",], +// yes: function(index, layero) { +// var opName = $("#tbx_opname").val(); +// var sendmessage = "MSG,ContinueFixAllow|" + opName + "|1"; +// sendMessage(sendmessage); +// layer.close(index); +// }, +// btn2: function(index, layero) { +// layer.close(index); +// }, +// }); +//} +////涂胶时间不足提醒 +//void InitNotenough_dialog() +//{ +// //open方法 +// layer.open({ +// icon: 7, +// title:["涂胶-测试台架时间不足"], +// closeBtn: 1, +// skin: 'layui-layer-lan', +// area:['600px', '350px'], +// content: $("#Notenough_dialog").html(), +// btn:["继续工作", "重新工作", ], +// yes: function(index, layero) { +// var opName = $("#tbx_opname").val(); +// var sendmessage = "MSG,ContinueFixAllow|" + opName + "|1"; +// sendMessage(sendmessage); +// layer.close(index); +// }, +// btn2: function(index, layero) { +// layer.close(index); +// }, +// }); +//} +////OP4150打标重复报警 +//void InitMarking_dialog() +//{ +// //open方法 +// layer.open({ +// icon: 7, +// title:["打标工件编号重复"], +// closeBtn: 1, +// skin: 'layui-layer-lan', +// area:['600px', '350px'], +// content: $("#Marking_dialog").html(), +// btn:["继续工作", "重新工作", ], +// yes: function(index, layero) { +// var opName = $("#tbx_opname").val(); +// var sendmessage = "MSG,ContinueFixAllow|" + opName + "|1"; +// sendMessage(sendmessage); +// layer.close(index); +// }, +// btn2: function(index, layero) { +// layer.close(index); +// }, +// }); +//} +////二维码零件未扫描 +//void InitNoScan_dialog() +//{ +// $('#NoScanMats_dialog').dialog({ +// title: '物料未扫描完全', +// width: 600, +// height: 270, +// modal: true, +// closed: true, +// buttons: +// [{ +// text: '确定', +// iconCls: 'icon-ok', +// handler: function() { +// $('#NoScanMats_dialog').dialog('close'); +// } +// }] +// }); +//} +////删除排队 +//void button_Orderdele() +//{ +// var opName = $("#tbx_opname").val(); +// var orderengine_num = $("#txt_orderengine_num").val(); +// $.ajax({ +// type: 'post', +// url: '../submit/OpName.ashx?type=OrderlistDelete&value=' + opName + '&orderengine_num=' + orderengine_num, +// dataType: 'json', +// success: function(data) { +// $("#txt_orderengine_num").val(''); +// } +// }); +//sendMessage(sendmessage); +// $.messager.show({ +//title: '提示', +// msg: '删除成功!', +// timeout: 2000, +// showType: 'slide' +// }); +//} + +////线外工位质量数据、物料数据 +//void InitLineout_dialog() +//{ +// $('#Lineout_dialog').dialog({ +// title: '线外工装数据显示', +// width: 860, +// height: 610, +// closed: false, +// cache: false, +// modal: true +// }); +//IniQualityButtons_bgColor_alert(); +//initStationdata_alert(); + +//} + +//void btn_Lineout_dialog_Cancel() +//{ +// $('#Lineout_dialog').dialog({ +// closed: true, +// }); +//} + +//void btn_Lineout_dialog_Continue() +//{ +// var opName = $("#tbx_opname").val(); +// var barcode = $("#Lineout_barcode").val(); +// var sendmessage = "MSG,ContinueFixAllow|" + opName + "|" + barcode; +// sendMessage(sendmessage); +// $('#Lineout_dialog').dialog({ +// closed: true, +// }); +//} + + + + + + + + + + + + + +// } +//} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_MaterialCheck.cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_MaterialCheck.cs new file mode 100644 index 0000000..00bada9 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_MaterialCheck.cs @@ -0,0 +1,155 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MisWebInterface + { + + + // /*该js文件用于处理"物料检测"业务逻辑处理*/ + + // var jsonArrayStatic_MaterialCheck; //全局json_物料检测 + // var CircleDivList_MaterialCheck; //全局记录包含image的div + // var CircleDivListCount_MaterialCheck = 0; + // var CircleImageList_MaterialCheck; //全局记录全部的物料检测小圆圈图片 + // var CircleImageListCount_MaterialCheck = 0; + + //初始化物料检测指导 + string InitMaterialCheck(string opName) + { + //url: '../submit/OpName.ashx?type=MaterialCheckPosition&value=' + opName, + var responseStr = _MesWebFun_base.ProcessRequest("MaterialCheckPosition", opName); + return responseStr; + + } + + + // //创建div(MaterialCheck) + // void SetUpCircleDiv_MaterialCheck(data) + // { + // CircleDivList_MaterialCheck = { }; + // CircleImageList_MaterialCheck = { }; + // CircleImageListCount_MaterialCheck = 0; + // CircleImageListCount_MaterialCheck = 0; + + // var CircleImage = "
"; //默认 + // var CricleColor = "checkred"; //默认 + + // for (var i = 0; i < data.length; i++) + // { + // var divImgWidth = $("#div_tab_assembly_craft_main").width(); + // var CircleDivID = "CheckMaterialDivID" + i; + // var CircleImageID = "CheckMaterialImageID" + i; + // var LocationX_data = data[i].测量位置X; + // var LocationX = divImgWidth + LocationX_data; + // var LocationY = data[i].测量位置Y; + // var contrlosWidth = data[i].控件宽度; + // var contrlosHeight = data[i].控件高度; + + // CircleImage = "
" + // + "" + // + "
" + + // $('#div_tab_assembly_craft').append(CircleImage); + // $('#' + CircleDivID).css( + // { + // "top": LocationY + "px", + // "left": LocationX + "px", + // "z-index": "4", + // "width": contrlosWidth, + // "height": contrlosHeight, + // "position": "absolute" + // }); + + // $('#' + CircleImageID).css( + // { + // "width": contrlosWidth, + // "height": contrlosHeight + // } + // ); + + // //赋值变量 + // CircleDivList_MaterialCheck[i] = CircleDivID; + // CircleImageList_MaterialCheck[i] = CircleImageID; + // CircleDivListCount_MaterialCheck++; + // CircleImageListCount_MaterialCheck++; + // } + // } + + // //移除控件 + // void ClearCircle_MaterialCheck() + // { + // if (CircleDivListCount_MaterialCheck > 0) + // { + // for (var i = CircleDivListCount_MaterialCheck - 1; i >= 0; i--) + // { + // var id = CircleDivList_MaterialCheck[i]; + // $('#' + id).remove(); + // } + // } + // } + + + // //根据传递的物料检测信息 + // void ShowMaterialCheck(m_Value) + // { + + // //先判断是否还有未完成拧紧或者的位置 + // var imageid; + // var imagesrc; + // var Num; + // var check; + + // var s_valueArrays = m_Value.split('&'); //将接收到的检测信息split + // if (CircleImageListCount_MaterialCheck > 0) + // { + // if (s_valueArrays.length > 0) + // { + // for (var i = 0; i < jsonArrayStatic_MaterialCheck.length; i++) + // { + // Num = jsonArrayStatic_MaterialCheck[i].物料检测; //检测序号 + // imageid = CircleImageList_MaterialCheck[Num]; + // if (Num <= (s_valueArrays.length - 1)) + // { + // check = s_valueArrays[Num]; + // if (check == 0) + // {//未能检测到显示红色动画 + // imagesrc = "../images/checkred.gif"; + // } + // if (check == 1) + // {//检测到显示绿色动画 + // imagesrc = "../images/checkgreen.gif"; + // } + // else + // { + // imagesrc = "../images/checkred.gif"; + // } + // $('#' + imageid).attr("src", imagesrc); + // } + // } + // } + // } + // } + + + + + + + + + + + + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Notice.cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Notice.cs new file mode 100644 index 0000000..37d567e --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Notice.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MisWebInterface + { + + + /*该js文件用于处理"弹窗消息"业务逻辑处理*/ + string ShowWindowNotice(string opName) + { + //url: '../submit/OpName.ashx?type=ShowWindowNotice&value=' + opName, + var responseStr = _MesWebFun_base.ProcessRequest("ShowWindowNotice", opName); + return responseStr; + } + + //LED消息提醒 + string ShowLEDNotice(string opName) + { + // url: '../submit/OpName.ashx?type=ShowLEDNotice&value=' + opName, + var responseStr = _MesWebFun_base.ProcessRequest("ShowLEDNotice", opName); + return responseStr; + } + + + + + + + + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_OutLineRepair.cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_OutLineRepair.cs new file mode 100644 index 0000000..f110882 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_OutLineRepair.cs @@ -0,0 +1,420 @@ +//using System; +//using System.Collections.Generic; +//using System.Linq; +//using System.Text; +//using System.Threading.Tasks; +//using SystemFramework; + +//namespace MesWebFun_base +//{ +// public partial class MisWebInterface +// { + + + + + +// //初始化返修上线dialog +// void Initdiv_RepairPartLoad_dialg() +// { +// $('#div_RepairPartLoad_dialg').dialog({ +// title: '返修上线', +// width: 600, +// height: 350, +// closed: true +// }); +// } +// //获取日期字符串 +// void RepairPartLoad_GetDate() +// { +// var today, hour, second, minute, year, month, date; +// var strDate; +// today = new Date(); +// year = today.getFullYear(); +// month = today.getMonth() + 1; +// date = today.getDate(); +// hour = today.getHours(); +// minute = today.getMinutes(); +// second = today.getSeconds(); + +// if (month < 10) +// { +// month_New = "0" + month; +// } +// else +// { +// month_New = month; +// } + +// if (date < 10) +// { +// date_New = "0" + date; +// } +// else +// { +// date_New = date; +// } +// // var date3 = document.getElementById('input_RepairPartLoad_EngineID_date').value = year + "-" + month_New + "-" + date_New; //显示时间 +// } + + +// //更新返修状态 +// void update_RepairStatus(data) +// { +// var opName = $("#tbx_opname").val(); //工位号 +// var str0 = data; +// var str1 = new Array(); +// str1 = str0.split("_"); +// var opname = str1[1] +// var btnColor = document.getElementById("" + data + "").style.backgroundColor; +// var status = 0; + +// if (btnColor == "lime") +// { +// status = 1; + +// } +// if (btnColor == "") +// { +// status = 0; +// } + +// //更新到数据库中 +// $.ajax({ +// url: '../submit/OpName.ashx?type=updateRepairStatus&value=' + opName +// + '&opname=' + opname +// + '&status=' + status, +// success: function(data) { + + +// } +// }); +// } + + + +// //全选 +// void SelectAllBtn() +// { +// var btn_Str = ""; +// var repairtags = document.getElementsByName("RepairBtn"); +// var str_value = ""; +// for (var i = 0; i < repairtags.length; i++) +// { +// repairtags[i].style.backgroundColor = "green"; +// } + +// } + +// //清空 +// void RemoveAllBtn() +// { +// var btn_Str = ""; +// var repairtags = document.getElementsByName("RepairBtn"); +// var str_value = ""; +// for (var i = 0; i < repairtags.length; i++) +// { +// repairtags[i].style.backgroundColor = "gray"; +// } +// } + +// //反选 +// void ReverseSelectBtn() +// { +// var btn_Str = ""; +// var repairtags = document.getElementsByName("RepairBtn"); +// var str_value = ""; +// for (var i = 0; i < repairtags.length; i++) +// { +// var btnColor = repairtags[i].style.backgroundColor; +// if (btnColor == "green")//判断按钮背景色 +// { +// repairtags[i].style.backgroundColor = "gray"; +// } +// else +// { +// repairtags[i].style.backgroundColor = "green"; +// } +// } +// } + +// //保存返修数据 +// void RepairPartLoad_Confirm() +// { +// var btn_Str = ""; +// var repairtags = document.getElementsByName("RepairBtn"); +// var str_value = ""; +// for (var i = 0; i < repairtags.length; i++) +// { +// var btnColor = repairtags[i].style.backgroundColor; +// if (btnColor == "green")//判断按钮背景色 +// { +// str_value = repairtags[i].value + "^" + "1" + "|" + str_value; +// } +// else +// { +// str_value = repairtags[i].value + "^" + "0" + "|" + str_value; +// } +// } +// var RepairMethod = $("input[name='RepairMethod']:checked").val(); +// var engineID = $("#text_selectByID").val(); +// var OpNanme_Str = btn_Str.split("|"); +// var engineType = $("#text_engingeType").val(); +// var OpName = $("#tbx_opname").val(); //工位号 +// $.ajax({ +// url: '../submit/OpName.ashx?type=SaveRepairStatus&str_value=' + str_value + '&engineID=' + engineID + '&RepairMethod=' + RepairMethod + '&engineType=' + engineType + '&OpName=' + OpName, +// success: function(data) { + +// if (data == "True") +// { +// $.messager.show({ +// title: '提示', +// msg: "返修上线数据保存成功!", +// timeout: 5000, +// showType: 'slide' +// }); +// $('#div_RepairPartLoad_dialg').dialog({ + +// closed: true +// }); +// var opName = $("#tbx_opname").val(); +// var value = $("#text_selectByID").val(); +// var m_value = value + "/" + RepairMethod; +// var sendmessage = "MSG,RepairMarks|" + opName + "|" + m_value; +// sendMessage(sendmessage); +// } +// else +// { +// $.messager.show({ +// title: '提示', +// msg: "返修上线数据保存失败!", +// timeout: 5000, +// showType: 'slide' +// }); + +// } +// } +// }); +// } + +// //初始化返修上线弹出框的动态按钮 +// void Initdiv_RepairPartLoadBtn() +// { +// var opName = $("#tbx_opname").val(); //工位号 +// var text_selectByID = $("#text_selectByID").val(); //工件编号 +// if (text_selectByID == "") +// { +// return; +// } +// $.ajax({ +// url: '../submit/OpName.ashx?type=RepairStatusInit&value=' + opName + '&text_selectByID=' + text_selectByID, +// success: function(data) +// { +// if (data != null && data != "") +// { +// document.getElementById("div_RepairPartLoad_zbz").innerHTML = '' + data + ''; +// } +// } +// }); + +// } +// //关闭弹窗 +// void RepairPartLoad_Cancel() +// { + +// $('#div_RepairPartLoad_dialg').dialog({ + +// closed: true +// }); + +// } + +// //点击返修上线按钮 +// void btn_outlinerepair() +// { +// /////////////////////返修上线//////////////////// +// //弹出返修上线dialog + +// $("#div_RepairPartLoad_dialg").dialog("open"); + +// } + + +// void RepairBtnClick(data) +// { + +// var opname = data.value; +// var btnColor = document.getElementById("Btn_" + opname + "").style.backgroundColor; +// if (btnColor == "green")//判断按钮背景色 +// { +// $('#Btn_' + opname).css({ +// "background-color": "gray"//设置背景色为空 +// }); +// } +// else +// { +// $('#Btn_' + opname).css({ +// "background-color": "green" +// }); +// } +// } + + + +// //初始化质量查询返修 +// void initStationdataRepair() +// { +// //console.info("质量查询的tab"); +// var opNumWidth = $("#div_tab_stationdata").width() * 0.3; +// var measureDataWidth = $("#div_tab_stationdata").width() * 0.2; +// var measureNameWidth = $("#div_tab_stationdata").width() * 0.3; +// var qualifiedMarkWidth = $("#div_tab_stationdata").width() * 0.19; +// $('#datagridview_stationdata_repair').datagrid({ +// url: '', +// title: '', +// sortName: '', //按哪个字段排序,把这个提交给服务器 +// sortOrder: 'desc', //升序降序 +// idField: '', +// fit: true, +// fitColumns: true, +// columns: +// [[ +// { title: '工位号', field: 'JSON_工位号', width: 70, align: 'center' }, +// { title: '测量位置', field: 'JSON_测量位置', width: 110, align: 'center' }, +// { title: '测量数据', field: 'JSON_测量值', width: 80, align: 'center' }, +// { title: '测量名称', field: 'JSON_测量项目', width: 75, align: 'center' }, +// { title: '是否合格', field: 'JSON_合格标志', width: 70, align: 'center' } +// ]], + +// rowStyler: function(index, row) { +// if (index % 2 == 0 && row.JSON_合格标志 == "OK") +// { +// return 'background-color:#D0D8E8'; +// } +// else if (index % 2 != 0 && row.JSON_合格标志 == "OK") +// { +// return 'background-color:#E9EDF4'; +// } +// else +// { +// return 'background-color:red'; +// } +// } + +// }) +//} +// //更新质量查询模块按钮颜色返修界面 +// void IniQualityButtons_bgColorRepair() +// { +// var opName = $("#tbx_opname").val(); +// $.ajax({ +// url: '../submit/OpName.ashx?type=QualityDataButton_bgColor_Select&value=' + opName + '&v=' + new Date().getTime(), +// success: function(data) { +// if (data != null && data != "") +// { +// document.getElementById("div_tab_station_Repair").innerHTML = data; +// } +// } +// }); +// } +// //更新质量查询模块按钮颜色返修 +// void IniQualityButtons_bgColor_byenergineID_Repair() +// { +// var opName = $("#tbx_opname").val(); +// var energineID = $("#text_selectByID").val(); +// $.ajax({ +// type: 'post', +// url: '../submit/OpName.ashx?type=QualityDataButton_bgColor_Select_ByEnergineID&value=' + opName + '&energineID=' + energineID + '&v=' + new Date().getTime(), +// success: function(data) { +// if (data != null && data != "") +// { +// //document.getElementById("div_tab_station_Repair").innerHTML = data; +// $("#div_tab_station_Repair").html(data); +// } +// } +// }); +// //显示 机型 +// $.ajax({ +// type: 'post', +// url: '../submit/OpName.ashx?type=Select_engineType_ByEnergineID&value=' + opName + '&energineID=' + energineID + '&v=' + new Date().getTime(), +// success: function(data) { +// if (data != null && data != "") +// { +// var engineType = data.engineType; //机型 +// $("#text_engingeType").val(engineType); +// } +// } +// }); +// } + +// //对应返修质量数据查询 +// void QualityDataSelectRepair(opname) +// { +// var opName = $("#tbx_opname").val(); //当前工位号 +// var opname = opname; //选择工位号 +// $.ajax({ +// type: 'post', +// url: '../submit/OpName.ashx?type=QualityDataSelect&value=' + opName + '&opname=' + opname, +// dataType: 'json', +// success: function(data) { +// if (data != null && data != "") +// { +// $("#datagridview_stationdata_repair").datagrid("loadData", data); +// } +// } +// }) +//} + + +// var time = 0; +// //根据发动机号查询质量数据 +// void qualityDataSelect() +// { + +// if (time == 0) +// { +// document.getElementById('button_select').style.background = 'green'; +// QualityDataSelectRepair('0000'); //用于清空缓存数据 +// IniQualityButtons_bgColor_byenergineID_Repair(); +// time = 2; +// } +// if (time == 1) +// { + +// document.getElementById('button_select').style.background = 'gray'; +// QualityDataSelectRepair('0000'); +// document.getElementById('text_selectByID').value = ""; +// document.getElementById('text_engingeType').value = ""; +// IniQualityButtons_bgColorRepair(); +// time = 0; +// } +// if (time == 2) +// { +// time = 1; +// } + +// } + +// //更新质量查询模块按钮颜色返修用 +// void IniQualityButtons_bgColorRepair() +// { +// var opName = $("#tbx_opname").val(); +// $.ajax({ +// url: '../submit/OpName.ashx?type=QualityDataButton_bgColor_Select&value=' + opName + '&v=' + new Date().getTime(), +// success: function(data) { +// if (data != null && data != "") +// { +// document.getElementById("div_tab_station_Repair").innerHTML = data; +// } +// } +// }); +// } + + + + + + + +// } +//} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Socket.cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Socket.cs new file mode 100644 index 0000000..b41a388 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Socket.cs @@ -0,0 +1,189 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MisWebInterface + { + + /// + /// + /// + public static MesWebFun_base _MesWebFun_base = new MesWebFun_base(); + + + public string WebSocket_Function(string msg) + { + var responseStr = ""; + try + { + //返回的数据msg.data,包含了协议中的4部分9 + var arrays_signal = msg.Split('|'); + var m_Source = arrays_signal[0]; + var m_Command = arrays_signal[1]; + var m_Opname = arrays_signal[2]; + var m_Value = arrays_signal[3]; + // var opName = $("#tbx_opname").val(); + switch (m_Source) + { + case "MES": + + switch (m_Command) + { + //显示托盘信息 √ + case "ShowMoby": + try + { + responseStr = ReceivedSignal_MobySelect( m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:ShowMoby" + "|" + "info"); + } + break; + //显示操作指南√ + case "ProcessList": + try + { + responseStr = ReceivedSignal_ProcessList(m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:ProcessList" + "|" + "info"); + } + break; + //显示物料√ + case "MaterialList": + try + { + responseStr = ReceivedSignal_MaterialList(m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:MaterialList" + "|" + "info"); + } + break; + //显示操作图片√ + case "PicShow": + try + { + responseStr = ReceivedSignal_PictureShow(m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:PicShow" + "|" + "info"); + } + break; + //显示拧紧位置√ + case "ShaftPosition": + try + { + responseStr = InitShowGuidCircle(m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:ShaftPosition" + "|" + "info"); + } + break; + //实时显示质量数据√ + case "ShowTimelyQuality": + try + { + // url: '../submit/OpName.ashx?type=ShowTimelyQuality&value=' + opName, + responseStr = _MesWebFun_base.ProcessRequest("ShowTimelyQuality", m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:ShowTimelyQuality" + "|" + "info"); + } + break; + //手动拧紧实时显示质量数据√ + case "ShowTimelyQuality_Tight": + try + { + // url: '../submit/OpName.ashx?type=ShowTimelyQuality&value=' + opName, + responseStr = _MesWebFun_base.ProcessRequest("ShowTimelyQuality", m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:ShowTimelyQuality_Tight" + "|" + "info"); + } + break; + + //√ + case "OrderFormList": + try + { + // ReloadOrderInfoData(); + //url: '../submit/OpName.ashx?type=OrderFormList&value=' + opName, + responseStr = _MesWebFun_base.ProcessRequest("OrderFormList", m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:OrderFormList" + "|" + "info"); + } + break; + //弹窗消息√ + case "Notice": + try + { + responseStr = ShowWindowNotice(m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:Notice" + "|" + "info"); + } + break; + //LED消息提醒√ + case "ScrollNotice": + try + { + responseStr = ShowLEDNotice(m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:ScrollNotice" + "|" + "info"); + } + break; + //物料检测初始化√ + case "MaterialCheckPosition": + responseStr = InitMaterialCheck(m_Opname); + break; + //返修质量数据显示√ + case "RepairQuality": + try + { + // IniQualityButtons_bgColor_byenergineID_socket(m_Value); + //url: '../submit/OpName.ashx?type=QualityDataButton_bgColor_Select_ByEnergineID&value=' + opName + '&energineID=' + energineID + '&v=' + new Date().getTime(), + responseStr = _MesWebFun_base.ProcessRequest("QualityDataButton_bgColor_Select_ByEnergineID", m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:RepairQuality" + "|" + "info"); + } + break; + + default: + // Web_Socket_Interface(m_Opname, msg); + break; + } + break; + } + } + catch (Exception exception) + { + var error = exception.ToString(); + //ApplicationLog.WriteLog("信息提示" + "|" + "系统出现错误,接受onmessage:" + "|" + error + "|" + "info"); + responseStr = ""; + } + return responseStr; + } + + + + } +} diff --git a/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Socket_Interface.cs b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Socket_Interface.cs new file mode 100644 index 0000000..65424a0 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/MisWebInterfaceFunc/Web_Socket_Interface.cs @@ -0,0 +1,170 @@ +//using System; +//using System.Collections.Generic; +//using System.Linq; +//using System.Text; +//using System.Threading.Tasks; +//using SystemFramework; + +//namespace MesWebFun_base +//{ +// public partial class MisWebInterface +// { + + +// /*该js文件用于处理"弹窗消息"业务逻辑处理*/ + +// //接口函数 +// void Web_Socket_Interface(opName, msg) +// { +// //获取工位号对应Fun类型 +// $.ajax({ +// type: "POST", +// url: '../submit/OpName.ashx?type=' + opName + '&value=' + opName, +// success: function(data) { +// if (data != null && data != "") +// { +// switch (data) +// { +// case "01": +// Web_Socket_Fun01(opName, msg); +// break; +// case "02": +// Web_Socket_Fun02(opName, msg); +// break; +// case "03": +// Web_Socket_Fun03(opName, msg); +// break; +// case "04": +// Web_Socket_Fun04(opName, msg); +// break; +// case "05": +// Web_Socket_Fun05(opName, msg); +// break; +// case "06": +// Web_Socket_Fun06(opName, msg); +// break; +// case "07": +// Web_Socket_Fun07(opName, msg); +// break; +// case "08": +// Web_Socket_Fun08(opName, msg); +// break; +// case "09": +// Web_Socket_Fun09(opName, msg); +// break; +// case "10": +// Web_Socket_Fun10(opName, msg); +// break; +// case "11": +// Web_Socket_Fun11(opName, msg); +// break; +// case "12": +// Web_Socket_Fun12(opName, msg); +// break; +// case "13": +// Web_Socket_Fun13(opName, msg); +// break; +// case "14": +// Web_Socket_Fun14(opName, msg); +// break; +// case "15": +// Web_Socket_Fun15(opName, msg); +// break +// case "16": +// Web_Socket_Fun16(opName, msg); +// break; +// case "17": +// Web_Socket_Fun17(opName, msg); +// break; +// default: +// break; +// } +// } +// } +// }) + +//} + +// //特殊functionjs处理 +// void Web_Socket_MesWebFun_Interface(opName, msg) +// { + +// //获取工位号对应Fun类型 +// $.ajax({ +// type: "POST", +// url: '../submit/OpName.ashx?type=' + opName + '&value=' + opName, +// success: function(data) { +// if (data != null && data != "") +// { +// switch (data) +// { +// case "01": +// Web_Socket_MesWebFun01(opName, msg); +// break; +// case "02": +// Web_Socket_MesWebFun02(opName, msg); +// break; +// case "03": +// Web_Socket_MesWebFun03(opName, msg); +// break; +// case "04": +// Web_Socket_MesWebFun04(opName, msg); +// break; +// case "05": +// Web_Socket_MesWebFun05(opName, msg); +// break; +// case "06": +// Web_Socket_MesWebFun06(opName, msg); +// break; +// case "07": +// Web_Socket_MesWebFun07(opName, msg); +// break; +// case "08": +// Web_Socket_MesWebFun08(opName, msg); +// break; +// case "09": +// Web_Socket_MesWebFun09(opName, msg); +// break; +// case "10": +// Web_Socket_MesWebFun10(opName, msg); +// break; +// case "11": +// Web_Socket_MesWebFun11(opName, msg); +// break; +// case "12": +// Web_Socket_MesWebFun12(opName, msg); +// break; +// case "13": +// Web_Socket_MesWebFun13(opName, msg); +// break; +// case "14": +// Web_Socket_MesWebFun14(opName, msg); +// break; +// case "15": +// Web_Socket_MesWebFun15(opName, msg); +// break; +// case "16": +// Web_Socket_MesWebFun16(opName, msg); +// break; +// case "17": +// Web_Socket_MesWebFun17(opName, msg); +// break; +// default: +// break; +// } +// } +// } +// }) +//} + + + + + + + + + + +// } +//} diff --git a/Common/08WebFun_base/WebFun_base/Properties/AssemblyInfo.cs b/Common/08WebFun_base/WebFun_base/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..bd9fa62 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("WebFun_base")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("WebFun_base")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("d98be764-adeb-488d-9714-61e308aa8201")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Common/08WebFun_base/WebFun_base/Reference.cs b/Common/08WebFun_base/WebFun_base/Reference.cs new file mode 100644 index 0000000..02907fa --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/Reference.cs @@ -0,0 +1,1224 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +// +// 此源代码是由 Microsoft.VSDesigner 4.0.30319.42000 版自动生成。 +// +#pragma warning disable 1591 + +namespace MesWebFun_MateriallPull.BarCodeServer_Pro { + using System; + using System.Web.Services; + using System.Diagnostics; + using System.Web.Services.Protocols; + using System.Xml.Serialization; + using System.ComponentModel; + using System.Data; + + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Web.Services.WebServiceBindingAttribute(Name="BarCodeSeverSoap", Namespace="http://tempuri.org/")] + public partial class BarCodeSever : System.Web.Services.Protocols.SoapHttpClientProtocol { + + private System.Threading.SendOrPostCallback HelloWorldOperationCompleted; + + private System.Threading.SendOrPostCallback Web_BarcodeReturn_Split_ExecOperationCompleted; + + private System.Threading.SendOrPostCallback Web_BarcodeReturn_Return_ExecOperationCompleted; + + private System.Threading.SendOrPostCallback Web_Barcode_Return_ReturnCancel_OracleOperationCompleted; + + private System.Threading.SendOrPostCallback Web_DirectUpload_Document_SelectOperationCompleted; + + private System.Threading.SendOrPostCallback Web_DirectUpload_Document_VerifyOKOperationCompleted; + + private System.Threading.SendOrPostCallback CrrentOrderStateSelectOperationCompleted; + + private System.Threading.SendOrPostCallback Web_MaterialPull_AndonCall_VerifyOKOperationCompleted; + + private System.Threading.SendOrPostCallback Select_AndonCall_ResultOperationCompleted; + + private System.Threading.SendOrPostCallback Web_AndonPlanStop_Return_ExecOperationCompleted; + + private System.Threading.SendOrPostCallback Web_AndonPlanStopTypeOperationCompleted; + + private System.Threading.SendOrPostCallback Web_MaterialPull_DocumentNum_SelectOperationCompleted; + + private System.Threading.SendOrPostCallback Web_MaterialPull_DocumentNum_VerifyOKOperationCompleted; + + private System.Threading.SendOrPostCallback Select_DocumentReceptCord_ResultOperationCompleted; + + private System.Threading.SendOrPostCallback Web_OnePieceFlowModle_JudgeOperationCompleted; + + private System.Threading.SendOrPostCallback Web_OnePieceFlowModle_DetaileInfoOperationCompleted; + + private bool useDefaultCredentialsSetExplicitly; + + /// + public BarCodeSever() { + //this.Url = global::MesWebFun_base.Properties.Settings.Default.MesWebFun_MateriallPull_BarCodeServer_Pro_BarCodeSever; + //if ((this.IsLocalFileSystemWebService(this.Url) == true)) { + // this.UseDefaultCredentials = true; + // this.useDefaultCredentialsSetExplicitly = false; + //} + //else { + // this.useDefaultCredentialsSetExplicitly = true; + //} + } + + public new string Url { + get { + return base.Url; + } + set { + if ((((this.IsLocalFileSystemWebService(base.Url) == true) + && (this.useDefaultCredentialsSetExplicitly == false)) + && (this.IsLocalFileSystemWebService(value) == false))) { + base.UseDefaultCredentials = false; + } + base.Url = value; + } + } + + public new bool UseDefaultCredentials { + get { + return base.UseDefaultCredentials; + } + set { + base.UseDefaultCredentials = value; + this.useDefaultCredentialsSetExplicitly = true; + } + } + + /// + public event HelloWorldCompletedEventHandler HelloWorldCompleted; + + /// + public event Web_BarcodeReturn_Split_ExecCompletedEventHandler Web_BarcodeReturn_Split_ExecCompleted; + + /// + public event Web_BarcodeReturn_Return_ExecCompletedEventHandler Web_BarcodeReturn_Return_ExecCompleted; + + /// + public event Web_Barcode_Return_ReturnCancel_OracleCompletedEventHandler Web_Barcode_Return_ReturnCancel_OracleCompleted; + + /// + public event Web_DirectUpload_Document_SelectCompletedEventHandler Web_DirectUpload_Document_SelectCompleted; + + /// + public event Web_DirectUpload_Document_VerifyOKCompletedEventHandler Web_DirectUpload_Document_VerifyOKCompleted; + + /// + public event CrrentOrderStateSelectCompletedEventHandler CrrentOrderStateSelectCompleted; + + /// + public event Web_MaterialPull_AndonCall_VerifyOKCompletedEventHandler Web_MaterialPull_AndonCall_VerifyOKCompleted; + + /// + public event Select_AndonCall_ResultCompletedEventHandler Select_AndonCall_ResultCompleted; + + /// + public event Web_AndonPlanStop_Return_ExecCompletedEventHandler Web_AndonPlanStop_Return_ExecCompleted; + + /// + public event Web_AndonPlanStopTypeCompletedEventHandler Web_AndonPlanStopTypeCompleted; + + /// + public event Web_MaterialPull_DocumentNum_SelectCompletedEventHandler Web_MaterialPull_DocumentNum_SelectCompleted; + + /// + public event Web_MaterialPull_DocumentNum_VerifyOKCompletedEventHandler Web_MaterialPull_DocumentNum_VerifyOKCompleted; + + /// + public event Select_DocumentReceptCord_ResultCompletedEventHandler Select_DocumentReceptCord_ResultCompleted; + + /// + public event Web_OnePieceFlowModle_JudgeCompletedEventHandler Web_OnePieceFlowModle_JudgeCompleted; + + /// + public event Web_OnePieceFlowModle_DetaileInfoCompletedEventHandler Web_OnePieceFlowModle_DetaileInfoCompleted; + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/HelloWorld", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string HelloWorld() { + object[] results = this.Invoke("HelloWorld", new object[0]); + return ((string)(results[0])); + } + + /// + public void HelloWorldAsync() { + this.HelloWorldAsync(null); + } + + /// + public void HelloWorldAsync(object userState) { + if ((this.HelloWorldOperationCompleted == null)) { + this.HelloWorldOperationCompleted = new System.Threading.SendOrPostCallback(this.OnHelloWorldOperationCompleted); + } + this.InvokeAsync("HelloWorld", new object[0], this.HelloWorldOperationCompleted, userState); + } + + private void OnHelloWorldOperationCompleted(object arg) { + if ((this.HelloWorldCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.HelloWorldCompleted(this, new HelloWorldCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Web_BarcodeReturn_Split_Exec", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string Web_BarcodeReturn_Split_Exec(string barcode, string barcode_new, string splitCount) { + object[] results = this.Invoke("Web_BarcodeReturn_Split_Exec", new object[] { + barcode, + barcode_new, + splitCount}); + return ((string)(results[0])); + } + + /// + public void Web_BarcodeReturn_Split_ExecAsync(string barcode, string barcode_new, string splitCount) { + this.Web_BarcodeReturn_Split_ExecAsync(barcode, barcode_new, splitCount, null); + } + + /// + public void Web_BarcodeReturn_Split_ExecAsync(string barcode, string barcode_new, string splitCount, object userState) { + if ((this.Web_BarcodeReturn_Split_ExecOperationCompleted == null)) { + this.Web_BarcodeReturn_Split_ExecOperationCompleted = new System.Threading.SendOrPostCallback(this.OnWeb_BarcodeReturn_Split_ExecOperationCompleted); + } + this.InvokeAsync("Web_BarcodeReturn_Split_Exec", new object[] { + barcode, + barcode_new, + splitCount}, this.Web_BarcodeReturn_Split_ExecOperationCompleted, userState); + } + + private void OnWeb_BarcodeReturn_Split_ExecOperationCompleted(object arg) { + if ((this.Web_BarcodeReturn_Split_ExecCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.Web_BarcodeReturn_Split_ExecCompleted(this, new Web_BarcodeReturn_Split_ExecCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Web_BarcodeReturn_Return_Exec", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string Web_BarcodeReturn_Return_Exec(string send_warehouse, string receive_warehouse, string app_user, string app_department, string header_text, string assemble_code, string plant_id, string item_code, string quantitys, string supplier_code, string remarks, string storage_flag, string p_owner_type) { + object[] results = this.Invoke("Web_BarcodeReturn_Return_Exec", new object[] { + send_warehouse, + receive_warehouse, + app_user, + app_department, + header_text, + assemble_code, + plant_id, + item_code, + quantitys, + supplier_code, + remarks, + storage_flag, + p_owner_type}); + return ((string)(results[0])); + } + + /// + public void Web_BarcodeReturn_Return_ExecAsync(string send_warehouse, string receive_warehouse, string app_user, string app_department, string header_text, string assemble_code, string plant_id, string item_code, string quantitys, string supplier_code, string remarks, string storage_flag, string p_owner_type) { + this.Web_BarcodeReturn_Return_ExecAsync(send_warehouse, receive_warehouse, app_user, app_department, header_text, assemble_code, plant_id, item_code, quantitys, supplier_code, remarks, storage_flag, p_owner_type, null); + } + + /// + public void Web_BarcodeReturn_Return_ExecAsync(string send_warehouse, string receive_warehouse, string app_user, string app_department, string header_text, string assemble_code, string plant_id, string item_code, string quantitys, string supplier_code, string remarks, string storage_flag, string p_owner_type, object userState) { + if ((this.Web_BarcodeReturn_Return_ExecOperationCompleted == null)) { + this.Web_BarcodeReturn_Return_ExecOperationCompleted = new System.Threading.SendOrPostCallback(this.OnWeb_BarcodeReturn_Return_ExecOperationCompleted); + } + this.InvokeAsync("Web_BarcodeReturn_Return_Exec", new object[] { + send_warehouse, + receive_warehouse, + app_user, + app_department, + header_text, + assemble_code, + plant_id, + item_code, + quantitys, + supplier_code, + remarks, + storage_flag, + p_owner_type}, this.Web_BarcodeReturn_Return_ExecOperationCompleted, userState); + } + + private void OnWeb_BarcodeReturn_Return_ExecOperationCompleted(object arg) { + if ((this.Web_BarcodeReturn_Return_ExecCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.Web_BarcodeReturn_Return_ExecCompleted(this, new Web_BarcodeReturn_Return_ExecCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Web_Barcode_Return_ReturnCancel_Oracle", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string Web_Barcode_Return_ReturnCancel_Oracle(string pb_Num, string plant_id) { + object[] results = this.Invoke("Web_Barcode_Return_ReturnCancel_Oracle", new object[] { + pb_Num, + plant_id}); + return ((string)(results[0])); + } + + /// + public void Web_Barcode_Return_ReturnCancel_OracleAsync(string pb_Num, string plant_id) { + this.Web_Barcode_Return_ReturnCancel_OracleAsync(pb_Num, plant_id, null); + } + + /// + public void Web_Barcode_Return_ReturnCancel_OracleAsync(string pb_Num, string plant_id, object userState) { + if ((this.Web_Barcode_Return_ReturnCancel_OracleOperationCompleted == null)) { + this.Web_Barcode_Return_ReturnCancel_OracleOperationCompleted = new System.Threading.SendOrPostCallback(this.OnWeb_Barcode_Return_ReturnCancel_OracleOperationCompleted); + } + this.InvokeAsync("Web_Barcode_Return_ReturnCancel_Oracle", new object[] { + pb_Num, + plant_id}, this.Web_Barcode_Return_ReturnCancel_OracleOperationCompleted, userState); + } + + private void OnWeb_Barcode_Return_ReturnCancel_OracleOperationCompleted(object arg) { + if ((this.Web_Barcode_Return_ReturnCancel_OracleCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.Web_Barcode_Return_ReturnCancel_OracleCompleted(this, new Web_Barcode_Return_ReturnCancel_OracleCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Web_DirectUpload_Document_Select", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public System.Data.DataSet Web_DirectUpload_Document_Select(string document_num, string wkc) { + object[] results = this.Invoke("Web_DirectUpload_Document_Select", new object[] { + document_num, + wkc}); + return ((System.Data.DataSet)(results[0])); + } + + /// + public void Web_DirectUpload_Document_SelectAsync(string document_num, string wkc) { + this.Web_DirectUpload_Document_SelectAsync(document_num, wkc, null); + } + + /// + public void Web_DirectUpload_Document_SelectAsync(string document_num, string wkc, object userState) { + if ((this.Web_DirectUpload_Document_SelectOperationCompleted == null)) { + this.Web_DirectUpload_Document_SelectOperationCompleted = new System.Threading.SendOrPostCallback(this.OnWeb_DirectUpload_Document_SelectOperationCompleted); + } + this.InvokeAsync("Web_DirectUpload_Document_Select", new object[] { + document_num, + wkc}, this.Web_DirectUpload_Document_SelectOperationCompleted, userState); + } + + private void OnWeb_DirectUpload_Document_SelectOperationCompleted(object arg) { + if ((this.Web_DirectUpload_Document_SelectCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.Web_DirectUpload_Document_SelectCompleted(this, new Web_DirectUpload_Document_SelectCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Web_DirectUpload_Document_VerifyOK", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string Web_DirectUpload_Document_VerifyOK(string source_id, string orderNum, string plant_id, string wkc, string workNum, string delivery_num, string item_code, string recept_flag, string GroupID) { + object[] results = this.Invoke("Web_DirectUpload_Document_VerifyOK", new object[] { + source_id, + orderNum, + plant_id, + wkc, + workNum, + delivery_num, + item_code, + recept_flag, + GroupID}); + return ((string)(results[0])); + } + + /// + public void Web_DirectUpload_Document_VerifyOKAsync(string source_id, string orderNum, string plant_id, string wkc, string workNum, string delivery_num, string item_code, string recept_flag, string GroupID) { + this.Web_DirectUpload_Document_VerifyOKAsync(source_id, orderNum, plant_id, wkc, workNum, delivery_num, item_code, recept_flag, GroupID, null); + } + + /// + public void Web_DirectUpload_Document_VerifyOKAsync(string source_id, string orderNum, string plant_id, string wkc, string workNum, string delivery_num, string item_code, string recept_flag, string GroupID, object userState) { + if ((this.Web_DirectUpload_Document_VerifyOKOperationCompleted == null)) { + this.Web_DirectUpload_Document_VerifyOKOperationCompleted = new System.Threading.SendOrPostCallback(this.OnWeb_DirectUpload_Document_VerifyOKOperationCompleted); + } + this.InvokeAsync("Web_DirectUpload_Document_VerifyOK", new object[] { + source_id, + orderNum, + plant_id, + wkc, + workNum, + delivery_num, + item_code, + recept_flag, + GroupID}, this.Web_DirectUpload_Document_VerifyOKOperationCompleted, userState); + } + + private void OnWeb_DirectUpload_Document_VerifyOKOperationCompleted(object arg) { + if ((this.Web_DirectUpload_Document_VerifyOKCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.Web_DirectUpload_Document_VerifyOKCompleted(this, new Web_DirectUpload_Document_VerifyOKCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/CrrentOrderStateSelect", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public System.Data.DataTable CrrentOrderStateSelect(string plant_code, string wkc, string StartTime, string EndTime) { + object[] results = this.Invoke("CrrentOrderStateSelect", new object[] { + plant_code, + wkc, + StartTime, + EndTime}); + return ((System.Data.DataTable)(results[0])); + } + + /// + public void CrrentOrderStateSelectAsync(string plant_code, string wkc, string StartTime, string EndTime) { + this.CrrentOrderStateSelectAsync(plant_code, wkc, StartTime, EndTime, null); + } + + /// + public void CrrentOrderStateSelectAsync(string plant_code, string wkc, string StartTime, string EndTime, object userState) { + if ((this.CrrentOrderStateSelectOperationCompleted == null)) { + this.CrrentOrderStateSelectOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCrrentOrderStateSelectOperationCompleted); + } + this.InvokeAsync("CrrentOrderStateSelect", new object[] { + plant_code, + wkc, + StartTime, + EndTime}, this.CrrentOrderStateSelectOperationCompleted, userState); + } + + private void OnCrrentOrderStateSelectOperationCompleted(object arg) { + if ((this.CrrentOrderStateSelectCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.CrrentOrderStateSelectCompleted(this, new CrrentOrderStateSelectCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Web_MaterialPull_AndonCall_VerifyOK", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string Web_MaterialPull_AndonCall_VerifyOK( + string PLANT_ID, + string WORK_CENTER_CODE, + string ANDON_TYPE, + string PROCESS_GROUP_ID, + string SOURCE_ID, + string ANDON_NUMBER, + string WORK_NUMBER, + string EMPLOYEE_NUMBER, + string ITEM_CODE, + string ITEM_DESCRIPTIONS, + string QUANTITY, + string ANDON_TIME, + string process_status, + string FLAG, + string REMARK, + string stot_flag) { + object[] results = this.Invoke("Web_MaterialPull_AndonCall_VerifyOK", new object[] { + PLANT_ID, + WORK_CENTER_CODE, + ANDON_TYPE, + PROCESS_GROUP_ID, + SOURCE_ID, + ANDON_NUMBER, + WORK_NUMBER, + EMPLOYEE_NUMBER, + ITEM_CODE, + ITEM_DESCRIPTIONS, + QUANTITY, + ANDON_TIME, + process_status, + FLAG, + REMARK, + stot_flag}); + return ((string)(results[0])); + } + + /// + public void Web_MaterialPull_AndonCall_VerifyOKAsync( + string PLANT_ID, + string WORK_CENTER_CODE, + string ANDON_TYPE, + string PROCESS_GROUP_ID, + string SOURCE_ID, + string ANDON_NUMBER, + string WORK_NUMBER, + string EMPLOYEE_NUMBER, + string ITEM_CODE, + string ITEM_DESCRIPTIONS, + string QUANTITY, + string ANDON_TIME, + string process_status, + string FLAG, + string REMARK, + string stot_flag) { + this.Web_MaterialPull_AndonCall_VerifyOKAsync(PLANT_ID, WORK_CENTER_CODE, ANDON_TYPE, PROCESS_GROUP_ID, SOURCE_ID, ANDON_NUMBER, WORK_NUMBER, EMPLOYEE_NUMBER, ITEM_CODE, ITEM_DESCRIPTIONS, QUANTITY, ANDON_TIME, process_status, FLAG, REMARK, stot_flag, null); + } + + /// + public void Web_MaterialPull_AndonCall_VerifyOKAsync( + string PLANT_ID, + string WORK_CENTER_CODE, + string ANDON_TYPE, + string PROCESS_GROUP_ID, + string SOURCE_ID, + string ANDON_NUMBER, + string WORK_NUMBER, + string EMPLOYEE_NUMBER, + string ITEM_CODE, + string ITEM_DESCRIPTIONS, + string QUANTITY, + string ANDON_TIME, + string process_status, + string FLAG, + string REMARK, + string stot_flag, + object userState) { + if ((this.Web_MaterialPull_AndonCall_VerifyOKOperationCompleted == null)) { + this.Web_MaterialPull_AndonCall_VerifyOKOperationCompleted = new System.Threading.SendOrPostCallback(this.OnWeb_MaterialPull_AndonCall_VerifyOKOperationCompleted); + } + this.InvokeAsync("Web_MaterialPull_AndonCall_VerifyOK", new object[] { + PLANT_ID, + WORK_CENTER_CODE, + ANDON_TYPE, + PROCESS_GROUP_ID, + SOURCE_ID, + ANDON_NUMBER, + WORK_NUMBER, + EMPLOYEE_NUMBER, + ITEM_CODE, + ITEM_DESCRIPTIONS, + QUANTITY, + ANDON_TIME, + process_status, + FLAG, + REMARK, + stot_flag}, this.Web_MaterialPull_AndonCall_VerifyOKOperationCompleted, userState); + } + + private void OnWeb_MaterialPull_AndonCall_VerifyOKOperationCompleted(object arg) { + if ((this.Web_MaterialPull_AndonCall_VerifyOKCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.Web_MaterialPull_AndonCall_VerifyOKCompleted(this, new Web_MaterialPull_AndonCall_VerifyOKCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Select_AndonCall_Result", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public System.Data.DataTable Select_AndonCall_Result(string PROCESS_GROUP_ID) { + object[] results = this.Invoke("Select_AndonCall_Result", new object[] { + PROCESS_GROUP_ID}); + return ((System.Data.DataTable)(results[0])); + } + + /// + public void Select_AndonCall_ResultAsync(string PROCESS_GROUP_ID) { + this.Select_AndonCall_ResultAsync(PROCESS_GROUP_ID, null); + } + + /// + public void Select_AndonCall_ResultAsync(string PROCESS_GROUP_ID, object userState) { + if ((this.Select_AndonCall_ResultOperationCompleted == null)) { + this.Select_AndonCall_ResultOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSelect_AndonCall_ResultOperationCompleted); + } + this.InvokeAsync("Select_AndonCall_Result", new object[] { + PROCESS_GROUP_ID}, this.Select_AndonCall_ResultOperationCompleted, userState); + } + + private void OnSelect_AndonCall_ResultOperationCompleted(object arg) { + if ((this.Select_AndonCall_ResultCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.Select_AndonCall_ResultCompleted(this, new Select_AndonCall_ResultCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Web_AndonPlanStop_Return_Exec", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string Web_AndonPlanStop_Return_Exec(string Plan_ID, string p_user_code, string StopMachine_style, string MachineCode, string p_andon_date_s, string p_andon_date_e, string p_enable_flag, string p_ClassCode, string StopMachine_diff) { + object[] results = this.Invoke("Web_AndonPlanStop_Return_Exec", new object[] { + Plan_ID, + p_user_code, + StopMachine_style, + MachineCode, + p_andon_date_s, + p_andon_date_e, + p_enable_flag, + p_ClassCode, + StopMachine_diff}); + return ((string)(results[0])); + } + + /// + public void Web_AndonPlanStop_Return_ExecAsync(string Plan_ID, string p_user_code, string StopMachine_style, string MachineCode, string p_andon_date_s, string p_andon_date_e, string p_enable_flag, string p_ClassCode, string StopMachine_diff) { + this.Web_AndonPlanStop_Return_ExecAsync(Plan_ID, p_user_code, StopMachine_style, MachineCode, p_andon_date_s, p_andon_date_e, p_enable_flag, p_ClassCode, StopMachine_diff, null); + } + + /// + public void Web_AndonPlanStop_Return_ExecAsync(string Plan_ID, string p_user_code, string StopMachine_style, string MachineCode, string p_andon_date_s, string p_andon_date_e, string p_enable_flag, string p_ClassCode, string StopMachine_diff, object userState) { + if ((this.Web_AndonPlanStop_Return_ExecOperationCompleted == null)) { + this.Web_AndonPlanStop_Return_ExecOperationCompleted = new System.Threading.SendOrPostCallback(this.OnWeb_AndonPlanStop_Return_ExecOperationCompleted); + } + this.InvokeAsync("Web_AndonPlanStop_Return_Exec", new object[] { + Plan_ID, + p_user_code, + StopMachine_style, + MachineCode, + p_andon_date_s, + p_andon_date_e, + p_enable_flag, + p_ClassCode, + StopMachine_diff}, this.Web_AndonPlanStop_Return_ExecOperationCompleted, userState); + } + + private void OnWeb_AndonPlanStop_Return_ExecOperationCompleted(object arg) { + if ((this.Web_AndonPlanStop_Return_ExecCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.Web_AndonPlanStop_Return_ExecCompleted(this, new Web_AndonPlanStop_Return_ExecCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Web_AndonPlanStopType", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public System.Data.DataTable Web_AndonPlanStopType(string Result) { + object[] results = this.Invoke("Web_AndonPlanStopType", new object[] { + Result}); + return ((System.Data.DataTable)(results[0])); + } + + /// + public void Web_AndonPlanStopTypeAsync(string Result) { + this.Web_AndonPlanStopTypeAsync(Result, null); + } + + /// + public void Web_AndonPlanStopTypeAsync(string Result, object userState) { + if ((this.Web_AndonPlanStopTypeOperationCompleted == null)) { + this.Web_AndonPlanStopTypeOperationCompleted = new System.Threading.SendOrPostCallback(this.OnWeb_AndonPlanStopTypeOperationCompleted); + } + this.InvokeAsync("Web_AndonPlanStopType", new object[] { + Result}, this.Web_AndonPlanStopTypeOperationCompleted, userState); + } + + private void OnWeb_AndonPlanStopTypeOperationCompleted(object arg) { + if ((this.Web_AndonPlanStopTypeCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.Web_AndonPlanStopTypeCompleted(this, new Web_AndonPlanStopTypeCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Web_MaterialPull_DocumentNum_Select", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public System.Data.DataSet Web_MaterialPull_DocumentNum_Select(string document_num, string wkc) { + object[] results = this.Invoke("Web_MaterialPull_DocumentNum_Select", new object[] { + document_num, + wkc}); + return ((System.Data.DataSet)(results[0])); + } + + /// + public void Web_MaterialPull_DocumentNum_SelectAsync(string document_num, string wkc) { + this.Web_MaterialPull_DocumentNum_SelectAsync(document_num, wkc, null); + } + + /// + public void Web_MaterialPull_DocumentNum_SelectAsync(string document_num, string wkc, object userState) { + if ((this.Web_MaterialPull_DocumentNum_SelectOperationCompleted == null)) { + this.Web_MaterialPull_DocumentNum_SelectOperationCompleted = new System.Threading.SendOrPostCallback(this.OnWeb_MaterialPull_DocumentNum_SelectOperationCompleted); + } + this.InvokeAsync("Web_MaterialPull_DocumentNum_Select", new object[] { + document_num, + wkc}, this.Web_MaterialPull_DocumentNum_SelectOperationCompleted, userState); + } + + private void OnWeb_MaterialPull_DocumentNum_SelectOperationCompleted(object arg) { + if ((this.Web_MaterialPull_DocumentNum_SelectCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.Web_MaterialPull_DocumentNum_SelectCompleted(this, new Web_MaterialPull_DocumentNum_SelectCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Web_MaterialPull_DocumentNum_VerifyOK", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string Web_MaterialPull_DocumentNum_VerifyOK(string source_id, string orderNum, string plant_id, string wkc, string workNum, string delivery_num, string item_code, string recept_flag, string type, string GroupID) { + object[] results = this.Invoke("Web_MaterialPull_DocumentNum_VerifyOK", new object[] { + source_id, + orderNum, + plant_id, + wkc, + workNum, + delivery_num, + item_code, + recept_flag, + type, + GroupID}); + return ((string)(results[0])); + } + + /// + public void Web_MaterialPull_DocumentNum_VerifyOKAsync(string source_id, string orderNum, string plant_id, string wkc, string workNum, string delivery_num, string item_code, string recept_flag, string type, string GroupID) { + this.Web_MaterialPull_DocumentNum_VerifyOKAsync(source_id, orderNum, plant_id, wkc, workNum, delivery_num, item_code, recept_flag, type, GroupID, null); + } + + /// + public void Web_MaterialPull_DocumentNum_VerifyOKAsync(string source_id, string orderNum, string plant_id, string wkc, string workNum, string delivery_num, string item_code, string recept_flag, string type, string GroupID, object userState) { + if ((this.Web_MaterialPull_DocumentNum_VerifyOKOperationCompleted == null)) { + this.Web_MaterialPull_DocumentNum_VerifyOKOperationCompleted = new System.Threading.SendOrPostCallback(this.OnWeb_MaterialPull_DocumentNum_VerifyOKOperationCompleted); + } + this.InvokeAsync("Web_MaterialPull_DocumentNum_VerifyOK", new object[] { + source_id, + orderNum, + plant_id, + wkc, + workNum, + delivery_num, + item_code, + recept_flag, + type, + GroupID}, this.Web_MaterialPull_DocumentNum_VerifyOKOperationCompleted, userState); + } + + private void OnWeb_MaterialPull_DocumentNum_VerifyOKOperationCompleted(object arg) { + if ((this.Web_MaterialPull_DocumentNum_VerifyOKCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.Web_MaterialPull_DocumentNum_VerifyOKCompleted(this, new Web_MaterialPull_DocumentNum_VerifyOKCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Select_DocumentReceptCord_Result", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public System.Data.DataSet Select_DocumentReceptCord_Result(string DocumentNum, string PROCESS_GROUP_ID) { + object[] results = this.Invoke("Select_DocumentReceptCord_Result", new object[] { + DocumentNum, + PROCESS_GROUP_ID}); + return ((System.Data.DataSet)(results[0])); + } + + /// + public void Select_DocumentReceptCord_ResultAsync(string DocumentNum, string PROCESS_GROUP_ID) { + this.Select_DocumentReceptCord_ResultAsync(DocumentNum, PROCESS_GROUP_ID, null); + } + + /// + public void Select_DocumentReceptCord_ResultAsync(string DocumentNum, string PROCESS_GROUP_ID, object userState) { + if ((this.Select_DocumentReceptCord_ResultOperationCompleted == null)) { + this.Select_DocumentReceptCord_ResultOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSelect_DocumentReceptCord_ResultOperationCompleted); + } + this.InvokeAsync("Select_DocumentReceptCord_Result", new object[] { + DocumentNum, + PROCESS_GROUP_ID}, this.Select_DocumentReceptCord_ResultOperationCompleted, userState); + } + + private void OnSelect_DocumentReceptCord_ResultOperationCompleted(object arg) { + if ((this.Select_DocumentReceptCord_ResultCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.Select_DocumentReceptCord_ResultCompleted(this, new Select_DocumentReceptCord_ResultCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Web_OnePieceFlowModle_Judge", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public System.Data.DataTable Web_OnePieceFlowModle_Judge(string BarCode, string wkc) { + object[] results = this.Invoke("Web_OnePieceFlowModle_Judge", new object[] { + BarCode, + wkc}); + return ((System.Data.DataTable)(results[0])); + } + + /// + public void Web_OnePieceFlowModle_JudgeAsync(string BarCode, string wkc) { + this.Web_OnePieceFlowModle_JudgeAsync(BarCode, wkc, null); + } + + /// + public void Web_OnePieceFlowModle_JudgeAsync(string BarCode, string wkc, object userState) { + if ((this.Web_OnePieceFlowModle_JudgeOperationCompleted == null)) { + this.Web_OnePieceFlowModle_JudgeOperationCompleted = new System.Threading.SendOrPostCallback(this.OnWeb_OnePieceFlowModle_JudgeOperationCompleted); + } + this.InvokeAsync("Web_OnePieceFlowModle_Judge", new object[] { + BarCode, + wkc}, this.Web_OnePieceFlowModle_JudgeOperationCompleted, userState); + } + + private void OnWeb_OnePieceFlowModle_JudgeOperationCompleted(object arg) { + if ((this.Web_OnePieceFlowModle_JudgeCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.Web_OnePieceFlowModle_JudgeCompleted(this, new Web_OnePieceFlowModle_JudgeCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Web_OnePieceFlowModle_DetaileInfo", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public System.Data.DataTable Web_OnePieceFlowModle_DetaileInfo(string BarCode, string wkc) { + object[] results = this.Invoke("Web_OnePieceFlowModle_DetaileInfo", new object[] { + BarCode, + wkc}); + return ((System.Data.DataTable)(results[0])); + } + + /// + public void Web_OnePieceFlowModle_DetaileInfoAsync(string BarCode, string wkc) { + this.Web_OnePieceFlowModle_DetaileInfoAsync(BarCode, wkc, null); + } + + /// + public void Web_OnePieceFlowModle_DetaileInfoAsync(string BarCode, string wkc, object userState) { + if ((this.Web_OnePieceFlowModle_DetaileInfoOperationCompleted == null)) { + this.Web_OnePieceFlowModle_DetaileInfoOperationCompleted = new System.Threading.SendOrPostCallback(this.OnWeb_OnePieceFlowModle_DetaileInfoOperationCompleted); + } + this.InvokeAsync("Web_OnePieceFlowModle_DetaileInfo", new object[] { + BarCode, + wkc}, this.Web_OnePieceFlowModle_DetaileInfoOperationCompleted, userState); + } + + private void OnWeb_OnePieceFlowModle_DetaileInfoOperationCompleted(object arg) { + if ((this.Web_OnePieceFlowModle_DetaileInfoCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.Web_OnePieceFlowModle_DetaileInfoCompleted(this, new Web_OnePieceFlowModle_DetaileInfoCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + public new void CancelAsync(object userState) { + base.CancelAsync(userState); + } + + private bool IsLocalFileSystemWebService(string url) { + if (((url == null) + || (url == string.Empty))) { + return false; + } + System.Uri wsUri = new System.Uri(url); + if (((wsUri.Port >= 1024) + && (string.Compare(wsUri.Host, "localHost", System.StringComparison.OrdinalIgnoreCase) == 0))) { + return true; + } + return false; + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + public delegate void HelloWorldCompletedEventHandler(object sender, HelloWorldCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class HelloWorldCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal HelloWorldCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public string Result { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + public delegate void Web_BarcodeReturn_Split_ExecCompletedEventHandler(object sender, Web_BarcodeReturn_Split_ExecCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Web_BarcodeReturn_Split_ExecCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal Web_BarcodeReturn_Split_ExecCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public string Result { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + public delegate void Web_BarcodeReturn_Return_ExecCompletedEventHandler(object sender, Web_BarcodeReturn_Return_ExecCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Web_BarcodeReturn_Return_ExecCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal Web_BarcodeReturn_Return_ExecCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public string Result { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + public delegate void Web_Barcode_Return_ReturnCancel_OracleCompletedEventHandler(object sender, Web_Barcode_Return_ReturnCancel_OracleCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Web_Barcode_Return_ReturnCancel_OracleCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal Web_Barcode_Return_ReturnCancel_OracleCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public string Result { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + public delegate void Web_DirectUpload_Document_SelectCompletedEventHandler(object sender, Web_DirectUpload_Document_SelectCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Web_DirectUpload_Document_SelectCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal Web_DirectUpload_Document_SelectCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public System.Data.DataSet Result { + get { + this.RaiseExceptionIfNecessary(); + return ((System.Data.DataSet)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + public delegate void Web_DirectUpload_Document_VerifyOKCompletedEventHandler(object sender, Web_DirectUpload_Document_VerifyOKCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Web_DirectUpload_Document_VerifyOKCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal Web_DirectUpload_Document_VerifyOKCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public string Result { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + public delegate void CrrentOrderStateSelectCompletedEventHandler(object sender, CrrentOrderStateSelectCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class CrrentOrderStateSelectCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal CrrentOrderStateSelectCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public System.Data.DataTable Result { + get { + this.RaiseExceptionIfNecessary(); + return ((System.Data.DataTable)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + public delegate void Web_MaterialPull_AndonCall_VerifyOKCompletedEventHandler(object sender, Web_MaterialPull_AndonCall_VerifyOKCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Web_MaterialPull_AndonCall_VerifyOKCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal Web_MaterialPull_AndonCall_VerifyOKCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public string Result { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + public delegate void Select_AndonCall_ResultCompletedEventHandler(object sender, Select_AndonCall_ResultCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Select_AndonCall_ResultCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal Select_AndonCall_ResultCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public System.Data.DataTable Result { + get { + this.RaiseExceptionIfNecessary(); + return ((System.Data.DataTable)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + public delegate void Web_AndonPlanStop_Return_ExecCompletedEventHandler(object sender, Web_AndonPlanStop_Return_ExecCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Web_AndonPlanStop_Return_ExecCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal Web_AndonPlanStop_Return_ExecCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public string Result { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + public delegate void Web_AndonPlanStopTypeCompletedEventHandler(object sender, Web_AndonPlanStopTypeCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Web_AndonPlanStopTypeCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal Web_AndonPlanStopTypeCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public System.Data.DataTable Result { + get { + this.RaiseExceptionIfNecessary(); + return ((System.Data.DataTable)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + public delegate void Web_MaterialPull_DocumentNum_SelectCompletedEventHandler(object sender, Web_MaterialPull_DocumentNum_SelectCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Web_MaterialPull_DocumentNum_SelectCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal Web_MaterialPull_DocumentNum_SelectCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public System.Data.DataSet Result { + get { + this.RaiseExceptionIfNecessary(); + return ((System.Data.DataSet)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + public delegate void Web_MaterialPull_DocumentNum_VerifyOKCompletedEventHandler(object sender, Web_MaterialPull_DocumentNum_VerifyOKCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Web_MaterialPull_DocumentNum_VerifyOKCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal Web_MaterialPull_DocumentNum_VerifyOKCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public string Result { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + public delegate void Select_DocumentReceptCord_ResultCompletedEventHandler(object sender, Select_DocumentReceptCord_ResultCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Select_DocumentReceptCord_ResultCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal Select_DocumentReceptCord_ResultCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public System.Data.DataSet Result { + get { + this.RaiseExceptionIfNecessary(); + return ((System.Data.DataSet)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + public delegate void Web_OnePieceFlowModle_JudgeCompletedEventHandler(object sender, Web_OnePieceFlowModle_JudgeCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Web_OnePieceFlowModle_JudgeCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal Web_OnePieceFlowModle_JudgeCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public System.Data.DataTable Result { + get { + this.RaiseExceptionIfNecessary(); + return ((System.Data.DataTable)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + public delegate void Web_OnePieceFlowModle_DetaileInfoCompletedEventHandler(object sender, Web_OnePieceFlowModle_DetaileInfoCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.6.81.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Web_OnePieceFlowModle_DetaileInfoCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal Web_OnePieceFlowModle_DetaileInfoCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public System.Data.DataTable Result { + get { + this.RaiseExceptionIfNecessary(); + return ((System.Data.DataTable)(this.results[0])); + } + } + } +} + +#pragma warning restore 1591 \ No newline at end of file diff --git a/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction01.cs b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction01.cs new file mode 100644 index 0000000..a07d4d1 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction01.cs @@ -0,0 +1,475 @@ +using bizFacade; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web; +//using SystemFramework; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +namespace MesWebFun +{ + public class WebFunction01 + { + // HttpContext contextMesWebFun; + public string ProcessRequest(string cmd) + { + string responseText = ""; + switch (cmd) + { + ////保存手动生成条码 + //case "SavingEngineIDShift": + // responseText = SavingEngineIDShift(); + // break; + //case "SaveRepairStatus"://将返修路径及返修数据保存到数据库 + // responseText = SaveRepairStatus(); + // break; + //case "RepairStatusInit"://将返修路径及返修数据保存到数据库 + // responseText = RepairStatusInit(); + // break; + //case "Select_engineType_ByEnergineID": //根据发动机号显示机型 + // responseText = Select_engineType_ByEnergineID(); + // break; + //case "QualityDataButton_bgColor_Select_ByEnergineID": + // responseText = QualityDataButton_bgColor_Select_energineSelect(); + // break; + /////////////////////////质量查询根据发动机号 + //case "QualityDataSelectByEnergineID": + // responseText = QualityDataSelectByEnergineID(); + // break; + default: + responseText = "01"; + break; + } + return responseText; + } + /// + /// //根据发动机号显示机型,界面提示 + /// + /// + private string Select_engineType_ByEnergineID(string opName, string energineID) + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //string energineID = HttpContext.Current.Request["energineID"];//发动机号 + GetEngineID_Select(energineID, opName, out dt); + + string engineType = ""; + if (dt != null) + { + if (dt.Rows.Count > 0) + { + engineType = dt.Rows[0]["发动机型号"].ToString(); + } + } + text = "{\"engineType\":\"" + engineType + "\"}"; + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun08:Select_engineType_ByEnergineID"); + } + return text; + } + /// + /// 保存手动要求的条码 + /// + /// + private string SavingEngineIDShift(string opname, string date, string num) + { + string text = ""; + bool flag = false; + System.Data.DataTable dt = null; + try + { + //string date = HttpContext.Current.Request["date"];//日期 + //string num = HttpContext.Current.Request["num"];//流水号 + string[] dates = date.Split('-'); + if (dates.Length > 2) + { + int year = Convert.ToInt32(dates[0]); + int month = Convert.ToInt32(dates[1]); + int day = Convert.ToInt32(dates[2]); + int single = Convert.ToInt32(num); + MES.OpName_MIS_Manual_Insert(opname, year, month, day, single); + flag = true; + } + if (flag) + { + text = "{\"flag\":\"1\"}"; + } + else + { + text = "{\"flag\":\"0\"}"; + } + return text; + } + catch (Exception err) + { + text = "{\"flag\":\"0\"}"; + //ApplicationLog.WriteLog(err, "MesWebFun01:SavingEngineIDShift"); + return text; + } + } + + private static string RepairStatusInit(string Opname, string selectID) + { + //string selectID = HttpContext.Current.Request["text_selectByID"];//工位号 text_selectByID + string outtext = CreateRepairUpLine(Opname, selectID); + return outtext; + } + + + /// + /// 动态创建返修上线工位按钮 + /// + /// + /// + public static string CreateRepairUpLine(string OpName, string selectID) + { + StringBuilder HtmlStr = new StringBuilder();//可修改字符串 + + string BtnData = ""; + int RouteNum = 0; + bool HaveDataOrNot = false; + DataTable dt; + + string StationDataStr;//最近一条返修工位数据 + //查询返修上线字符串及路径数目 + RepairBtnDataSelect(OpName, out BtnData, out RouteNum); + string[] RepairSta = BtnData.Split('^');//目标工位数组 + string TargetStationData = "";//目标工位数据 + //查询之前的返修上线数据 + HaveDataOrNot = selectRepairStrSelect(OpName, selectID, out dt); + //合成界面显示按钮字符串 + if (HaveDataOrNot) + { + StationDataStr = dt.Rows[0]["返修字符串"].ToString(); + if (StationDataStr == "") + { + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + else + { + TargetStationData = StationDataStr; + } + } + else + { + + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + //页面定义 + HtmlStr.Append("\r\n"); + for (int i = 0; i < RepairSta.Length; i++) + { + //动态生成标签 + //样式定义 + string td_style = "width:20%;height:35px";//td样式 + string btn_style = "width:98%;height:98%;font-family:微软雅黑;font-size:15px;border-color: #99CCFF";//标签样式 + string type = "button"; + string tagID = "Btn_" + RepairSta[i]; + string value = RepairSta[i]; + string onclick = "RepairBtnClick(Btn_" + value + ")"; + string[] StationDataArray = TargetStationData.Split('^'); + string bgColor; + + if (StationDataArray[i] == "1") + { + bgColor = "background-color: green"; + } + else + { + bgColor = "background-color: gray"; + } + //保证每行5个按钮 + if (i < RepairSta.Length - 1) + { + if (i % 5 < 4) + { + HtmlStr.Append(""); + } + else + { + HtmlStr.Append(""); + HtmlStr.Append("\r\n"); + } + } + else + { + HtmlStr.Append(""); + HtmlStr.Append(""); + } + + } + HtmlStr.Append("
"); + //上线路径大于1条则显示上线路径 + if (RouteNum > 1) + { + + } + return HtmlStr.ToString(); + } + + + /// + /// 向数据库写入返修数据 + /// + /// + /// + /// + public static bool updateRepairStatusTo_SQL(string opname, string status) + { + string produceName = "测量数据_返修工位_工位状态_修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", status); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + private static string SaveRepairStatus(string RepairStatus, string engineID, int RepairMethod, string engineType, string RepairOpName) + { + + try + { + //string RepairStatus = HttpContext.Current.Request["str_value"];//返修工位状态 + //string engineID = HttpContext.Current.Request["engineID"];//返修零件总成号 + //int RepairMethod = Convert.ToInt32(HttpContext.Current.Request["RepairMethod"]);//返修路径 + //string engineType = HttpContext.Current.Request["engineType"];//返修零件总成号 + //string RepairOpName = HttpContext.Current.Request["OpName"];//返修上线点 + string[] RepairStatusSplit = RepairStatus.Split('|'); + for (int i = 0; i < RepairStatusSplit.Length - 1; i++) + { + updateRepairStatusTo_SQL(RepairStatusSplit[i].Split('^')[0], RepairStatusSplit[i].Split('^')[1]); + } + + string produceName = "返修上线_返修工位及返修路径_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总成编号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", RepairStatus); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@返修路径", RepairMethod); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@返修上线点", RepairOpName); + string result = Convert.ToString(DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)); + return result; + } + catch (Exception err) + { + return "0"; + } + + } + /// [电子看板_发动机号_线首工位_查询_根据发动机号] 20160728 majian + /// + /// + /// + static public bool GetEngineID_Select(string engineID, string opName, out DataTable dt) + { + string errorMessage = ""; + DataSet ds; + bool isOK; + dt = null; + //string connectionString = ApplicationConfig.ConnectionString; + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_根据发动机号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + dt = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + private string QualityDataButton_bgColor_Select_energineSelect(string energineID, string opname) + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //单号 + //string energineID = HttpContext.Current.Request["energineID"]; + QualityDataButton_bgColor_Select(opname, energineID, out dt);//此处重新写函数 + if (dt != null) + { + if (dt.Rows.Count >= 0) + { + text = Buttons.Createbuttons(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun02:QualityDataButton_bgColor_Select"); + } + return text; + + } + /// WEB根据工位名称和发动机号查询质量数据合格索引(包括了分线的信息、存储过程中根据工位类型区分) 20140626 wt + /// + /// + /// + /// + /// + public static bool QualityDataButton_bgColor_Select(string opname, string energineID, out DataTable dt) + { + string procedureName = "显示测量数据_工位号_根据发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + /// + /// 获取对应工位的质量数据 + /// + /// + private string QualityDataSelectByEnergineID(string energineID, string opname) + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + //string energineID = HttpContext.Current.Request["value"]; + QualityDataSelect(opname, energineID, out dt); + if (dt != null) + { + //if (dt.Rows.Count > 0) + { + qualitydata = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun10:QualityDataSelect"); + } + return qualitydata; + + } + + static public bool QualityDataSelect(string opname, string energineID, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_根据_工位号_发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 查询返修上线工位及返修路径数目 + /// + /// + /// + /// + public static void RepairBtnDataSelect(string OpName, out string BtnData, out int RouteNum) + { + + DataTable dt; + string procedureName; + BtnData = ""; + RouteNum = 0; + procedureName = "返修上线_返修工位_返修上线点及返修路径_基础配置_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + BtnData = dt.Rows[0]["待返修工位"].ToString(); + RouteNum = Convert.ToInt32(dt.Rows[0]["返修路径数目"]); + } + } + } + + + /// + /// 查询当前上线点上次选择的返修工位,用于界面按钮颜色原始数据 + /// + /// + /// + /// + public static bool selectRepairData(string OpName, out DataTable dt) + { + + string procedureName; + procedureName = "返修上线_返修工位及返修路径_最近数据_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + } + /// + /// + /// + /// + /// + /// + public static bool selectRepairStrSelect(string OpName, string selectID, out DataTable dt) + { + string procedureName; + procedureName = "返修上线_返修工位及返修路径_是否工作判断"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", selectID); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + + } + } +} diff --git a/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction02.cs b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction02.cs new file mode 100644 index 0000000..45ac8bf --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction02.cs @@ -0,0 +1,489 @@ +using DataLinkMesWork; +using bizFacade; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web; +//using SystemFramework; + +namespace MesWebFun +{ + public class WebFunction02 + { + HttpContext contextMesWebFun; + public string ProcessRequest(HttpContext context) + { + contextMesWebFun = context; ; + context.Response.ContentType = "text/plain"; + string type = contextMesWebFun.Request["type"]; + string responseText = ""; + switch (type) + { + //托盘信息 + case "MobySelect": + // responseText = MobySelect(); + break; + //保存手动生成条码 + case "SavingEngineIDShift": + responseText = SavingEngineIDShift(); + break; + case "SaveRepairStatus"://将返修路径及返修数据保存到数据库 + responseText = SaveRepairStatus(); + break; + case "RepairStatusInit"://将返修路径及返修数据保存到数据库 + responseText = RepairStatusInit(); + break; + case "Select_engineType_ByEnergineID": //根据发动机号显示机型 + responseText = Select_engineType_ByEnergineID(); + break; + case "QualityDataButton_bgColor_Select_ByEnergineID": + responseText = QualityDataButton_bgColor_Select_energineSelect(); + break; + ///////////////////////质量查询根据发动机号 + case "QualityDataSelectByEnergineID": + responseText = QualityDataSelectByEnergineID(); + break; + default: + responseText = "02"; + break; + } + return responseText; + } + /// + /// //根据发动机号显示机型,界面提示 + /// + /// + private string Select_engineType_ByEnergineID() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + string opName = HttpContext.Current.Request["value"];//发动机号 + string energineID = HttpContext.Current.Request["energineID"];//发动机号 + GetEngineID_Select(energineID, opName, out dt); + + string engineType = ""; + if (dt != null) + { + if (dt.Rows.Count > 0) + { + engineType = dt.Rows[0]["发动机型号"].ToString(); + } + } + text = "{\"engineType\":\"" + engineType + "\"}"; + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun08:Select_engineType_ByEnergineID"); + } + return text; + } + /// + /// 保存手动要求的条码 + /// + /// + private string SavingEngineIDShift() + { + string text = ""; + bool flag = false; + System.Data.DataTable dt = null; + try + { + string opname = HttpContext.Current.Request["value"];//工位号 + string date = HttpContext.Current.Request["date"];//日期 + string num = HttpContext.Current.Request["num"];//流水号 + string[] dates = date.Split('-'); + if (dates.Length > 2) + { + int year = Convert.ToInt32(dates[0]); + int month = Convert.ToInt32(dates[1]); + int day = Convert.ToInt32(dates[2]); + int single = Convert.ToInt32(num); + MES.OpName_MIS_Manual_Insert(opname, year, month, day, single); + flag = true; + } + if (flag) + { + text = "{\"flag\":\"1\"}"; + } + else + { + text = "{\"flag\":\"0\"}"; + } + return text; + } + catch (Exception err) + { + text = "{\"flag\":\"0\"}"; + //ApplicationLog.WriteLog(err, "MesWebFun01:SavingEngineIDShift"); + return text; + } + } + + private static string RepairStatusInit() + { + string Opname = HttpContext.Current.Request["value"];//工位号 + string selectID = HttpContext.Current.Request["text_selectByID"];//工位号 text_selectByID + string outtext = CreateRepairUpLine(Opname, selectID); + return outtext; + } + + + /// + /// 动态创建返修上线工位按钮 + /// + /// + /// + public static string CreateRepairUpLine(string OpName, string selectID) + { + StringBuilder HtmlStr = new StringBuilder();//可修改字符串 + + string BtnData = ""; + int RouteNum = 0; + bool HaveDataOrNot = false; + DataTable dt; + + string StationDataStr;//最近一条返修工位数据 + //查询返修上线字符串及路径数目 + RepairBtnDataSelect(OpName, out BtnData, out RouteNum); + string[] RepairSta = BtnData.Split('^');//目标工位数组 + string TargetStationData = "";//目标工位数据 + //查询之前的返修上线数据 + HaveDataOrNot = selectRepairStrSelect(OpName, selectID, out dt); + //合成界面显示按钮字符串 + if (HaveDataOrNot) + { + StationDataStr = dt.Rows[0]["返修字符串"].ToString(); + if (StationDataStr == "") + { + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + else + { + TargetStationData = StationDataStr; + } + } + else + { + + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + //页面定义 + HtmlStr.Append("\r\n"); + for (int i = 0; i < RepairSta.Length; i++) + { + //动态生成标签 + //样式定义 + string td_style = "width:20%;height:35px";//td样式 + string btn_style = "width:98%;height:98%;font-family:微软雅黑;font-size:15px;border-color: #99CCFF";//标签样式 + string type = "button"; + string tagID = "Btn_" + RepairSta[i]; + string value = RepairSta[i]; + string onclick = "RepairBtnClick(Btn_" + value + ")"; + string[] StationDataArray = TargetStationData.Split('^'); + string bgColor; + + if (StationDataArray[i] == "1") + { + bgColor = "background-color: green"; + } + else + { + bgColor = "background-color: gray"; + } + //保证每行5个按钮 + if (i < RepairSta.Length - 1) + { + if (i % 5 < 4) + { + HtmlStr.Append(""); + } + else + { + HtmlStr.Append(""); + HtmlStr.Append("\r\n"); + } + } + else + { + HtmlStr.Append(""); + HtmlStr.Append(""); + } + + } + HtmlStr.Append("
"); + //上线路径大于1条则显示上线路径 + if (RouteNum > 1) + { + + } + return HtmlStr.ToString(); + } + + + /// + /// 向数据库写入返修数据 + /// + /// + /// + /// + public static bool updateRepairStatusTo_SQL(string opname, string status) + { + string produceName = "测量数据_返修工位_工位状态_修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", status); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + private static string SaveRepairStatus() + { + + try + { + string RepairStatus = HttpContext.Current.Request["str_value"];//返修工位状态 + string engineID = HttpContext.Current.Request["engineID"];//返修零件总成号 + int RepairMethod = Convert.ToInt32(HttpContext.Current.Request["RepairMethod"]);//返修路径 + string engineType = HttpContext.Current.Request["engineType"];//返修零件总成号 + string RepairOpName = HttpContext.Current.Request["OpName"];//返修上线点 + string[] RepairStatusSplit = RepairStatus.Split('|'); + for (int i = 0; i < RepairStatusSplit.Length - 1; i++) + { + updateRepairStatusTo_SQL(RepairStatusSplit[i].Split('^')[0], RepairStatusSplit[i].Split('^')[1]); + } + + string produceName = "返修上线_返修工位及返修路径_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总成编号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", RepairStatus); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@返修路径", RepairMethod); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@返修上线点", RepairOpName); + string result = Convert.ToString(DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)); + return result; + } + catch (Exception err) + { + return "0"; + } + + } + /// [电子看板_发动机号_线首工位_查询_根据发动机号] 20160728 majian + /// + /// + /// + static public bool GetEngineID_Select(string engineID, string opName, out DataTable dt) + { + string errorMessage = ""; + DataSet ds; + bool isOK; + dt = null; + //string connectionString = ApplicationConfig.ConnectionString; + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_根据发动机号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + dt = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + private string QualityDataButton_bgColor_Select_energineSelect() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //单号 + string energineID = HttpContext.Current.Request["energineID"]; + string opname = HttpContext.Current.Request["value"]; + QualityDataButton_bgColor_Select(opname, energineID, out dt);//此处重新写函数 + if (dt != null) + { + if (dt.Rows.Count >= 0) + { + text = Buttons.Createbuttons(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun02:QualityDataButton_bgColor_Select"); + } + return text; + + } + /// WEB根据工位名称和发动机号查询质量数据合格索引(包括了分线的信息、存储过程中根据工位类型区分) 20140626 wt + /// + /// + /// + /// + /// + public static bool QualityDataButton_bgColor_Select(string opname, string energineID, out DataTable dt) + { + string procedureName = "显示测量数据_工位号_根据发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + /// + /// 获取对应工位的质量数据 + /// + /// + private string QualityDataSelectByEnergineID() + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + string energineID = HttpContext.Current.Request["value"]; + string opname = HttpContext.Current.Request["opname"]; + QualityDataSelect(opname, energineID, out dt); + if (dt != null) + { + //if (dt.Rows.Count > 0) + { + qualitydata = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun10:QualityDataSelect"); + } + return qualitydata; + + } + + static public bool QualityDataSelect(string opname, string energineID, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_根据_工位号_发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 查询返修上线工位及返修路径数目 + /// + /// + /// + /// + public static void RepairBtnDataSelect(string OpName, out string BtnData, out int RouteNum) + { + + DataTable dt; + string procedureName; + BtnData = ""; + RouteNum = 0; + procedureName = "返修上线_返修工位_返修上线点及返修路径_基础配置_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + BtnData = dt.Rows[0]["待返修工位"].ToString(); + RouteNum = Convert.ToInt32(dt.Rows[0]["返修路径数目"]); + } + } + } + + + /// + /// 查询当前上线点上次选择的返修工位,用于界面按钮颜色原始数据 + /// + /// + /// + /// + public static bool selectRepairData(string OpName, out DataTable dt) + { + + string procedureName; + procedureName = "返修上线_返修工位及返修路径_最近数据_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + } + /// + /// + /// + /// + /// + /// + public static bool selectRepairStrSelect(string OpName, string selectID, out DataTable dt) + { + string procedureName; + procedureName = "返修上线_返修工位及返修路径_是否工作判断"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", selectID); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + + } + + } +} diff --git a/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction04.cs b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction04.cs new file mode 100644 index 0000000..b9f3728 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction04.cs @@ -0,0 +1,491 @@ +using DataLinkMesWork; +using bizFacade; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web; +//using SystemFramework; + +namespace MesWebFun +{ + public class WebFunction04 + { + HttpContext contextMesWebFun; + public string ProcessRequest(HttpContext context) + { + contextMesWebFun = context; ; + context.Response.ContentType = "text/plain"; + string type = contextMesWebFun.Request["type"]; + string responseText = ""; + switch (type) + { + //托盘信息 + case "MobySelect": + // responseText = MobySelect(); + break; + //保存手动生成条码 + case "SavingEngineIDShift": + responseText = SavingEngineIDShift(); + break; + case "SaveRepairStatus"://将返修路径及返修数据保存到数据库 + responseText = SaveRepairStatus(); + break; + case "RepairStatusInit"://将返修路径及返修数据保存到数据库 + responseText = RepairStatusInit(); + break; + case "Select_engineType_ByEnergineID": //根据发动机号显示机型 + responseText = Select_engineType_ByEnergineID(); + break; + case "QualityDataButton_bgColor_Select_ByEnergineID": + responseText = QualityDataButton_bgColor_Select_energineSelect(); + break; + ///////////////////////质量查询根据发动机号 + case "QualityDataSelectByEnergineID": + responseText = QualityDataSelectByEnergineID(); + break; + default: + responseText = "04"; + break; + + + } + return responseText; + } + /// + /// //根据发动机号显示机型,界面提示 + /// + /// + private string Select_engineType_ByEnergineID() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + string opName = HttpContext.Current.Request["value"];//发动机号 + string energineID = HttpContext.Current.Request["energineID"];//发动机号 + GetEngineID_Select(energineID, opName, out dt); + + string engineType = ""; + if (dt != null) + { + if (dt.Rows.Count > 0) + { + engineType = dt.Rows[0]["发动机型号"].ToString(); + } + } + text = "{\"engineType\":\"" + engineType + "\"}"; + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun08:Select_engineType_ByEnergineID"); + } + return text; + } + /// + /// 保存手动要求的条码 + /// + /// + private string SavingEngineIDShift() + { + string text = ""; + bool flag = false; + System.Data.DataTable dt = null; + try + { + string opname = HttpContext.Current.Request["value"];//工位号 + string date = HttpContext.Current.Request["date"];//日期 + string num = HttpContext.Current.Request["num"];//流水号 + string[] dates = date.Split('-'); + if (dates.Length > 2) + { + int year = Convert.ToInt32(dates[0]); + int month = Convert.ToInt32(dates[1]); + int day = Convert.ToInt32(dates[2]); + int single = Convert.ToInt32(num); + MES.OpName_MIS_Manual_Insert(opname, year, month, day, single); + flag = true; + } + if (flag) + { + text = "{\"flag\":\"1\"}"; + } + else + { + text = "{\"flag\":\"0\"}"; + } + return text; + } + catch (Exception err) + { + text = "{\"flag\":\"0\"}"; + //ApplicationLog.WriteLog(err, "MesWebFun01:SavingEngineIDShift"); + return text; + } + } + + private static string RepairStatusInit() + { + string Opname = HttpContext.Current.Request["value"];//工位号 + string selectID = HttpContext.Current.Request["text_selectByID"];//工位号 text_selectByID + string outtext = CreateRepairUpLine(Opname, selectID); + return outtext; + } + + + /// + /// 动态创建返修上线工位按钮 + /// + /// + /// + public static string CreateRepairUpLine(string OpName, string selectID) + { + StringBuilder HtmlStr = new StringBuilder();//可修改字符串 + + string BtnData = ""; + int RouteNum = 0; + bool HaveDataOrNot = false; + DataTable dt; + + string StationDataStr;//最近一条返修工位数据 + //查询返修上线字符串及路径数目 + RepairBtnDataSelect(OpName, out BtnData, out RouteNum); + string[] RepairSta = BtnData.Split('^');//目标工位数组 + string TargetStationData = "";//目标工位数据 + //查询之前的返修上线数据 + HaveDataOrNot = selectRepairStrSelect(OpName, selectID, out dt); + //合成界面显示按钮字符串 + if (HaveDataOrNot) + { + StationDataStr = dt.Rows[0]["返修字符串"].ToString(); + if (StationDataStr == "") + { + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + else + { + TargetStationData = StationDataStr; + } + } + else + { + + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + //页面定义 + HtmlStr.Append("\r\n"); + for (int i = 0; i < RepairSta.Length; i++) + { + //动态生成标签 + //样式定义 + string td_style = "width:20%;height:35px";//td样式 + string btn_style = "width:98%;height:98%;font-family:微软雅黑;font-size:15px;border-color: #99CCFF";//标签样式 + string type = "button"; + string tagID = "Btn_" + RepairSta[i]; + string value = RepairSta[i]; + string onclick = "RepairBtnClick(Btn_" + value + ")"; + string[] StationDataArray = TargetStationData.Split('^'); + string bgColor; + + if (StationDataArray[i] == "1") + { + bgColor = "background-color: green"; + } + else + { + bgColor = "background-color: gray"; + } + //保证每行5个按钮 + if (i < RepairSta.Length - 1) + { + if (i % 5 < 4) + { + HtmlStr.Append(""); + } + else + { + HtmlStr.Append(""); + HtmlStr.Append("\r\n"); + } + } + else + { + HtmlStr.Append(""); + HtmlStr.Append(""); + } + + } + HtmlStr.Append("
"); + //上线路径大于1条则显示上线路径 + if (RouteNum > 1) + { + + } + return HtmlStr.ToString(); + } + + + /// + /// 向数据库写入返修数据 + /// + /// + /// + /// + public static bool updateRepairStatusTo_SQL(string opname, string status) + { + string produceName = "测量数据_返修工位_工位状态_修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", status); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + private static string SaveRepairStatus() + { + + try + { + string RepairStatus = HttpContext.Current.Request["str_value"];//返修工位状态 + string engineID = HttpContext.Current.Request["engineID"];//返修零件总成号 + int RepairMethod = Convert.ToInt32(HttpContext.Current.Request["RepairMethod"]);//返修路径 + string engineType = HttpContext.Current.Request["engineType"];//返修零件总成号 + string RepairOpName = HttpContext.Current.Request["OpName"];//返修上线点 + string[] RepairStatusSplit = RepairStatus.Split('|'); + for (int i = 0; i < RepairStatusSplit.Length - 1; i++) + { + updateRepairStatusTo_SQL(RepairStatusSplit[i].Split('^')[0], RepairStatusSplit[i].Split('^')[1]); + } + + string produceName = "返修上线_返修工位及返修路径_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总成编号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", RepairStatus); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@返修路径", RepairMethod); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@返修上线点", RepairOpName); + string result = Convert.ToString(DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)); + return result; + } + catch (Exception err) + { + return "0"; + } + + } + /// [电子看板_发动机号_线首工位_查询_根据发动机号] 20160728 majian + /// + /// + /// + static public bool GetEngineID_Select(string engineID, string opName, out DataTable dt) + { + string errorMessage = ""; + DataSet ds; + bool isOK; + dt = null; + //string connectionString = ApplicationConfig.ConnectionString; + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_根据发动机号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + dt = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + private string QualityDataButton_bgColor_Select_energineSelect() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //单号 + string energineID = HttpContext.Current.Request["energineID"]; + string opname = HttpContext.Current.Request["value"]; + QualityDataButton_bgColor_Select(opname, energineID, out dt);//此处重新写函数 + if (dt != null) + { + if (dt.Rows.Count >= 0) + { + text = Buttons.Createbuttons(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun02:QualityDataButton_bgColor_Select"); + } + return text; + + } + /// WEB根据工位名称和发动机号查询质量数据合格索引(包括了分线的信息、存储过程中根据工位类型区分) 20140626 wt + /// + /// + /// + /// + /// + public static bool QualityDataButton_bgColor_Select(string opname, string energineID, out DataTable dt) + { + string procedureName = "显示测量数据_工位号_根据发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + /// + /// 获取对应工位的质量数据 + /// + /// + private string QualityDataSelectByEnergineID() + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + string energineID = HttpContext.Current.Request["value"]; + string opname = HttpContext.Current.Request["opname"]; + QualityDataSelect(opname, energineID, out dt); + if (dt != null) + { + //if (dt.Rows.Count > 0) + { + qualitydata = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun10:QualityDataSelect"); + } + return qualitydata; + + } + + static public bool QualityDataSelect(string opname, string energineID, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_根据_工位号_发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 查询返修上线工位及返修路径数目 + /// + /// + /// + /// + public static void RepairBtnDataSelect(string OpName, out string BtnData, out int RouteNum) + { + + DataTable dt; + string procedureName; + BtnData = ""; + RouteNum = 0; + procedureName = "返修上线_返修工位_返修上线点及返修路径_基础配置_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + BtnData = dt.Rows[0]["待返修工位"].ToString(); + RouteNum = Convert.ToInt32(dt.Rows[0]["返修路径数目"]); + } + } + } + + + /// + /// 查询当前上线点上次选择的返修工位,用于界面按钮颜色原始数据 + /// + /// + /// + /// + public static bool selectRepairData(string OpName, out DataTable dt) + { + + string procedureName; + procedureName = "返修上线_返修工位及返修路径_最近数据_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + } + /// + /// + /// + /// + /// + /// + public static bool selectRepairStrSelect(string OpName, string selectID, out DataTable dt) + { + string procedureName; + procedureName = "返修上线_返修工位及返修路径_是否工作判断"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", selectID); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + + } + + } +} diff --git a/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction05.cs b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction05.cs new file mode 100644 index 0000000..c9d972c --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction05.cs @@ -0,0 +1,491 @@ +using DataLinkMesWork; +using bizFacade; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web; +//using SystemFramework; + +namespace MesWebFun +{ + public class WebFunction05 + { + HttpContext contextMesWebFun; + public string ProcessRequest(HttpContext context) + { + contextMesWebFun = context; ; + context.Response.ContentType = "text/plain"; + string type = contextMesWebFun.Request["type"]; + string responseText = ""; + switch (type) + { + //托盘信息 + case "MobySelect": + // responseText = MobySelect(); + break; + //保存手动生成条码 + case "SavingEngineIDShift": + responseText = SavingEngineIDShift(); + break; + case "SaveRepairStatus"://将返修路径及返修数据保存到数据库 + responseText = SaveRepairStatus(); + break; + case "RepairStatusInit"://将返修路径及返修数据保存到数据库 + responseText = RepairStatusInit(); + break; + case "Select_engineType_ByEnergineID": //根据发动机号显示机型 + responseText = Select_engineType_ByEnergineID(); + break; + case "QualityDataButton_bgColor_Select_ByEnergineID": + responseText = QualityDataButton_bgColor_Select_energineSelect(); + break; + ///////////////////////质量查询根据发动机号 + case "QualityDataSelectByEnergineID": + responseText = QualityDataSelectByEnergineID(); + break; + default: + responseText = "05"; + break; + + + } + return responseText; + } + /// + /// //根据发动机号显示机型,界面提示 + /// + /// + private string Select_engineType_ByEnergineID() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + string opName = HttpContext.Current.Request["value"];//发动机号 + string energineID = HttpContext.Current.Request["energineID"];//发动机号 + GetEngineID_Select(energineID, opName, out dt); + + string engineType = ""; + if (dt != null) + { + if (dt.Rows.Count > 0) + { + engineType = dt.Rows[0]["发动机型号"].ToString(); + } + } + text = "{\"engineType\":\"" + engineType + "\"}"; + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun08:Select_engineType_ByEnergineID"); + } + return text; + } + /// + /// 保存手动要求的条码 + /// + /// + private string SavingEngineIDShift() + { + string text = ""; + bool flag = false; + System.Data.DataTable dt = null; + try + { + string opname = HttpContext.Current.Request["value"];//工位号 + string date = HttpContext.Current.Request["date"];//日期 + string num = HttpContext.Current.Request["num"];//流水号 + string[] dates = date.Split('-'); + if (dates.Length > 2) + { + int year = Convert.ToInt32(dates[0]); + int month = Convert.ToInt32(dates[1]); + int day = Convert.ToInt32(dates[2]); + int single = Convert.ToInt32(num); + MES.OpName_MIS_Manual_Insert(opname, year, month, day, single); + flag = true; + } + if (flag) + { + text = "{\"flag\":\"1\"}"; + } + else + { + text = "{\"flag\":\"0\"}"; + } + return text; + } + catch (Exception err) + { + text = "{\"flag\":\"0\"}"; + //ApplicationLog.WriteLog(err, "MesWebFun01:SavingEngineIDShift"); + return text; + } + } + + private static string RepairStatusInit() + { + string Opname = HttpContext.Current.Request["value"];//工位号 + string selectID = HttpContext.Current.Request["text_selectByID"];//工位号 text_selectByID + string outtext = CreateRepairUpLine(Opname, selectID); + return outtext; + } + + + /// + /// 动态创建返修上线工位按钮 + /// + /// + /// + public static string CreateRepairUpLine(string OpName, string selectID) + { + StringBuilder HtmlStr = new StringBuilder();//可修改字符串 + + string BtnData = ""; + int RouteNum = 0; + bool HaveDataOrNot = false; + DataTable dt; + + string StationDataStr;//最近一条返修工位数据 + //查询返修上线字符串及路径数目 + RepairBtnDataSelect(OpName, out BtnData, out RouteNum); + string[] RepairSta = BtnData.Split('^');//目标工位数组 + string TargetStationData = "";//目标工位数据 + //查询之前的返修上线数据 + HaveDataOrNot = selectRepairStrSelect(OpName, selectID, out dt); + //合成界面显示按钮字符串 + if (HaveDataOrNot) + { + StationDataStr = dt.Rows[0]["返修字符串"].ToString(); + if (StationDataStr == "") + { + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + else + { + TargetStationData = StationDataStr; + } + } + else + { + + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + //页面定义 + HtmlStr.Append("\r\n"); + for (int i = 0; i < RepairSta.Length; i++) + { + //动态生成标签 + //样式定义 + string td_style = "width:20%;height:35px";//td样式 + string btn_style = "width:98%;height:98%;font-family:微软雅黑;font-size:15px;border-color: #99CCFF";//标签样式 + string type = "button"; + string tagID = "Btn_" + RepairSta[i]; + string value = RepairSta[i]; + string onclick = "RepairBtnClick(Btn_" + value + ")"; + string[] StationDataArray = TargetStationData.Split('^'); + string bgColor; + + if (StationDataArray[i] == "1") + { + bgColor = "background-color: green"; + } + else + { + bgColor = "background-color: gray"; + } + //保证每行5个按钮 + if (i < RepairSta.Length - 1) + { + if (i % 5 < 4) + { + HtmlStr.Append(""); + } + else + { + HtmlStr.Append(""); + HtmlStr.Append("\r\n"); + } + } + else + { + HtmlStr.Append(""); + HtmlStr.Append(""); + } + + } + HtmlStr.Append("
"); + //上线路径大于1条则显示上线路径 + if (RouteNum > 1) + { + + } + return HtmlStr.ToString(); + } + + + /// + /// 向数据库写入返修数据 + /// + /// + /// + /// + public static bool updateRepairStatusTo_SQL(string opname, string status) + { + string produceName = "测量数据_返修工位_工位状态_修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", status); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + private static string SaveRepairStatus() + { + + try + { + string RepairStatus = HttpContext.Current.Request["str_value"];//返修工位状态 + string engineID = HttpContext.Current.Request["engineID"];//返修零件总成号 + int RepairMethod = Convert.ToInt32(HttpContext.Current.Request["RepairMethod"]);//返修路径 + string engineType = HttpContext.Current.Request["engineType"];//返修零件总成号 + string RepairOpName = HttpContext.Current.Request["OpName"];//返修上线点 + string[] RepairStatusSplit = RepairStatus.Split('|'); + for (int i = 0; i < RepairStatusSplit.Length - 1; i++) + { + updateRepairStatusTo_SQL(RepairStatusSplit[i].Split('^')[0], RepairStatusSplit[i].Split('^')[1]); + } + + string produceName = "返修上线_返修工位及返修路径_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总成编号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", RepairStatus); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@返修路径", RepairMethod); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@返修上线点", RepairOpName); + string result = Convert.ToString(DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)); + return result; + } + catch (Exception err) + { + return "0"; + } + + } + /// [电子看板_发动机号_线首工位_查询_根据发动机号] 20160728 majian + /// + /// + /// + static public bool GetEngineID_Select(string engineID, string opName, out DataTable dt) + { + string errorMessage = ""; + DataSet ds; + bool isOK; + dt = null; + //string connectionString = ApplicationConfig.ConnectionString; + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_根据发动机号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + dt = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + private string QualityDataButton_bgColor_Select_energineSelect() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //单号 + string energineID = HttpContext.Current.Request["energineID"]; + string opname = HttpContext.Current.Request["value"]; + QualityDataButton_bgColor_Select(opname, energineID, out dt);//此处重新写函数 + if (dt != null) + { + if (dt.Rows.Count >= 0) + { + text = Buttons.Createbuttons(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun02:QualityDataButton_bgColor_Select"); + } + return text; + + } + /// WEB根据工位名称和发动机号查询质量数据合格索引(包括了分线的信息、存储过程中根据工位类型区分) 20140626 wt + /// + /// + /// + /// + /// + public static bool QualityDataButton_bgColor_Select(string opname, string energineID, out DataTable dt) + { + string procedureName = "显示测量数据_工位号_根据发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + /// + /// 获取对应工位的质量数据 + /// + /// + private string QualityDataSelectByEnergineID() + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + string energineID = HttpContext.Current.Request["value"]; + string opname = HttpContext.Current.Request["opname"]; + QualityDataSelect(opname, energineID, out dt); + if (dt != null) + { + //if (dt.Rows.Count > 0) + { + qualitydata = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun10:QualityDataSelect"); + } + return qualitydata; + + } + + static public bool QualityDataSelect(string opname, string energineID, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_根据_工位号_发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 查询返修上线工位及返修路径数目 + /// + /// + /// + /// + public static void RepairBtnDataSelect(string OpName, out string BtnData, out int RouteNum) + { + + DataTable dt; + string procedureName; + BtnData = ""; + RouteNum = 0; + procedureName = "返修上线_返修工位_返修上线点及返修路径_基础配置_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + BtnData = dt.Rows[0]["待返修工位"].ToString(); + RouteNum = Convert.ToInt32(dt.Rows[0]["返修路径数目"]); + } + } + } + + + /// + /// 查询当前上线点上次选择的返修工位,用于界面按钮颜色原始数据 + /// + /// + /// + /// + public static bool selectRepairData(string OpName, out DataTable dt) + { + + string procedureName; + procedureName = "返修上线_返修工位及返修路径_最近数据_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + } + /// + /// + /// + /// + /// + /// + public static bool selectRepairStrSelect(string OpName, string selectID, out DataTable dt) + { + string procedureName; + procedureName = "返修上线_返修工位及返修路径_是否工作判断"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", selectID); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + + } + + } +} diff --git a/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction06.cs b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction06.cs new file mode 100644 index 0000000..bff44dc --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction06.cs @@ -0,0 +1,491 @@ +using DataLinkMesWork; +using bizFacade; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web; +//using SystemFramework; + +namespace MesWebFun +{ + public class WebFunction06 + { + HttpContext contextMesWebFun; + public string ProcessRequest(HttpContext context) + { + contextMesWebFun = context; ; + context.Response.ContentType = "text/plain"; + string type = contextMesWebFun.Request["type"]; + string responseText = ""; + switch (type) + { + //托盘信息 + case "MobySelect": + // responseText = MobySelect(); + break; + //保存手动生成条码 + case "SavingEngineIDShift": + responseText = SavingEngineIDShift(); + break; + case "SaveRepairStatus"://将返修路径及返修数据保存到数据库 + responseText = SaveRepairStatus(); + break; + case "RepairStatusInit"://将返修路径及返修数据保存到数据库 + responseText = RepairStatusInit(); + break; + case "Select_engineType_ByEnergineID": //根据发动机号显示机型 + responseText = Select_engineType_ByEnergineID(); + break; + case "QualityDataButton_bgColor_Select_ByEnergineID": + responseText = QualityDataButton_bgColor_Select_energineSelect(); + break; + ///////////////////////质量查询根据发动机号 + case "QualityDataSelectByEnergineID": + responseText = QualityDataSelectByEnergineID(); + break; + default: + responseText = "06"; + break; + + + } + return responseText; + } + /// + /// //根据发动机号显示机型,界面提示 + /// + /// + private string Select_engineType_ByEnergineID() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + string opName = HttpContext.Current.Request["value"];//发动机号 + string energineID = HttpContext.Current.Request["energineID"];//发动机号 + GetEngineID_Select(energineID, opName, out dt); + + string engineType = ""; + if (dt != null) + { + if (dt.Rows.Count > 0) + { + engineType = dt.Rows[0]["发动机型号"].ToString(); + } + } + text = "{\"engineType\":\"" + engineType + "\"}"; + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun08:Select_engineType_ByEnergineID"); + } + return text; + } + /// + /// 保存手动要求的条码 + /// + /// + private string SavingEngineIDShift() + { + string text = ""; + bool flag = false; + System.Data.DataTable dt = null; + try + { + string opname = HttpContext.Current.Request["value"];//工位号 + string date = HttpContext.Current.Request["date"];//日期 + string num = HttpContext.Current.Request["num"];//流水号 + string[] dates = date.Split('-'); + if (dates.Length > 2) + { + int year = Convert.ToInt32(dates[0]); + int month = Convert.ToInt32(dates[1]); + int day = Convert.ToInt32(dates[2]); + int single = Convert.ToInt32(num); + MES.OpName_MIS_Manual_Insert(opname, year, month, day, single); + flag = true; + } + if (flag) + { + text = "{\"flag\":\"1\"}"; + } + else + { + text = "{\"flag\":\"0\"}"; + } + return text; + } + catch (Exception err) + { + text = "{\"flag\":\"0\"}"; + //ApplicationLog.WriteLog(err, "MesWebFun01:SavingEngineIDShift"); + return text; + } + } + + private static string RepairStatusInit() + { + string Opname = HttpContext.Current.Request["value"];//工位号 + string selectID = HttpContext.Current.Request["text_selectByID"];//工位号 text_selectByID + string outtext = CreateRepairUpLine(Opname, selectID); + return outtext; + } + + + /// + /// 动态创建返修上线工位按钮 + /// + /// + /// + public static string CreateRepairUpLine(string OpName, string selectID) + { + StringBuilder HtmlStr = new StringBuilder();//可修改字符串 + + string BtnData = ""; + int RouteNum = 0; + bool HaveDataOrNot = false; + DataTable dt; + + string StationDataStr;//最近一条返修工位数据 + //查询返修上线字符串及路径数目 + RepairBtnDataSelect(OpName, out BtnData, out RouteNum); + string[] RepairSta = BtnData.Split('^');//目标工位数组 + string TargetStationData = "";//目标工位数据 + //查询之前的返修上线数据 + HaveDataOrNot = selectRepairStrSelect(OpName, selectID, out dt); + //合成界面显示按钮字符串 + if (HaveDataOrNot) + { + StationDataStr = dt.Rows[0]["返修字符串"].ToString(); + if (StationDataStr == "") + { + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + else + { + TargetStationData = StationDataStr; + } + } + else + { + + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + //页面定义 + HtmlStr.Append("\r\n"); + for (int i = 0; i < RepairSta.Length; i++) + { + //动态生成标签 + //样式定义 + string td_style = "width:20%;height:35px";//td样式 + string btn_style = "width:98%;height:98%;font-family:微软雅黑;font-size:15px;border-color: #99CCFF";//标签样式 + string type = "button"; + string tagID = "Btn_" + RepairSta[i]; + string value = RepairSta[i]; + string onclick = "RepairBtnClick(Btn_" + value + ")"; + string[] StationDataArray = TargetStationData.Split('^'); + string bgColor; + + if (StationDataArray[i] == "1") + { + bgColor = "background-color: green"; + } + else + { + bgColor = "background-color: gray"; + } + //保证每行5个按钮 + if (i < RepairSta.Length - 1) + { + if (i % 5 < 4) + { + HtmlStr.Append(""); + } + else + { + HtmlStr.Append(""); + HtmlStr.Append("\r\n"); + } + } + else + { + HtmlStr.Append(""); + HtmlStr.Append(""); + } + + } + HtmlStr.Append("
"); + //上线路径大于1条则显示上线路径 + if (RouteNum > 1) + { + + } + return HtmlStr.ToString(); + } + + + /// + /// 向数据库写入返修数据 + /// + /// + /// + /// + public static bool updateRepairStatusTo_SQL(string opname, string status) + { + string produceName = "测量数据_返修工位_工位状态_修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", status); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + private static string SaveRepairStatus() + { + + try + { + string RepairStatus = HttpContext.Current.Request["str_value"];//返修工位状态 + string engineID = HttpContext.Current.Request["engineID"];//返修零件总成号 + int RepairMethod = Convert.ToInt32(HttpContext.Current.Request["RepairMethod"]);//返修路径 + string engineType = HttpContext.Current.Request["engineType"];//返修零件总成号 + string RepairOpName = HttpContext.Current.Request["OpName"];//返修上线点 + string[] RepairStatusSplit = RepairStatus.Split('|'); + for (int i = 0; i < RepairStatusSplit.Length - 1; i++) + { + updateRepairStatusTo_SQL(RepairStatusSplit[i].Split('^')[0], RepairStatusSplit[i].Split('^')[1]); + } + + string produceName = "返修上线_返修工位及返修路径_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总成编号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", RepairStatus); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@返修路径", RepairMethod); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@返修上线点", RepairOpName); + string result = Convert.ToString(DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)); + return result; + } + catch (Exception err) + { + return "0"; + } + + } + /// [电子看板_发动机号_线首工位_查询_根据发动机号] 20160728 majian + /// + /// + /// + static public bool GetEngineID_Select(string engineID, string opName, out DataTable dt) + { + string errorMessage = ""; + DataSet ds; + bool isOK; + dt = null; + //string connectionString = ApplicationConfig.ConnectionString; + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_根据发动机号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + dt = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + private string QualityDataButton_bgColor_Select_energineSelect() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //单号 + string energineID = HttpContext.Current.Request["energineID"]; + string opname = HttpContext.Current.Request["value"]; + QualityDataButton_bgColor_Select(opname, energineID, out dt);//此处重新写函数 + if (dt != null) + { + if (dt.Rows.Count >= 0) + { + text = Buttons.Createbuttons(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun02:QualityDataButton_bgColor_Select"); + } + return text; + + } + /// WEB根据工位名称和发动机号查询质量数据合格索引(包括了分线的信息、存储过程中根据工位类型区分) 20140626 wt + /// + /// + /// + /// + /// + public static bool QualityDataButton_bgColor_Select(string opname, string energineID, out DataTable dt) + { + string procedureName = "显示测量数据_工位号_根据发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + /// + /// 获取对应工位的质量数据 + /// + /// + private string QualityDataSelectByEnergineID() + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + string energineID = HttpContext.Current.Request["value"]; + string opname = HttpContext.Current.Request["opname"]; + QualityDataSelect(opname, energineID, out dt); + if (dt != null) + { + //if (dt.Rows.Count > 0) + { + qualitydata = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun10:QualityDataSelect"); + } + return qualitydata; + + } + + static public bool QualityDataSelect(string opname, string energineID, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_根据_工位号_发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 查询返修上线工位及返修路径数目 + /// + /// + /// + /// + public static void RepairBtnDataSelect(string OpName, out string BtnData, out int RouteNum) + { + + DataTable dt; + string procedureName; + BtnData = ""; + RouteNum = 0; + procedureName = "返修上线_返修工位_返修上线点及返修路径_基础配置_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + BtnData = dt.Rows[0]["待返修工位"].ToString(); + RouteNum = Convert.ToInt32(dt.Rows[0]["返修路径数目"]); + } + } + } + + + /// + /// 查询当前上线点上次选择的返修工位,用于界面按钮颜色原始数据 + /// + /// + /// + /// + public static bool selectRepairData(string OpName, out DataTable dt) + { + + string procedureName; + procedureName = "返修上线_返修工位及返修路径_最近数据_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + } + /// + /// + /// + /// + /// + /// + public static bool selectRepairStrSelect(string OpName, string selectID, out DataTable dt) + { + string procedureName; + procedureName = "返修上线_返修工位及返修路径_是否工作判断"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", selectID); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + + } + + } +} diff --git a/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction07.cs b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction07.cs new file mode 100644 index 0000000..32e5dba --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction07.cs @@ -0,0 +1,417 @@ +using DataLinkMesWork; +using bizFacade; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web; +//using SystemFramework; + +namespace MesWebFun +{ + public class WebFunction07 + { + private HttpContext contextMesWebFun; + + public string ProcessRequest(HttpContext context) + { + contextMesWebFun = context; + context.Response.ContentType = "text/plain"; + string type = contextMesWebFun.Request["type"]; + string responseText = ""; + switch (type) + { + case "SaveRepairStatus"://将返修路径及返修数据保存到数据库 + responseText = SaveRepairStatus(); + break; + + case "RepairStatusInit"://将返修路径及返修数据保存到数据库 + responseText = RepairStatusInit(); + break; + + case "Select_engineType_ByEnergineID": //根据发动机号显示机型 + responseText = Select_engineType_ByEnergineID(); + break; + + case "QualityDataButton_bgColor_Select_ByEnergineID": + responseText = QualityDataButton_bgColor_Select_energineSelect(); + break; + + case "QualityDataSelectByEnergineID": + responseText = QualityDataSelectByEnergineID(); + break; + + default: + responseText = "07"; + break; + } + + return responseText; + } + + private static string RepairStatusInit() + { + string Opname = HttpContext.Current.Request["value"];//工位号 + string outtext = CreateRepairUpLine(Opname); + return outtext; + } + + /// + /// //根据发动机号显示机型,界面提示 + /// + /// + private string Select_engineType_ByEnergineID() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + string opName = HttpContext.Current.Request["value"];//发动机号 + string energineID = HttpContext.Current.Request["energineID"];//发动机号 + GetEngineID_Select(energineID, opName, out dt); + + string engineType = ""; + if (dt != null) + { + if (dt.Rows.Count > 0) + { + engineType = dt.Rows[0]["发动机型号"].ToString(); + } + } + text = "{\"engineType\":\"" + engineType + "\"}"; + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun08:Select_engineType_ByEnergineID"); + } + return text; + } + + /// + /// 查询返修上线工位及返修路径数目 + /// + /// + /// + /// + public static void RepairBtnDataSelect(string OpName, out string BtnData, out int RouteNum) + { + DataTable dt; + string procedureName; + BtnData = ""; + RouteNum = 0; + procedureName = "返修上线_返修工位_返修上线点及返修路径_基础配置_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + BtnData = dt.Rows[0]["待返修工位"].ToString(); + RouteNum = Convert.ToInt32(dt.Rows[0]["返修路径数目"]); + } + } + } + + /// + /// 查询当前上线点上次选择的返修工位,用于界面按钮颜色原始数据 + /// + /// + /// + /// + public static bool selectRepairData(string OpName, out DataTable dt) + { + string procedureName; + procedureName = "返修上线_返修工位及返修路径_最近数据_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + return false; + } + } + + /// + /// 动态创建返修上线工位按钮 + /// + /// + /// + public static string CreateRepairUpLine(string OpName) + { + StringBuilder HtmlStr = new StringBuilder();//可修改字符串 + + string BtnData = ""; + int RouteNum = 0; + bool HaveDataOrNot = false; + DataTable dt; + + string StationDataStr;//最近一条返修工位数据 + string[] StationData;//最近一条返修工位数据数组 + //查询返修上线字符串及路径数目 + RepairBtnDataSelect(OpName, out BtnData, out RouteNum); + string[] RepairSta = BtnData.Split('^');//目标工位数组 + string TargetStationData = "";//目标工位数据 + //查询之前的返修上线数据 + HaveDataOrNot = selectRepairData(OpName, out dt); + + //合成界面显示按钮字符串 + if (HaveDataOrNot) + { + StationDataStr = dt.Rows[0]["返修工位"].ToString(); + StationData = StationDataStr.Split('|'); + + for (int i = 0; i < RepairSta.Length; i++) + { + string TargetOpName = RepairSta[i];//目标工位号 + + for (int j = 0; j < StationData.Length; j++) + { + string[] OpNameDate; + OpNameDate = StationData[j].Split('^'); + if (TargetOpName == OpNameDate[0]) + { + if (j < (StationData.Length - 1)) + { + TargetStationData = TargetStationData + OpNameDate[1] + "^"; + break; + } + else + { + TargetStationData = TargetStationData + OpNameDate[1]; + break; + } + } + } + } + } + else + { + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + + //页面定义 + HtmlStr.Append("\r\n"); + for (int i = 0; i < RepairSta.Length; i++) + { + //动态生成标签 + //样式定义 + string td_style = "width:20%;height:35px";//td样式 + string btn_style = "width:98%;height:98%;font-family:微软雅黑;font-size:15px;border-color: #99CCFF";//标签样式 + string type = "button"; + string tagID = "Btn_" + RepairSta[i]; + string value = RepairSta[i]; + string onclick = "RepairBtnClick(Btn_" + value + ")"; + string[] StationDataArray = TargetStationData.Split('^'); + string bgColor; + + if (StationDataArray[i] == "1") + { + bgColor = "background-color: green"; + } + else + { + bgColor = "background-color: gray"; + } + //保证每行5个按钮 + if (i < RepairSta.Length - 1) + { + if (i % 5 < 4) + { + HtmlStr.Append(""); + } + else + { + HtmlStr.Append(""); + HtmlStr.Append("\r\n"); + } + } + else + { + HtmlStr.Append(""); + HtmlStr.Append(""); + } + } + HtmlStr.Append("
"); + //上线路径大于1条则显示上线路径 + if (RouteNum > 1) + { + } + + return HtmlStr.ToString(); + } + + /// + /// 向数据库写入返修数据 + /// + /// + /// + /// + public static bool updateRepairStatusTo_SQL(string opname, string status) + { + string produceName = "测量数据_返修工位_工位状态_修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", status); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + private static string SaveRepairStatus() + { + try + { + string RepairStatus = HttpContext.Current.Request["str_value"];//返修工位状态 + string engineID = HttpContext.Current.Request["engineID"];//返修零件总成号 + int RepairMethod = Convert.ToInt32(HttpContext.Current.Request["RepairMethod"]);//返修路径 + string engineType = HttpContext.Current.Request["engineType"];//返修零件总成号 + string RepairOpName = HttpContext.Current.Request["OpName"];//返修上线点 + string[] RepairStatusSplit = RepairStatus.Split('|'); + for (int i = 0; i < RepairStatusSplit.Length - 1; i++) + { + updateRepairStatusTo_SQL(RepairStatusSplit[i].Split('^')[0], RepairStatusSplit[i].Split('^')[1]); + } + + string produceName = "返修上线_返修工位及返修路径_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总成编号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", RepairStatus); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@返修路径", RepairMethod); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@返修上线点", RepairOpName); + string result = Convert.ToString(DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)); + return result; + } + catch (Exception err) + { + return "0"; + } + }/// + + /// [电子看板_发动机号_线首工位_查询_根据发动机号] 20160728 majian + /// + /// + /// + static public bool GetEngineID_Select(string engineID, string opName, out DataTable dt) + { + string errorMessage = ""; + DataSet ds; + bool isOK; + dt = null; + //string connectionString = ApplicationConfig.ConnectionString; + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_根据发动机号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + dt = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + + private string QualityDataButton_bgColor_Select_energineSelect() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //单号 + string energineID = HttpContext.Current.Request["energineID"]; + string opname = HttpContext.Current.Request["value"]; + QualityDataButton_bgColor_Select(opname, energineID, out dt);//此处重新写函数 + if (dt != null) + { + if (dt.Rows.Count >= 0) + { + text = Buttons.Createbuttons(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun07:QualityDataButton_bgColor_Select"); + } + return text; + } + + /// WEB根据工位名称和发动机号查询质量数据合格索引(包括了分线的信息、存储过程中根据工位类型区分) 20140626 wt + /// + /// + /// + /// + /// + public static bool QualityDataButton_bgColor_Select(string opname, string energineID, out DataTable dt) + { + string procedureName = "显示测量数据_工位号_根据发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + static public bool QualityDataSelect(string opname, string energineID, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_根据_工位号_发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + private string QualityDataSelectByEnergineID() + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + string energineID = HttpContext.Current.Request["value"]; + string opname = HttpContext.Current.Request["opname"]; + QualityDataSelect(opname, energineID, out dt); + if (dt != null) + { + //if (dt.Rows.Count > 0) + { + qualitydata = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun10:QualityDataSelect"); + } + return qualitydata; + } + } +} \ No newline at end of file diff --git a/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction08.cs b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction08.cs new file mode 100644 index 0000000..d0ed6c2 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction08.cs @@ -0,0 +1,695 @@ +using DataLinkMesWork; +using bizFacade; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web; +//using SystemFramework; + +namespace MesWebFun +{ + public class WebFunction08 + { + HttpContext contextMesWebFun; + public string ProcessRequest(HttpContext context) + { + contextMesWebFun = context; ; + context.Response.ContentType = "text/plain"; + string type = contextMesWebFun.Request["type"]; + string responseText = ""; + switch (type) + { + + case "SelectSublineStatus": + responseText = SelectSublineStatus(); + break; + + case "SelectAssemblylineStatus": + responseText = SelectAssemblylineStatus(); + break; + + case "QueueListDataSelect": + responseText = QueueListDataSelect(); + break; + case "MatchingListDataSelect": + responseText = MatchingListDataSelect(); + break; + //保存手动生成条码 + case "SavingEngineIDShift": + responseText = SavingEngineIDShift(); + break; + case "SaveRepairStatus"://将返修路径及返修数据保存到数据库 + responseText = SaveRepairStatus(); + break; + case "RepairStatusInit"://将返修路径及返修数据保存到数据库 + responseText = RepairStatusInit(); + break; + case "Select_engineType_ByEnergineID": //根据发动机号显示机型 + responseText = Select_engineType_ByEnergineID(); + break; + case "QualityDataButton_bgColor_Select_ByEnergineID": + responseText = QualityDataButton_bgColor_Select_energineSelect(); + break; + ///////////////////////质量查询根据发动机号 + case "QualityDataSelectByEnergineID": + responseText = QualityDataSelectByEnergineID(); + break; + default: + responseText = "08"; + break; + } + return responseText; + } + /// + /// //根据发动机号显示机型,界面提示 + /// + /// + private string Select_engineType_ByEnergineID() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + string opName = HttpContext.Current.Request["value"];//发动机号 + string energineID = HttpContext.Current.Request["energineID"];//发动机号 + GetEngineID_Select(energineID, opName, out dt); + + string engineType = ""; + if (dt != null) + { + if (dt.Rows.Count > 0) + { + engineType = dt.Rows[0]["发动机型号"].ToString(); + } + } + text = "{\"engineType\":\"" + engineType + "\"}"; + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun08:Select_engineType_ByEnergineID"); + } + return text; + } + /// + /// 保存手动要求的条码 + /// + /// + private string SavingEngineIDShift() + { + string text = ""; + bool flag = false; + System.Data.DataTable dt = null; + try + { + string opname = HttpContext.Current.Request["value"];//工位号 + string date = HttpContext.Current.Request["date"];//日期 + string num = HttpContext.Current.Request["num"];//流水号 + string[] dates = date.Split('-'); + if (dates.Length > 2) + { + int year = Convert.ToInt32(dates[0]); + int month = Convert.ToInt32(dates[1]); + int day = Convert.ToInt32(dates[2]); + int single = Convert.ToInt32(num); + MES.OpName_MIS_Manual_Insert(opname, year, month, day, single); + flag = true; + } + if (flag) + { + text = "{\"flag\":\"1\"}"; + } + else + { + text = "{\"flag\":\"0\"}"; + } + return text; + } + catch (Exception err) + { + text = "{\"flag\":\"0\"}"; + //ApplicationLog.WriteLog(err, "MesWebFun01:SavingEngineIDShift"); + return text; + } + } + + private static string RepairStatusInit() + { + string Opname = HttpContext.Current.Request["value"];//工位号 + string selectID = HttpContext.Current.Request["text_selectByID"];//工位号 text_selectByID + string outtext = CreateRepairUpLine(Opname, selectID); + return outtext; + } + + + /// + /// 动态创建返修上线工位按钮 + /// + /// + /// + public static string CreateRepairUpLine(string OpName, string selectID) + { + StringBuilder HtmlStr = new StringBuilder();//可修改字符串 + + string BtnData = ""; + int RouteNum = 0; + bool HaveDataOrNot = false; + DataTable dt; + + string StationDataStr;//最近一条返修工位数据 + //查询返修上线字符串及路径数目 + RepairBtnDataSelect(OpName, out BtnData, out RouteNum); + string[] RepairSta = BtnData.Split('^');//目标工位数组 + string TargetStationData = "";//目标工位数据 + //查询之前的返修上线数据 + HaveDataOrNot = selectRepairStrSelect(OpName, selectID, out dt); + //合成界面显示按钮字符串 + if (HaveDataOrNot) + { + StationDataStr = dt.Rows[0]["返修字符串"].ToString(); + if (StationDataStr == "") + { + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + else + { + TargetStationData = StationDataStr; + } + } + else + { + + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + //页面定义 + HtmlStr.Append("\r\n"); + for (int i = 0; i < RepairSta.Length; i++) + { + //动态生成标签 + //样式定义 + string td_style = "width:20%;height:35px";//td样式 + string btn_style = "width:98%;height:98%;font-family:微软雅黑;font-size:15px;border-color: #99CCFF";//标签样式 + string type = "button"; + string tagID = "Btn_" + RepairSta[i]; + string value = RepairSta[i]; + string onclick = "RepairBtnClick(Btn_" + value + ")"; + string[] StationDataArray = TargetStationData.Split('^'); + string bgColor; + + if (StationDataArray[i] == "1") + { + bgColor = "background-color: green"; + } + else + { + bgColor = "background-color: gray"; + } + //保证每行5个按钮 + if (i < RepairSta.Length - 1) + { + if (i % 5 < 4) + { + HtmlStr.Append(""); + } + else + { + HtmlStr.Append(""); + HtmlStr.Append("\r\n"); + } + } + else + { + HtmlStr.Append(""); + HtmlStr.Append(""); + } + + } + HtmlStr.Append("
"); + //上线路径大于1条则显示上线路径 + if (RouteNum > 1) + { + + } + return HtmlStr.ToString(); + } + + + /// + /// 向数据库写入返修数据 + /// + /// + /// + /// + public static bool updateRepairStatusTo_SQL(string opname, string status) + { + string produceName = "测量数据_返修工位_工位状态_修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", status); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + private static string SaveRepairStatus() + { + + try + { + string RepairStatus = HttpContext.Current.Request["str_value"];//返修工位状态 + string engineID = HttpContext.Current.Request["engineID"];//返修零件总成号 + int RepairMethod = Convert.ToInt32(HttpContext.Current.Request["RepairMethod"]);//返修路径 + string engineType = HttpContext.Current.Request["engineType"];//返修零件总成号 + string RepairOpName = HttpContext.Current.Request["OpName"];//返修上线点 + string[] RepairStatusSplit = RepairStatus.Split('|'); + for (int i = 0; i < RepairStatusSplit.Length - 1; i++) + { + updateRepairStatusTo_SQL(RepairStatusSplit[i].Split('^')[0], RepairStatusSplit[i].Split('^')[1]); + } + + string produceName = "返修上线_返修工位及返修路径_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总成编号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", RepairStatus); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@返修路径", RepairMethod); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@返修上线点", RepairOpName); + string result = Convert.ToString(DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)); + return result; + } + catch (Exception err) + { + return "0"; + } + + } + /// [电子看板_发动机号_线首工位_查询_根据发动机号] 20160728 majian + /// + /// + /// + static public bool GetEngineID_Select(string engineID, string opName, out DataTable dt) + { + string errorMessage = ""; + DataSet ds; + bool isOK; + dt = null; + //string connectionString = ApplicationConfig.ConnectionString; + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_根据发动机号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + dt = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + private string QualityDataButton_bgColor_Select_energineSelect() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //单号 + string energineID = HttpContext.Current.Request["energineID"]; + string opname = HttpContext.Current.Request["value"]; + QualityDataButton_bgColor_Select(opname, energineID, out dt);//此处重新写函数 + if (dt != null) + { + if (dt.Rows.Count >= 0) + { + text = Buttons.Createbuttons(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun02:QualityDataButton_bgColor_Select"); + } + return text; + + } + /// WEB根据工位名称和发动机号查询质量数据合格索引(包括了分线的信息、存储过程中根据工位类型区分) 20140626 wt + /// + /// + /// + /// + /// + public static bool QualityDataButton_bgColor_Select(string opname, string energineID, out DataTable dt) + { + string procedureName = "显示测量数据_工位号_根据发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + /// + /// 获取对应工位的质量数据 + /// + /// + private string QualityDataSelectByEnergineID() + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + string energineID = HttpContext.Current.Request["value"]; + string opname = HttpContext.Current.Request["opname"]; + QualityDataSelect(opname, energineID, out dt); + if (dt != null) + { + //if (dt.Rows.Count > 0) + { + qualitydata = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun10:QualityDataSelect"); + } + return qualitydata; + + } + + static public bool QualityDataSelect(string opname, string energineID, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_根据_工位号_发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 查询返修上线工位及返修路径数目 + /// + /// + /// + /// + public static void RepairBtnDataSelect(string OpName, out string BtnData, out int RouteNum) + { + + DataTable dt; + string procedureName; + BtnData = ""; + RouteNum = 0; + procedureName = "返修上线_返修工位_返修上线点及返修路径_基础配置_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + BtnData = dt.Rows[0]["待返修工位"].ToString(); + RouteNum = Convert.ToInt32(dt.Rows[0]["返修路径数目"]); + } + } + } + + + /// + /// 查询当前上线点上次选择的返修工位,用于界面按钮颜色原始数据 + /// + /// + /// + /// + public static bool selectRepairData(string OpName, out DataTable dt) + { + + string procedureName; + procedureName = "返修上线_返修工位及返修路径_最近数据_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + } + /// + /// + /// + /// + /// + /// + public static bool selectRepairStrSelect(string OpName, string selectID, out DataTable dt) + { + string procedureName; + procedureName = "返修上线_返修工位及返修路径_是否工作判断"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", selectID); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + + } + /// + /// 根据总线机型查询轴系线托盘号、发动机型号 + /// + /// + /// + /// + private void SelectSublineEngineIDAndPalletnum(string EngineID, out string EngineID_Subline, out int PalletNumSubline) + { + EngineID_Subline = ""; + PalletNumSubline = 0; + + string produceName; + produceName = "分线上总线_分线托盘号总成编号_根据总线总成编号_查询"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总装线总成编号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@轴系线总成编号", SqlDbType.NVarChar, 50, "轴系线总成编号"); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@轴系线托盘号", SqlDbType.Int, 4, "轴系线托盘号"); + thisParms[2].Direction = ParameterDirection.Output; + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + if (thisParms[1].Value != null && thisParms[2].Value != null) + { + EngineID_Subline = thisParms[1].Value.ToString(); + PalletNumSubline = Convert.ToInt32(thisParms[2].Value); + } + } + + private string SelectSublineStatus() + { + + + string data = ""; + try + { + string EngineID_Subline = ""; + int PalletNumSubline = 0; + string EngineID = contextMesWebFun.Request["EngineID"]; + + SelectSublineEngineIDAndPalletnum(EngineID, out EngineID_Subline, out PalletNumSubline); + data = EngineID_Subline + "&" + PalletNumSubline; + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "SelectSublineStatus"); + } + return data; + + } + + /// + /// ///////////////////////////////////////////////////////////////////////////////////////////////////// + /// + + /// + /// 根据轴系线机型查询总装线托盘号、发动机型号 + /// + /// + /// + /// + private void SelectAssemblylineEngineIDAndPalletnum(string EngineID, out string EngineID_Assemblyline, out int PalletNumAssemblyline) + { + EngineID_Assemblyline = ""; + PalletNumAssemblyline = 0; + + string produceName; + produceName = "分线上总线_总装线托盘号总成编号_根据轴系线总成编号_查询"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@轴系线总成编号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@总装线总成编号", SqlDbType.NVarChar, 50, "总装线总成编号"); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@总装线托盘号", PalletNumAssemblyline); + thisParms[2].Direction = ParameterDirection.Output; + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + EngineID_Assemblyline = thisParms[1].Value.ToString(); + PalletNumAssemblyline = Convert.ToInt32(thisParms[2].Value); + + } + + private string SelectAssemblylineStatus() + { + + + string data = ""; + try + { + string EngineID_Assemblyline = ""; + int PalletNumAssemblyline = 0; + string EngineID = contextMesWebFun.Request["EngineID"]; + + SelectAssemblylineEngineIDAndPalletnum(EngineID, out EngineID_Assemblyline, out PalletNumAssemblyline); + data = EngineID_Assemblyline + "&" + PalletNumAssemblyline; + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "SelectSublineStatus"); + } + return data; + + } + + /// + /// 获取排队列表数据 + /// + /// + private string QueueListDataSelect() + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + QueueListSelect(out dt); + if (dt != null) + { + + + qualitydata = JsonHelper.CreateJsonParameters(dt); + + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun12:QueueListDataSelect"); + } + return qualitydata; + + } + + + + + /// + /// 输出轴轴承外圈排队列表_查询 + /// + /// + /// + /// + /// + static public bool QueueListSelect(out DataTable dt) + { + string procedureName; + procedureName = "轴承外圈轴系追踪号排队_查询全部"; + SqlParameter[] sqlParameters = new SqlParameter[0]; + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + + + + + /// + /// 获取匹配列表数据 + /// + /// + private string MatchingListDataSelect() + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + MatchingListSelect(out dt); + if (dt != null) + { + + + qualitydata = JsonHelper.CreateJsonParameters(dt); + + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun12:MatchingListDataSelect"); + } + return qualitydata; + + } + + /// + /// 输出轴轴承外圈匹配列表_查询 + /// + /// + /// + /// + /// + static public bool MatchingListSelect(out DataTable dt) + { + string procedureName; + procedureName = "轴承外圈轴系总成号与总线总成号匹配列表_查询全部"; + SqlParameter[] sqlParameters = new SqlParameter[0]; + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + + + + } +} diff --git a/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction10.cs b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction10.cs new file mode 100644 index 0000000..a763633 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction10.cs @@ -0,0 +1,482 @@ +using DataLinkMesWork; +using bizFacade; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Web; +//using SystemFramework; + +namespace MesWebFun +{ + public class WebFunction10 + { + + HttpContext contextMesWebFun; + public string ProcessRequest(HttpContext context) + { + contextMesWebFun = context; ; + context.Response.ContentType = "text/plain"; + string type = contextMesWebFun.Request["type"]; + string responseText = ""; + switch (type) + { + //保存手动生成条码 + case "SavingEngineIDShift": + responseText = SavingEngineIDShift(); + break; + case "SaveRepairStatus"://将返修路径及返修数据保存到数据库 + responseText = SaveRepairStatus(); + break; + case "RepairStatusInit"://将返修路径及返修数据保存到数据库 + responseText = RepairStatusInit(); + break; + case "Select_engineType_ByEnergineID": //根据发动机号显示机型 + responseText = Select_engineType_ByEnergineID(); + break; + case "QualityDataButton_bgColor_Select_ByEnergineID": + responseText = QualityDataButton_bgColor_Select_energineSelect(); + break; + ///////////////////////质量查询根据发动机号 + case "QualityDataSelectByEnergineID": + responseText = QualityDataSelectByEnergineID(); + break; + default: + responseText = "10"; + break; + } + return responseText; + } + + /// + /// 保存手动要求的条码 + /// + /// + private string SavingEngineIDShift() + { + string text = ""; + bool flag = false; + System.Data.DataTable dt = null; + try + { + string opname = HttpContext.Current.Request["value"];//工位号 + string date = HttpContext.Current.Request["date"];//日期 + string num = HttpContext.Current.Request["num"];//流水号 + string[] dates = date.Split('-'); + if (dates.Length > 2) + { + int year = Convert.ToInt32(dates[0]); + int month = Convert.ToInt32(dates[1]); + int day = Convert.ToInt32(dates[2]); + int single = Convert.ToInt32(num); + MES.OpName_MIS_Manual_Insert(opname, year, month, day, single); + flag = true; + } + if (flag) + { + text = "{\"flag\":\"1\"}"; + } + else + { + text = "{\"flag\":\"0\"}"; + } + return text; + } + catch (Exception err) + { + text = "{\"flag\":\"0\"}"; + //ApplicationLog.WriteLog(err, "MesWebFun10:SavingEngineIDShift"); + return text; + } + } + + + + private static string RepairStatusInit() + { + string Opname = HttpContext.Current.Request["value"];//工位号 + string outtext = CreateRepairUpLine(Opname); + return outtext; + } + + /// + /// //根据发动机号显示机型,界面提示 + /// + /// + private string Select_engineType_ByEnergineID() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + string opName = HttpContext.Current.Request["value"];//发动机号 + string energineID = HttpContext.Current.Request["energineID"];//发动机号 + GetEngineID_Select(energineID, opName, out dt); + + string engineType = ""; + if (dt != null) + { + if (dt.Rows.Count > 0) + { + engineType = dt.Rows[0]["发动机型号"].ToString(); + } + } + text = "{\"engineType\":\"" + engineType + "\"}"; + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun08:Select_engineType_ByEnergineID"); + } + return text; + } + + + /// + /// 查询返修上线工位及返修路径数目 + /// + /// + /// + /// + public static void RepairBtnDataSelect(string OpName, out string BtnData, out int RouteNum) + { + + DataTable dt; + string procedureName; + BtnData = ""; + RouteNum = 0; + procedureName = "返修上线_返修工位_返修上线点及返修路径_基础配置_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + BtnData = dt.Rows[0]["待返修工位"].ToString(); + RouteNum = Convert.ToInt32(dt.Rows[0]["返修路径数目"]); + } + } + } + + + /// + /// 查询当前上线点上次选择的返修工位,用于界面按钮颜色原始数据 + /// + /// + /// + /// + public static bool selectRepairData(string OpName, out DataTable dt) + { + + string procedureName; + procedureName = "返修上线_返修工位及返修路径_最近数据_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + + } + /// + /// 动态创建返修上线工位按钮 + /// + /// + /// + public static string CreateRepairUpLine(string OpName) + { + StringBuilder HtmlStr = new StringBuilder();//可修改字符串 + + string BtnData = ""; + int RouteNum = 0; + bool HaveDataOrNot = false; + DataTable dt; + + string StationDataStr;//最近一条返修工位数据 + string[] StationData;//最近一条返修工位数据数组 + //查询返修上线字符串及路径数目 + RepairBtnDataSelect(OpName, out BtnData, out RouteNum); + string[] RepairSta = BtnData.Split('^');//目标工位数组 + string TargetStationData = "";//目标工位数据 + //查询之前的返修上线数据 + HaveDataOrNot = selectRepairData(OpName, out dt); + + //合成界面显示按钮字符串 + if (HaveDataOrNot) + { + StationDataStr = dt.Rows[0]["返修工位"].ToString(); + StationData = StationDataStr.Split('|'); + + for (int i = 0; i < RepairSta.Length; i++) + { + string TargetOpName = RepairSta[i];//目标工位号 + + for (int j = 0; j < StationData.Length; j++) + { + string[] OpNameDate; + OpNameDate = StationData[j].Split('^'); + if (TargetOpName == OpNameDate[0]) + { + if (j < (StationData.Length - 1)) + { + TargetStationData = TargetStationData + OpNameDate[1] + "^"; + break; + } + else + { + TargetStationData = TargetStationData + OpNameDate[1]; + break; + } + } + + } + + } + + } + else + { + + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + + } + } + } + + + + //页面定义 + HtmlStr.Append("\r\n"); + for (int i = 0; i < RepairSta.Length; i++) + { + //动态生成标签 + //样式定义 + string td_style = "width:20%;height:35px";//td样式 + string btn_style = "width:98%;height:98%;font-family:微软雅黑;font-size:15px;border-color: #99CCFF";//标签样式 + string type = "button"; + string tagID = "Btn_" + RepairSta[i]; + string value = RepairSta[i]; + string onclick = "RepairBtnClick(Btn_" + value + ")"; + string[] StationDataArray = TargetStationData.Split('^'); + string bgColor; + + if (StationDataArray[i] == "1") + { + bgColor = "background-color: green"; + } + else + { + bgColor = "background-color: gray"; + } + //保证每行5个按钮 + if (i < RepairSta.Length - 1) + { + if (i % 5 < 4) + { + HtmlStr.Append(""); + } + else + { + HtmlStr.Append(""); + HtmlStr.Append("\r\n"); + } + } + else + { + HtmlStr.Append(""); + HtmlStr.Append(""); + } + + } + HtmlStr.Append("
"); + //上线路径大于1条则显示上线路径 + if (RouteNum > 1) + { + + + + } + + + + return HtmlStr.ToString(); + } + + /// + /// 向数据库写入返修数据 + /// + /// + /// + /// + public static bool updateRepairStatusTo_SQL(string opname, string status) + { + string produceName = "测量数据_返修工位_工位状态_修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", status); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + private static string SaveRepairStatus() + { + + try + { + string RepairStatus = HttpContext.Current.Request["str_value"];//返修工位状态 + string engineID = HttpContext.Current.Request["engineID"];//返修零件总成号 + int RepairMethod = Convert.ToInt32(HttpContext.Current.Request["RepairMethod"]);//返修路径 + string engineType = HttpContext.Current.Request["engineType"];//返修零件总成号 + string RepairOpName = HttpContext.Current.Request["OpName"];//返修上线点 + string[] RepairStatusSplit = RepairStatus.Split('|'); + for (int i = 0; i < RepairStatusSplit.Length - 1; i++) + { + updateRepairStatusTo_SQL(RepairStatusSplit[i].Split('^')[0], RepairStatusSplit[i].Split('^')[1]); + } + + string produceName = "返修上线_返修工位及返修路径_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总成编号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", RepairStatus); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@返修路径", RepairMethod); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@返修上线点", RepairOpName); + string result = Convert.ToString(DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)); + return result; + } + catch (Exception err) + { + return "0"; + } + + }/// + /// [电子看板_发动机号_线首工位_查询_根据发动机号] 20160728 majian + /// + /// + /// + static public bool GetEngineID_Select(string engineID, string opName, out DataTable dt) + { + string errorMessage = ""; + DataSet ds; + bool isOK; + dt = null; + //string connectionString = ApplicationConfig.ConnectionString; + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_根据发动机号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + dt = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + private string QualityDataButton_bgColor_Select_energineSelect() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //单号 + string energineID = HttpContext.Current.Request["energineID"]; + string opname = HttpContext.Current.Request["value"]; + QualityDataButton_bgColor_Select(opname, energineID, out dt);//此处重新写函数 + if (dt != null) + { + if (dt.Rows.Count >= 0) + { + text = Buttons.Createbuttons(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun02:QualityDataButton_bgColor_Select"); + } + return text; + + } + /// WEB根据工位名称和发动机号查询质量数据合格索引(包括了分线的信息、存储过程中根据工位类型区分) 20140626 wt + /// + /// + /// + /// + /// + public static bool QualityDataButton_bgColor_Select(string opname, string energineID, out DataTable dt) + { + string procedureName = "显示测量数据_工位号_根据发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + /// + /// 获取对应工位的质量数据 + /// + /// + private string QualityDataSelectByEnergineID() + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + string energineID = HttpContext.Current.Request["value"]; + string opname = HttpContext.Current.Request["opname"]; + QualityDataSelect(opname, energineID, out dt); + if (dt != null) + { + //if (dt.Rows.Count > 0) + { + qualitydata = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun10:QualityDataSelect"); + } + return qualitydata; + + } + + static public bool QualityDataSelect(string opname, string energineID, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_根据_工位号_发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + } +} diff --git a/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction11.cs b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction11.cs new file mode 100644 index 0000000..1899d94 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction11.cs @@ -0,0 +1,491 @@ +using DataLinkMesWork; +using bizFacade; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web; +//using SystemFramework; + +namespace MesWebFun +{ + public class WebFunction11 + { + HttpContext contextMesWebFun; + public string ProcessRequest(HttpContext context) + { + contextMesWebFun = context; ; + context.Response.ContentType = "text/plain"; + string type = contextMesWebFun.Request["type"]; + string responseText = ""; + switch (type) + { + //托盘信息 + case "MobySelect": + // responseText = MobySelect(); + break; + //保存手动生成条码 + case "SavingEngineIDShift": + responseText = SavingEngineIDShift(); + break; + case "SaveRepairStatus"://将返修路径及返修数据保存到数据库 + responseText = SaveRepairStatus(); + break; + case "RepairStatusInit"://将返修路径及返修数据保存到数据库 + responseText = RepairStatusInit(); + break; + case "Select_engineType_ByEnergineID": //根据发动机号显示机型 + responseText = Select_engineType_ByEnergineID(); + break; + case "QualityDataButton_bgColor_Select_ByEnergineID": + responseText = QualityDataButton_bgColor_Select_energineSelect(); + break; + ///////////////////////质量查询根据发动机号 + case "QualityDataSelectByEnergineID": + responseText = QualityDataSelectByEnergineID(); + break; + default: + responseText = "05"; + break; + + + } + return responseText; + } + /// + /// //根据发动机号显示机型,界面提示 + /// + /// + private string Select_engineType_ByEnergineID() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + string opName = HttpContext.Current.Request["value"];//发动机号 + string energineID = HttpContext.Current.Request["energineID"];//发动机号 + GetEngineID_Select(energineID, opName, out dt); + + string engineType = ""; + if (dt != null) + { + if (dt.Rows.Count > 0) + { + engineType = dt.Rows[0]["发动机型号"].ToString(); + } + } + text = "{\"engineType\":\"" + engineType + "\"}"; + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun08:Select_engineType_ByEnergineID"); + } + return text; + } + /// + /// 保存手动要求的条码 + /// + /// + private string SavingEngineIDShift() + { + string text = ""; + bool flag = false; + System.Data.DataTable dt = null; + try + { + string opname = HttpContext.Current.Request["value"];//工位号 + string date = HttpContext.Current.Request["date"];//日期 + string num = HttpContext.Current.Request["num"];//流水号 + string[] dates = date.Split('-'); + if (dates.Length > 2) + { + int year = Convert.ToInt32(dates[0]); + int month = Convert.ToInt32(dates[1]); + int day = Convert.ToInt32(dates[2]); + int single = Convert.ToInt32(num); + MES.OpName_MIS_Manual_Insert(opname, year, month, day, single); + flag = true; + } + if (flag) + { + text = "{\"flag\":\"1\"}"; + } + else + { + text = "{\"flag\":\"0\"}"; + } + return text; + } + catch (Exception err) + { + text = "{\"flag\":\"0\"}"; + //ApplicationLog.WriteLog(err, "MesWebFun01:SavingEngineIDShift"); + return text; + } + } + + private static string RepairStatusInit() + { + string Opname = HttpContext.Current.Request["value"];//工位号 + string selectID = HttpContext.Current.Request["text_selectByID"];//工位号 text_selectByID + string outtext = CreateRepairUpLine(Opname, selectID); + return outtext; + } + + + /// + /// 动态创建返修上线工位按钮 + /// + /// + /// + public static string CreateRepairUpLine(string OpName, string selectID) + { + StringBuilder HtmlStr = new StringBuilder();//可修改字符串 + + string BtnData = ""; + int RouteNum = 0; + bool HaveDataOrNot = false; + DataTable dt; + + string StationDataStr;//最近一条返修工位数据 + //查询返修上线字符串及路径数目 + RepairBtnDataSelect(OpName, out BtnData, out RouteNum); + string[] RepairSta = BtnData.Split('^');//目标工位数组 + string TargetStationData = "";//目标工位数据 + //查询之前的返修上线数据 + HaveDataOrNot = selectRepairStrSelect(OpName, selectID, out dt); + //合成界面显示按钮字符串 + if (HaveDataOrNot) + { + StationDataStr = dt.Rows[0]["返修字符串"].ToString(); + if (StationDataStr == "") + { + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + else + { + TargetStationData = StationDataStr; + } + } + else + { + + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + //页面定义 + HtmlStr.Append("\r\n"); + for (int i = 0; i < RepairSta.Length; i++) + { + //动态生成标签 + //样式定义 + string td_style = "width:20%;height:35px";//td样式 + string btn_style = "width:98%;height:98%;font-family:微软雅黑;font-size:15px;border-color: #99CCFF";//标签样式 + string type = "button"; + string tagID = "Btn_" + RepairSta[i]; + string value = RepairSta[i]; + string onclick = "RepairBtnClick(Btn_" + value + ")"; + string[] StationDataArray = TargetStationData.Split('^'); + string bgColor; + + if (StationDataArray[i] == "1") + { + bgColor = "background-color: green"; + } + else + { + bgColor = "background-color: gray"; + } + //保证每行5个按钮 + if (i < RepairSta.Length - 1) + { + if (i % 5 < 4) + { + HtmlStr.Append(""); + } + else + { + HtmlStr.Append(""); + HtmlStr.Append("\r\n"); + } + } + else + { + HtmlStr.Append(""); + HtmlStr.Append(""); + } + + } + HtmlStr.Append("
"); + //上线路径大于1条则显示上线路径 + if (RouteNum > 1) + { + + } + return HtmlStr.ToString(); + } + + + /// + /// 向数据库写入返修数据 + /// + /// + /// + /// + public static bool updateRepairStatusTo_SQL(string opname, string status) + { + string produceName = "测量数据_返修工位_工位状态_修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", status); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + private static string SaveRepairStatus() + { + + try + { + string RepairStatus = HttpContext.Current.Request["str_value"];//返修工位状态 + string engineID = HttpContext.Current.Request["engineID"];//返修零件总成号 + int RepairMethod = Convert.ToInt32(HttpContext.Current.Request["RepairMethod"]);//返修路径 + string engineType = HttpContext.Current.Request["engineType"];//返修零件总成号 + string RepairOpName = HttpContext.Current.Request["OpName"];//返修上线点 + string[] RepairStatusSplit = RepairStatus.Split('|'); + for (int i = 0; i < RepairStatusSplit.Length - 1; i++) + { + updateRepairStatusTo_SQL(RepairStatusSplit[i].Split('^')[0], RepairStatusSplit[i].Split('^')[1]); + } + + string produceName = "返修上线_返修工位及返修路径_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总成编号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", RepairStatus); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@返修路径", RepairMethod); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@返修上线点", RepairOpName); + string result = Convert.ToString(DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)); + return result; + } + catch (Exception err) + { + return "0"; + } + + } + /// [电子看板_发动机号_线首工位_查询_根据发动机号] 20160728 majian + /// + /// + /// + static public bool GetEngineID_Select(string engineID, string opName, out DataTable dt) + { + string errorMessage = ""; + DataSet ds; + bool isOK; + dt = null; + //string connectionString = ApplicationConfig.ConnectionString; + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_根据发动机号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + dt = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + private string QualityDataButton_bgColor_Select_energineSelect() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //单号 + string energineID = HttpContext.Current.Request["energineID"]; + string opname = HttpContext.Current.Request["value"]; + QualityDataButton_bgColor_Select(opname, energineID, out dt);//此处重新写函数 + if (dt != null) + { + if (dt.Rows.Count >= 0) + { + text = Buttons.Createbuttons(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun02:QualityDataButton_bgColor_Select"); + } + return text; + + } + /// WEB根据工位名称和发动机号查询质量数据合格索引(包括了分线的信息、存储过程中根据工位类型区分) 20140626 wt + /// + /// + /// + /// + /// + public static bool QualityDataButton_bgColor_Select(string opname, string energineID, out DataTable dt) + { + string procedureName = "显示测量数据_工位号_根据发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + /// + /// 获取对应工位的质量数据 + /// + /// + private string QualityDataSelectByEnergineID() + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + string energineID = HttpContext.Current.Request["value"]; + string opname = HttpContext.Current.Request["opname"]; + QualityDataSelect(opname, energineID, out dt); + if (dt != null) + { + //if (dt.Rows.Count > 0) + { + qualitydata = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun10:QualityDataSelect"); + } + return qualitydata; + + } + + static public bool QualityDataSelect(string opname, string energineID, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_根据_工位号_发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 查询返修上线工位及返修路径数目 + /// + /// + /// + /// + public static void RepairBtnDataSelect(string OpName, out string BtnData, out int RouteNum) + { + + DataTable dt; + string procedureName; + BtnData = ""; + RouteNum = 0; + procedureName = "返修上线_返修工位_返修上线点及返修路径_基础配置_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + BtnData = dt.Rows[0]["待返修工位"].ToString(); + RouteNum = Convert.ToInt32(dt.Rows[0]["返修路径数目"]); + } + } + } + + + /// + /// 查询当前上线点上次选择的返修工位,用于界面按钮颜色原始数据 + /// + /// + /// + /// + public static bool selectRepairData(string OpName, out DataTable dt) + { + + string procedureName; + procedureName = "返修上线_返修工位及返修路径_最近数据_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + } + /// + /// + /// + /// + /// + /// + public static bool selectRepairStrSelect(string OpName, string selectID, out DataTable dt) + { + string procedureName; + procedureName = "返修上线_返修工位及返修路径_是否工作判断"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", selectID); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + + } + + } +} diff --git a/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction12.cs b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction12.cs new file mode 100644 index 0000000..9150338 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction12.cs @@ -0,0 +1,491 @@ +using DataLinkMesWork; +using bizFacade; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web; +//using SystemFramework; + +namespace MesWebFun +{ + public class WebFunction12 + { + HttpContext contextMesWebFun; + public string ProcessRequest(HttpContext context) + { + contextMesWebFun = context; ; + context.Response.ContentType = "text/plain"; + string type = contextMesWebFun.Request["type"]; + string responseText = ""; + switch (type) + { + //托盘信息 + case "MobySelect": + // responseText = MobySelect(); + break; + //保存手动生成条码 + case "SavingEngineIDShift": + responseText = SavingEngineIDShift(); + break; + case "SaveRepairStatus"://将返修路径及返修数据保存到数据库 + responseText = SaveRepairStatus(); + break; + case "RepairStatusInit"://将返修路径及返修数据保存到数据库 + responseText = RepairStatusInit(); + break; + case "Select_engineType_ByEnergineID": //根据发动机号显示机型 + responseText = Select_engineType_ByEnergineID(); + break; + case "QualityDataButton_bgColor_Select_ByEnergineID": + responseText = QualityDataButton_bgColor_Select_energineSelect(); + break; + ///////////////////////质量查询根据发动机号 + case "QualityDataSelectByEnergineID": + responseText = QualityDataSelectByEnergineID(); + break; + default: + responseText = "05"; + break; + + + } + return responseText; + } + /// + /// //根据发动机号显示机型,界面提示 + /// + /// + private string Select_engineType_ByEnergineID() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + string opName = HttpContext.Current.Request["value"];//发动机号 + string energineID = HttpContext.Current.Request["energineID"];//发动机号 + GetEngineID_Select(energineID, opName, out dt); + + string engineType = ""; + if (dt != null) + { + if (dt.Rows.Count > 0) + { + engineType = dt.Rows[0]["发动机型号"].ToString(); + } + } + text = "{\"engineType\":\"" + engineType + "\"}"; + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun08:Select_engineType_ByEnergineID"); + } + return text; + } + /// + /// 保存手动要求的条码 + /// + /// + private string SavingEngineIDShift() + { + string text = ""; + bool flag = false; + System.Data.DataTable dt = null; + try + { + string opname = HttpContext.Current.Request["value"];//工位号 + string date = HttpContext.Current.Request["date"];//日期 + string num = HttpContext.Current.Request["num"];//流水号 + string[] dates = date.Split('-'); + if (dates.Length > 2) + { + int year = Convert.ToInt32(dates[0]); + int month = Convert.ToInt32(dates[1]); + int day = Convert.ToInt32(dates[2]); + int single = Convert.ToInt32(num); + MES.OpName_MIS_Manual_Insert(opname, year, month, day, single); + flag = true; + } + if (flag) + { + text = "{\"flag\":\"1\"}"; + } + else + { + text = "{\"flag\":\"0\"}"; + } + return text; + } + catch (Exception err) + { + text = "{\"flag\":\"0\"}"; + //ApplicationLog.WriteLog(err, "MesWebFun01:SavingEngineIDShift"); + return text; + } + } + + private static string RepairStatusInit() + { + string Opname = HttpContext.Current.Request["value"];//工位号 + string selectID = HttpContext.Current.Request["text_selectByID"];//工位号 text_selectByID + string outtext = CreateRepairUpLine(Opname, selectID); + return outtext; + } + + + /// + /// 动态创建返修上线工位按钮 + /// + /// + /// + public static string CreateRepairUpLine(string OpName, string selectID) + { + StringBuilder HtmlStr = new StringBuilder();//可修改字符串 + + string BtnData = ""; + int RouteNum = 0; + bool HaveDataOrNot = false; + DataTable dt; + + string StationDataStr;//最近一条返修工位数据 + //查询返修上线字符串及路径数目 + RepairBtnDataSelect(OpName, out BtnData, out RouteNum); + string[] RepairSta = BtnData.Split('^');//目标工位数组 + string TargetStationData = "";//目标工位数据 + //查询之前的返修上线数据 + HaveDataOrNot = selectRepairStrSelect(OpName, selectID, out dt); + //合成界面显示按钮字符串 + if (HaveDataOrNot) + { + StationDataStr = dt.Rows[0]["返修字符串"].ToString(); + if (StationDataStr == "") + { + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + else + { + TargetStationData = StationDataStr; + } + } + else + { + + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + //页面定义 + HtmlStr.Append("\r\n"); + for (int i = 0; i < RepairSta.Length; i++) + { + //动态生成标签 + //样式定义 + string td_style = "width:20%;height:35px";//td样式 + string btn_style = "width:98%;height:98%;font-family:微软雅黑;font-size:15px;border-color: #99CCFF";//标签样式 + string type = "button"; + string tagID = "Btn_" + RepairSta[i]; + string value = RepairSta[i]; + string onclick = "RepairBtnClick(Btn_" + value + ")"; + string[] StationDataArray = TargetStationData.Split('^'); + string bgColor; + + if (StationDataArray[i] == "1") + { + bgColor = "background-color: green"; + } + else + { + bgColor = "background-color: gray"; + } + //保证每行5个按钮 + if (i < RepairSta.Length - 1) + { + if (i % 5 < 4) + { + HtmlStr.Append(""); + } + else + { + HtmlStr.Append(""); + HtmlStr.Append("\r\n"); + } + } + else + { + HtmlStr.Append(""); + HtmlStr.Append(""); + } + + } + HtmlStr.Append("
"); + //上线路径大于1条则显示上线路径 + if (RouteNum > 1) + { + + } + return HtmlStr.ToString(); + } + + + /// + /// 向数据库写入返修数据 + /// + /// + /// + /// + public static bool updateRepairStatusTo_SQL(string opname, string status) + { + string produceName = "测量数据_返修工位_工位状态_修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", status); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + private static string SaveRepairStatus() + { + + try + { + string RepairStatus = HttpContext.Current.Request["str_value"];//返修工位状态 + string engineID = HttpContext.Current.Request["engineID"];//返修零件总成号 + int RepairMethod = Convert.ToInt32(HttpContext.Current.Request["RepairMethod"]);//返修路径 + string engineType = HttpContext.Current.Request["engineType"];//返修零件总成号 + string RepairOpName = HttpContext.Current.Request["OpName"];//返修上线点 + string[] RepairStatusSplit = RepairStatus.Split('|'); + for (int i = 0; i < RepairStatusSplit.Length - 1; i++) + { + updateRepairStatusTo_SQL(RepairStatusSplit[i].Split('^')[0], RepairStatusSplit[i].Split('^')[1]); + } + + string produceName = "返修上线_返修工位及返修路径_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总成编号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", RepairStatus); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@返修路径", RepairMethod); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@返修上线点", RepairOpName); + string result = Convert.ToString(DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)); + return result; + } + catch (Exception err) + { + return "0"; + } + + } + /// [电子看板_发动机号_线首工位_查询_根据发动机号] 20160728 majian + /// + /// + /// + static public bool GetEngineID_Select(string engineID, string opName, out DataTable dt) + { + string errorMessage = ""; + DataSet ds; + bool isOK; + dt = null; + //string connectionString = ApplicationConfig.ConnectionString; + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_根据发动机号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + dt = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + private string QualityDataButton_bgColor_Select_energineSelect() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //单号 + string energineID = HttpContext.Current.Request["energineID"]; + string opname = HttpContext.Current.Request["value"]; + QualityDataButton_bgColor_Select(opname, energineID, out dt);//此处重新写函数 + if (dt != null) + { + if (dt.Rows.Count >= 0) + { + text = Buttons.Createbuttons(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun02:QualityDataButton_bgColor_Select"); + } + return text; + + } + /// WEB根据工位名称和发动机号查询质量数据合格索引(包括了分线的信息、存储过程中根据工位类型区分) 20140626 wt + /// + /// + /// + /// + /// + public static bool QualityDataButton_bgColor_Select(string opname, string energineID, out DataTable dt) + { + string procedureName = "显示测量数据_工位号_根据发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + /// + /// 获取对应工位的质量数据 + /// + /// + private string QualityDataSelectByEnergineID() + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + string energineID = HttpContext.Current.Request["value"]; + string opname = HttpContext.Current.Request["opname"]; + QualityDataSelect(opname, energineID, out dt); + if (dt != null) + { + //if (dt.Rows.Count > 0) + { + qualitydata = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun10:QualityDataSelect"); + } + return qualitydata; + + } + + static public bool QualityDataSelect(string opname, string energineID, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_根据_工位号_发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 查询返修上线工位及返修路径数目 + /// + /// + /// + /// + public static void RepairBtnDataSelect(string OpName, out string BtnData, out int RouteNum) + { + + DataTable dt; + string procedureName; + BtnData = ""; + RouteNum = 0; + procedureName = "返修上线_返修工位_返修上线点及返修路径_基础配置_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + BtnData = dt.Rows[0]["待返修工位"].ToString(); + RouteNum = Convert.ToInt32(dt.Rows[0]["返修路径数目"]); + } + } + } + + + /// + /// 查询当前上线点上次选择的返修工位,用于界面按钮颜色原始数据 + /// + /// + /// + /// + public static bool selectRepairData(string OpName, out DataTable dt) + { + + string procedureName; + procedureName = "返修上线_返修工位及返修路径_最近数据_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + } + /// + /// + /// + /// + /// + /// + public static bool selectRepairStrSelect(string OpName, string selectID, out DataTable dt) + { + string procedureName; + procedureName = "返修上线_返修工位及返修路径_是否工作判断"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", selectID); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + + } + + } +} diff --git a/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction13.cs b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction13.cs new file mode 100644 index 0000000..529184f --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction13.cs @@ -0,0 +1,491 @@ +using DataLinkMesWork; +using bizFacade; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web; +//using SystemFramework; + +namespace MesWebFun +{ + public class WebFunction13 + { + HttpContext contextMesWebFun; + public string ProcessRequest(HttpContext context) + { + contextMesWebFun = context; ; + context.Response.ContentType = "text/plain"; + string type = contextMesWebFun.Request["type"]; + string responseText = ""; + switch (type) + { + //托盘信息 + case "MobySelect": + // responseText = MobySelect(); + break; + //保存手动生成条码 + case "SavingEngineIDShift": + responseText = SavingEngineIDShift(); + break; + case "SaveRepairStatus"://将返修路径及返修数据保存到数据库 + responseText = SaveRepairStatus(); + break; + case "RepairStatusInit"://将返修路径及返修数据保存到数据库 + responseText = RepairStatusInit(); + break; + case "Select_engineType_ByEnergineID": //根据发动机号显示机型 + responseText = Select_engineType_ByEnergineID(); + break; + case "QualityDataButton_bgColor_Select_ByEnergineID": + responseText = QualityDataButton_bgColor_Select_energineSelect(); + break; + ///////////////////////质量查询根据发动机号 + case "QualityDataSelectByEnergineID": + responseText = QualityDataSelectByEnergineID(); + break; + default: + responseText = "05"; + break; + + + } + return responseText; + } + /// + /// //根据发动机号显示机型,界面提示 + /// + /// + private string Select_engineType_ByEnergineID() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + string opName = HttpContext.Current.Request["value"];//发动机号 + string energineID = HttpContext.Current.Request["energineID"];//发动机号 + GetEngineID_Select(energineID, opName, out dt); + + string engineType = ""; + if (dt != null) + { + if (dt.Rows.Count > 0) + { + engineType = dt.Rows[0]["发动机型号"].ToString(); + } + } + text = "{\"engineType\":\"" + engineType + "\"}"; + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun08:Select_engineType_ByEnergineID"); + } + return text; + } + /// + /// 保存手动要求的条码 + /// + /// + private string SavingEngineIDShift() + { + string text = ""; + bool flag = false; + System.Data.DataTable dt = null; + try + { + string opname = HttpContext.Current.Request["value"];//工位号 + string date = HttpContext.Current.Request["date"];//日期 + string num = HttpContext.Current.Request["num"];//流水号 + string[] dates = date.Split('-'); + if (dates.Length > 2) + { + int year = Convert.ToInt32(dates[0]); + int month = Convert.ToInt32(dates[1]); + int day = Convert.ToInt32(dates[2]); + int single = Convert.ToInt32(num); + MES.OpName_MIS_Manual_Insert(opname, year, month, day, single); + flag = true; + } + if (flag) + { + text = "{\"flag\":\"1\"}"; + } + else + { + text = "{\"flag\":\"0\"}"; + } + return text; + } + catch (Exception err) + { + text = "{\"flag\":\"0\"}"; + //ApplicationLog.WriteLog(err, "MesWebFun01:SavingEngineIDShift"); + return text; + } + } + + private static string RepairStatusInit() + { + string Opname = HttpContext.Current.Request["value"];//工位号 + string selectID = HttpContext.Current.Request["text_selectByID"];//工位号 text_selectByID + string outtext = CreateRepairUpLine(Opname, selectID); + return outtext; + } + + + /// + /// 动态创建返修上线工位按钮 + /// + /// + /// + public static string CreateRepairUpLine(string OpName, string selectID) + { + StringBuilder HtmlStr = new StringBuilder();//可修改字符串 + + string BtnData = ""; + int RouteNum = 0; + bool HaveDataOrNot = false; + DataTable dt; + + string StationDataStr;//最近一条返修工位数据 + //查询返修上线字符串及路径数目 + RepairBtnDataSelect(OpName, out BtnData, out RouteNum); + string[] RepairSta = BtnData.Split('^');//目标工位数组 + string TargetStationData = "";//目标工位数据 + //查询之前的返修上线数据 + HaveDataOrNot = selectRepairStrSelect(OpName, selectID, out dt); + //合成界面显示按钮字符串 + if (HaveDataOrNot) + { + StationDataStr = dt.Rows[0]["返修字符串"].ToString(); + if (StationDataStr == "") + { + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + else + { + TargetStationData = StationDataStr; + } + } + else + { + + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + //页面定义 + HtmlStr.Append("\r\n"); + for (int i = 0; i < RepairSta.Length; i++) + { + //动态生成标签 + //样式定义 + string td_style = "width:20%;height:35px";//td样式 + string btn_style = "width:98%;height:98%;font-family:微软雅黑;font-size:15px;border-color: #99CCFF";//标签样式 + string type = "button"; + string tagID = "Btn_" + RepairSta[i]; + string value = RepairSta[i]; + string onclick = "RepairBtnClick(Btn_" + value + ")"; + string[] StationDataArray = TargetStationData.Split('^'); + string bgColor; + + if (StationDataArray[i] == "1") + { + bgColor = "background-color: green"; + } + else + { + bgColor = "background-color: gray"; + } + //保证每行5个按钮 + if (i < RepairSta.Length - 1) + { + if (i % 5 < 4) + { + HtmlStr.Append(""); + } + else + { + HtmlStr.Append(""); + HtmlStr.Append("\r\n"); + } + } + else + { + HtmlStr.Append(""); + HtmlStr.Append(""); + } + + } + HtmlStr.Append("
"); + //上线路径大于1条则显示上线路径 + if (RouteNum > 1) + { + + } + return HtmlStr.ToString(); + } + + + /// + /// 向数据库写入返修数据 + /// + /// + /// + /// + public static bool updateRepairStatusTo_SQL(string opname, string status) + { + string produceName = "测量数据_返修工位_工位状态_修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", status); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + private static string SaveRepairStatus() + { + + try + { + string RepairStatus = HttpContext.Current.Request["str_value"];//返修工位状态 + string engineID = HttpContext.Current.Request["engineID"];//返修零件总成号 + int RepairMethod = Convert.ToInt32(HttpContext.Current.Request["RepairMethod"]);//返修路径 + string engineType = HttpContext.Current.Request["engineType"];//返修零件总成号 + string RepairOpName = HttpContext.Current.Request["OpName"];//返修上线点 + string[] RepairStatusSplit = RepairStatus.Split('|'); + for (int i = 0; i < RepairStatusSplit.Length - 1; i++) + { + updateRepairStatusTo_SQL(RepairStatusSplit[i].Split('^')[0], RepairStatusSplit[i].Split('^')[1]); + } + + string produceName = "返修上线_返修工位及返修路径_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总成编号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", RepairStatus); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@返修路径", RepairMethod); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@返修上线点", RepairOpName); + string result = Convert.ToString(DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)); + return result; + } + catch (Exception err) + { + return "0"; + } + + } + /// [电子看板_发动机号_线首工位_查询_根据发动机号] 20160728 majian + /// + /// + /// + static public bool GetEngineID_Select(string engineID, string opName, out DataTable dt) + { + string errorMessage = ""; + DataSet ds; + bool isOK; + dt = null; + //string connectionString = ApplicationConfig.ConnectionString; + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_根据发动机号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + dt = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + private string QualityDataButton_bgColor_Select_energineSelect() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //单号 + string energineID = HttpContext.Current.Request["energineID"]; + string opname = HttpContext.Current.Request["value"]; + QualityDataButton_bgColor_Select(opname, energineID, out dt);//此处重新写函数 + if (dt != null) + { + if (dt.Rows.Count >= 0) + { + text = Buttons.Createbuttons(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun02:QualityDataButton_bgColor_Select"); + } + return text; + + } + /// WEB根据工位名称和发动机号查询质量数据合格索引(包括了分线的信息、存储过程中根据工位类型区分) 20140626 wt + /// + /// + /// + /// + /// + public static bool QualityDataButton_bgColor_Select(string opname, string energineID, out DataTable dt) + { + string procedureName = "显示测量数据_工位号_根据发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + /// + /// 获取对应工位的质量数据 + /// + /// + private string QualityDataSelectByEnergineID() + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + string energineID = HttpContext.Current.Request["value"]; + string opname = HttpContext.Current.Request["opname"]; + QualityDataSelect(opname, energineID, out dt); + if (dt != null) + { + //if (dt.Rows.Count > 0) + { + qualitydata = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun10:QualityDataSelect"); + } + return qualitydata; + + } + + static public bool QualityDataSelect(string opname, string energineID, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_根据_工位号_发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 查询返修上线工位及返修路径数目 + /// + /// + /// + /// + public static void RepairBtnDataSelect(string OpName, out string BtnData, out int RouteNum) + { + + DataTable dt; + string procedureName; + BtnData = ""; + RouteNum = 0; + procedureName = "返修上线_返修工位_返修上线点及返修路径_基础配置_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + BtnData = dt.Rows[0]["待返修工位"].ToString(); + RouteNum = Convert.ToInt32(dt.Rows[0]["返修路径数目"]); + } + } + } + + + /// + /// 查询当前上线点上次选择的返修工位,用于界面按钮颜色原始数据 + /// + /// + /// + /// + public static bool selectRepairData(string OpName, out DataTable dt) + { + + string procedureName; + procedureName = "返修上线_返修工位及返修路径_最近数据_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + } + /// + /// + /// + /// + /// + /// + public static bool selectRepairStrSelect(string OpName, string selectID, out DataTable dt) + { + string procedureName; + procedureName = "返修上线_返修工位及返修路径_是否工作判断"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", selectID); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + + } + + } +} diff --git a/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction14.cs b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction14.cs new file mode 100644 index 0000000..c642413 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction14.cs @@ -0,0 +1,493 @@ +using DataLinkMesWork; +using bizFacade; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Web; +//using SystemFramework; + +namespace MesWebFun +{ + public class WebFunction14 + { + + HttpContext contextMesWebFun; + public string ProcessRequest(HttpContext context) + { + contextMesWebFun = context; ; + context.Response.ContentType = "text/plain"; + string type = contextMesWebFun.Request["type"]; + string responseText = ""; + switch (type) + { + //保存手动生成条码 + case "SavingEngineIDShift": + responseText = SavingEngineIDShift(); + break; + case "SaveRepairStatus"://将返修路径及返修数据保存到数据库 + responseText = SaveRepairStatus(); + break; + case "RepairStatusInit"://将返修路径及返修数据保存到数据库 + responseText = RepairStatusInit(); + break; + case "Select_engineType_ByEnergineID": //根据发动机号显示机型 + responseText = Select_engineType_ByEnergineID(); + break; + case "QualityDataButton_bgColor_Select_ByEnergineID": + responseText = QualityDataButton_bgColor_Select_energineSelect(); + break; + ///////////////////////质量查询根据发动机号 + case "QualityDataSelectByEnergineID": + responseText = QualityDataSelectByEnergineID(); + break; + default: + responseText = "14"; + break; + } + return responseText; + } + + /// + /// 保存手动要求的条码 + /// + /// + private string SavingEngineIDShift() + { + string text = ""; + bool flag = false; + System.Data.DataTable dt = null; + try + { + string opname = HttpContext.Current.Request["value"];//工位号 + string date = HttpContext.Current.Request["date"];//日期 + string num = HttpContext.Current.Request["num"];//流水号 + string[] dates = date.Split('-'); + if (dates.Length > 2) + { + int year = Convert.ToInt32(dates[0]); + int month = Convert.ToInt32(dates[1]); + int day = Convert.ToInt32(dates[2]); + int single = Convert.ToInt32(num); + MES.OpName_MIS_Manual_Insert(opname, year, month, day, single); + flag = true; + } + if (flag) + { + text = "{\"flag\":\"1\"}"; + } + else + { + text = "{\"flag\":\"0\"}"; + } + return text; + } + catch (Exception err) + { + text = "{\"flag\":\"0\"}"; + //ApplicationLog.WriteLog(err, "MesWebFun01:SavingEngineIDShift"); + return text; + } + } + + + + private static string RepairStatusInit() + { + string Opname = HttpContext.Current.Request["value"];//工位号 + string selectID = HttpContext.Current.Request["text_selectByID"];//工位号 text_selectByID + string outtext = CreateRepairUpLine(Opname,selectID); + return outtext; + } + + /// + /// //根据发动机号显示机型,界面提示 + /// + /// + private string Select_engineType_ByEnergineID() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + string opName = HttpContext.Current.Request["value"];//发动机号 + string energineID = HttpContext.Current.Request["energineID"];//发动机号 + GetEngineID_Select(energineID, opName, out dt); + + string engineType = ""; + if (dt != null) + { + if (dt.Rows.Count > 0) + { + engineType = dt.Rows[0]["发动机型号"].ToString(); + } + } + text = "{\"engineType\":\"" + engineType + "\"}"; + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun08:Select_engineType_ByEnergineID"); + } + return text; + } + + + /// + /// 查询返修上线工位及返修路径数目 + /// + /// + /// + /// + public static void RepairBtnDataSelect(string OpName, out string BtnData, out int RouteNum) + { + + DataTable dt; + string procedureName; + BtnData = ""; + RouteNum = 0; + procedureName = "返修上线_返修工位_返修上线点及返修路径_基础配置_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + BtnData = dt.Rows[0]["待返修工位"].ToString(); + RouteNum = Convert.ToInt32(dt.Rows[0]["返修路径数目"]); + } + } + } + + + /// + /// 查询当前上线点上次选择的返修工位,用于界面按钮颜色原始数据 + /// + /// + /// + /// + public static bool selectRepairData(string OpName, out DataTable dt) + { + + string procedureName; + procedureName = "返修上线_返修工位及返修路径_最近数据_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + + } + /// + /// + /// + /// + /// + /// + public static bool selectRepairStrSelect(string OpName,string selectID ,out DataTable dt) + { + string procedureName; + procedureName = "返修上线_返修工位及返修路径_是否工作判断"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", selectID); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + + } + + /// + /// 动态创建返修上线工位按钮 + /// + /// + /// + public static string CreateRepairUpLine(string OpName,string selectID) + { + StringBuilder HtmlStr = new StringBuilder();//可修改字符串 + + string BtnData = ""; + int RouteNum = 0; + bool HaveDataOrNot = false; + DataTable dt; + + string StationDataStr;//最近一条返修工位数据 + //查询返修上线字符串及路径数目 + RepairBtnDataSelect(OpName, out BtnData, out RouteNum); + string[] RepairSta = BtnData.Split('^');//目标工位数组 + string TargetStationData = "";//目标工位数据 + //查询之前的返修上线数据 + HaveDataOrNot = selectRepairStrSelect(OpName, selectID, out dt); + //合成界面显示按钮字符串 + if (HaveDataOrNot) + { + StationDataStr = dt.Rows[0]["返修字符串"].ToString(); + if (StationDataStr == "") + { + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + else + { + TargetStationData = StationDataStr; + } + } + else + { + + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + //页面定义 + HtmlStr.Append("\r\n"); + for (int i = 0; i < RepairSta.Length; i++) + { + //动态生成标签 + //样式定义 + string td_style = "width:20%;height:35px";//td样式 + string btn_style = "width:98%;height:98%;font-family:微软雅黑;font-size:15px;border-color: #99CCFF";//标签样式 + string type = "button"; + string tagID = "Btn_" + RepairSta[i]; + string value = RepairSta[i]; + string onclick = "RepairBtnClick(Btn_" + value + ")"; + string[] StationDataArray = TargetStationData.Split('^'); + string bgColor; + + if (StationDataArray[i] == "1") + { + bgColor = "background-color: green"; + } + else + { + bgColor = "background-color: gray"; + } + //保证每行5个按钮 + if (i < RepairSta.Length - 1) + { + if (i % 5 < 4) + { + HtmlStr.Append(""); + } + else + { + HtmlStr.Append(""); + HtmlStr.Append("\r\n"); + } + } + else + { + HtmlStr.Append(""); + HtmlStr.Append(""); + } + + } + HtmlStr.Append("
"); + //上线路径大于1条则显示上线路径 + if (RouteNum > 1) + { + + + + } + + + + return HtmlStr.ToString(); + } + + /// + /// 向数据库写入返修数据 + /// + /// + /// + /// + public static bool updateRepairStatusTo_SQL(string opname, string status) + { + string produceName = "测量数据_返修工位_工位状态_修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", status); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + private static string SaveRepairStatus() + { + + try + { + string RepairStatus = HttpContext.Current.Request["str_value"];//返修工位状态 + string engineID = HttpContext.Current.Request["engineID"];//返修零件总成号 + int RepairMethod = Convert.ToInt32(HttpContext.Current.Request["RepairMethod"]);//返修路径 + string engineType = HttpContext.Current.Request["engineType"];//返修零件总成号 + string RepairOpName = HttpContext.Current.Request["OpName"];//返修上线点 + string[] RepairStatusSplit = RepairStatus.Split('|'); + for (int i = 0; i < RepairStatusSplit.Length - 1; i++) + { + updateRepairStatusTo_SQL(RepairStatusSplit[i].Split('^')[0], RepairStatusSplit[i].Split('^')[1]); + } + + string produceName = "返修上线_返修工位及返修路径_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总成编号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", RepairStatus); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@返修路径", RepairMethod); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@返修上线点", RepairOpName); + string result = Convert.ToString(DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)); + return result; + } + catch (Exception err) + { + return "0"; + } + + }/// + /// [电子看板_发动机号_线首工位_查询_根据发动机号] 20160728 majian + /// + /// + /// + static public bool GetEngineID_Select(string engineID, string opName, out DataTable dt) + { + string errorMessage = ""; + DataSet ds; + bool isOK; + dt = null; + //string connectionString = ApplicationConfig.ConnectionString; + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_根据发动机号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + dt = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + private string QualityDataButton_bgColor_Select_energineSelect() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //单号 + string energineID = HttpContext.Current.Request["energineID"]; + string opname = HttpContext.Current.Request["value"]; + QualityDataButton_bgColor_Select(opname, energineID, out dt);//此处重新写函数 + if (dt != null) + { + if (dt.Rows.Count >= 0) + { + text = Buttons.Createbuttons(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun02:QualityDataButton_bgColor_Select"); + } + return text; + + } + /// WEB根据工位名称和发动机号查询质量数据合格索引(包括了分线的信息、存储过程中根据工位类型区分) 20140626 wt + /// + /// + /// + /// + /// + public static bool QualityDataButton_bgColor_Select(string opname, string energineID, out DataTable dt) + { + string procedureName = "显示测量数据_工位号_根据发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + /// + /// 获取对应工位的质量数据 + /// + /// + private string QualityDataSelectByEnergineID() + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + string energineID = HttpContext.Current.Request["value"]; + string opname = HttpContext.Current.Request["opname"]; + QualityDataSelect(opname, energineID, out dt); + if (dt != null) + { + //if (dt.Rows.Count > 0) + { + qualitydata = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun10:QualityDataSelect"); + } + return qualitydata; + + } + + static public bool QualityDataSelect(string opname, string energineID, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_根据_工位号_发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + } +} diff --git a/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction15.cs b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction15.cs new file mode 100644 index 0000000..a7b0bc5 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction15.cs @@ -0,0 +1,489 @@ +using DataLinkMesWork; +using bizFacade; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web; +//using SystemFramework; + +namespace MesWebFun +{ + public class WebFunction15 + { + HttpContext contextMesWebFun; + public string ProcessRequest(HttpContext context) + { + contextMesWebFun = context; ; + context.Response.ContentType = "text/plain"; + string type = contextMesWebFun.Request["type"]; + string responseText = ""; + switch (type) + { + //托盘信息 + case "MobySelect": + // responseText = MobySelect(); + break; + //保存手动生成条码 + case "SavingEngineIDShift": + responseText = SavingEngineIDShift(); + break; + case "SaveRepairStatus"://将返修路径及返修数据保存到数据库 + responseText = SaveRepairStatus(); + break; + case "RepairStatusInit"://将返修路径及返修数据保存到数据库 + responseText = RepairStatusInit(); + break; + case "Select_engineType_ByEnergineID": //根据发动机号显示机型 + responseText = Select_engineType_ByEnergineID(); + break; + case "QualityDataButton_bgColor_Select_ByEnergineID": + responseText = QualityDataButton_bgColor_Select_energineSelect(); + break; + ///////////////////////质量查询根据发动机号 + case "QualityDataSelectByEnergineID": + responseText = QualityDataSelectByEnergineID(); + break; + default: + responseText = "15"; + break; + } + return responseText; + } + /// + /// //根据发动机号显示机型,界面提示 + /// + /// + private string Select_engineType_ByEnergineID() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + string opName = HttpContext.Current.Request["value"];//发动机号 + string energineID = HttpContext.Current.Request["energineID"];//发动机号 + GetEngineID_Select(energineID, opName, out dt); + + string engineType = ""; + if (dt != null) + { + if (dt.Rows.Count > 0) + { + engineType = dt.Rows[0]["发动机型号"].ToString(); + } + } + text = "{\"engineType\":\"" + engineType + "\"}"; + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun08:Select_engineType_ByEnergineID"); + } + return text; + } + /// + /// 保存手动要求的条码 + /// + /// + private string SavingEngineIDShift() + { + string text = ""; + bool flag = false; + System.Data.DataTable dt = null; + try + { + string opname = HttpContext.Current.Request["value"];//工位号 + string date = HttpContext.Current.Request["date"];//日期 + string num = HttpContext.Current.Request["num"];//流水号 + string[] dates = date.Split('-'); + if (dates.Length > 2) + { + int year = Convert.ToInt32(dates[0]); + int month = Convert.ToInt32(dates[1]); + int day = Convert.ToInt32(dates[2]); + int single = Convert.ToInt32(num); + MES.OpName_MIS_Manual_Insert(opname, year, month, day, single); + flag = true; + } + if (flag) + { + text = "{\"flag\":\"1\"}"; + } + else + { + text = "{\"flag\":\"0\"}"; + } + return text; + } + catch (Exception err) + { + text = "{\"flag\":\"0\"}"; + //ApplicationLog.WriteLog(err, "MesWebFun01:SavingEngineIDShift"); + return text; + } + } + + private static string RepairStatusInit() + { + string Opname = HttpContext.Current.Request["value"];//工位号 + string selectID = HttpContext.Current.Request["text_selectByID"];//工位号 text_selectByID + string outtext = CreateRepairUpLine(Opname, selectID); + return outtext; + } + + + /// + /// 动态创建返修上线工位按钮 + /// + /// + /// + public static string CreateRepairUpLine(string OpName, string selectID) + { + StringBuilder HtmlStr = new StringBuilder();//可修改字符串 + + string BtnData = ""; + int RouteNum = 0; + bool HaveDataOrNot = false; + DataTable dt; + + string StationDataStr;//最近一条返修工位数据 + //查询返修上线字符串及路径数目 + RepairBtnDataSelect(OpName, out BtnData, out RouteNum); + string[] RepairSta = BtnData.Split('^');//目标工位数组 + string TargetStationData = "";//目标工位数据 + //查询之前的返修上线数据 + HaveDataOrNot = selectRepairStrSelect(OpName, selectID, out dt); + //合成界面显示按钮字符串 + if (HaveDataOrNot) + { + StationDataStr = dt.Rows[0]["返修字符串"].ToString(); + if (StationDataStr == "") + { + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + else + { + TargetStationData = StationDataStr; + } + } + else + { + + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + //页面定义 + HtmlStr.Append("\r\n"); + for (int i = 0; i < RepairSta.Length; i++) + { + //动态生成标签 + //样式定义 + string td_style = "width:20%;height:35px";//td样式 + string btn_style = "width:98%;height:98%;font-family:微软雅黑;font-size:15px;border-color: #99CCFF";//标签样式 + string type = "button"; + string tagID = "Btn_" + RepairSta[i]; + string value = RepairSta[i]; + string onclick = "RepairBtnClick(Btn_" + value + ")"; + string[] StationDataArray = TargetStationData.Split('^'); + string bgColor; + + if (StationDataArray[i] == "1") + { + bgColor = "background-color: green"; + } + else + { + bgColor = "background-color: gray"; + } + //保证每行5个按钮 + if (i < RepairSta.Length - 1) + { + if (i % 5 < 4) + { + HtmlStr.Append(""); + } + else + { + HtmlStr.Append(""); + HtmlStr.Append("\r\n"); + } + } + else + { + HtmlStr.Append(""); + HtmlStr.Append(""); + } + + } + HtmlStr.Append("
"); + //上线路径大于1条则显示上线路径 + if (RouteNum > 1) + { + + } + return HtmlStr.ToString(); + } + + + /// + /// 向数据库写入返修数据 + /// + /// + /// + /// + public static bool updateRepairStatusTo_SQL(string opname, string status) + { + string produceName = "测量数据_返修工位_工位状态_修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", status); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + private static string SaveRepairStatus() + { + + try + { + string RepairStatus = HttpContext.Current.Request["str_value"];//返修工位状态 + string engineID = HttpContext.Current.Request["engineID"];//返修零件总成号 + int RepairMethod = Convert.ToInt32(HttpContext.Current.Request["RepairMethod"]);//返修路径 + string engineType = HttpContext.Current.Request["engineType"];//返修零件总成号 + string RepairOpName = HttpContext.Current.Request["OpName"];//返修上线点 + string[] RepairStatusSplit = RepairStatus.Split('|'); + for (int i = 0; i < RepairStatusSplit.Length - 1; i++) + { + updateRepairStatusTo_SQL(RepairStatusSplit[i].Split('^')[0], RepairStatusSplit[i].Split('^')[1]); + } + + string produceName = "返修上线_返修工位及返修路径_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总成编号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", RepairStatus); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@返修路径", RepairMethod); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@返修上线点", RepairOpName); + string result = Convert.ToString(DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)); + return result; + } + catch (Exception err) + { + return "0"; + } + + } + /// [电子看板_发动机号_线首工位_查询_根据发动机号] 20160728 majian + /// + /// + /// + static public bool GetEngineID_Select(string engineID, string opName, out DataTable dt) + { + string errorMessage = ""; + DataSet ds; + bool isOK; + dt = null; + //string connectionString = ApplicationConfig.ConnectionString; + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_根据发动机号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + dt = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + private string QualityDataButton_bgColor_Select_energineSelect() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //单号 + string energineID = HttpContext.Current.Request["energineID"]; + string opname = HttpContext.Current.Request["value"]; + QualityDataButton_bgColor_Select(opname, energineID, out dt);//此处重新写函数 + if (dt != null) + { + if (dt.Rows.Count >= 0) + { + text = Buttons.Createbuttons(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun02:QualityDataButton_bgColor_Select"); + } + return text; + + } + /// WEB根据工位名称和发动机号查询质量数据合格索引(包括了分线的信息、存储过程中根据工位类型区分) 20140626 wt + /// + /// + /// + /// + /// + public static bool QualityDataButton_bgColor_Select(string opname, string energineID, out DataTable dt) + { + string procedureName = "显示测量数据_工位号_根据发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + /// + /// 获取对应工位的质量数据 + /// + /// + private string QualityDataSelectByEnergineID() + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + string energineID = HttpContext.Current.Request["value"]; + string opname = HttpContext.Current.Request["opname"]; + QualityDataSelect(opname, energineID, out dt); + if (dt != null) + { + //if (dt.Rows.Count > 0) + { + qualitydata = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun10:QualityDataSelect"); + } + return qualitydata; + + } + + static public bool QualityDataSelect(string opname, string energineID, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_根据_工位号_发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 查询返修上线工位及返修路径数目 + /// + /// + /// + /// + public static void RepairBtnDataSelect(string OpName, out string BtnData, out int RouteNum) + { + + DataTable dt; + string procedureName; + BtnData = ""; + RouteNum = 0; + procedureName = "返修上线_返修工位_返修上线点及返修路径_基础配置_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + BtnData = dt.Rows[0]["待返修工位"].ToString(); + RouteNum = Convert.ToInt32(dt.Rows[0]["返修路径数目"]); + } + } + } + + + /// + /// 查询当前上线点上次选择的返修工位,用于界面按钮颜色原始数据 + /// + /// + /// + /// + public static bool selectRepairData(string OpName, out DataTable dt) + { + + string procedureName; + procedureName = "返修上线_返修工位及返修路径_最近数据_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + } + /// + /// + /// + /// + /// + /// + public static bool selectRepairStrSelect(string OpName, string selectID, out DataTable dt) + { + string procedureName; + procedureName = "返修上线_返修工位及返修路径_是否工作判断"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", selectID); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + + } + + } +} diff --git a/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction16.cs b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction16.cs new file mode 100644 index 0000000..0c41b22 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction16.cs @@ -0,0 +1,483 @@ +using bizFacade; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web; +//using SystemFramework; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +namespace MesWebFun +{ + public class WebFunction16 + { + HttpContext contextMesWebFun; + public string ProcessRequest(HttpContext context) + { + contextMesWebFun = context; ; + context.Response.ContentType = "text/plain"; + string type = contextMesWebFun.Request["type"]; + string responseText = ""; + switch (type) + { + //保存手动生成条码 + case "SavingEngineIDShift": + responseText = SavingEngineIDShift(); + break; + case "SaveRepairStatus"://将返修路径及返修数据保存到数据库 + responseText = SaveRepairStatus(); + break; + case "RepairStatusInit"://将返修路径及返修数据保存到数据库 + responseText = RepairStatusInit(); + break; + case "Select_engineType_ByEnergineID": //根据发动机号显示机型 + responseText = Select_engineType_ByEnergineID(); + break; + case "QualityDataButton_bgColor_Select_ByEnergineID": + responseText = QualityDataButton_bgColor_Select_energineSelect(); + break; + ///////////////////////质量查询根据发动机号 + case "QualityDataSelectByEnergineID": + responseText = QualityDataSelectByEnergineID(); + break; + default: + responseText = "01"; + break; + } + return responseText; + } + /// + /// //根据发动机号显示机型,界面提示 + /// + /// + private string Select_engineType_ByEnergineID() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + string opName = HttpContext.Current.Request["value"];//发动机号 + string energineID = HttpContext.Current.Request["energineID"];//发动机号 + GetEngineID_Select(energineID, opName, out dt); + + string engineType = ""; + if (dt != null) + { + if (dt.Rows.Count > 0) + { + engineType = dt.Rows[0]["发动机型号"].ToString(); + } + } + text = "{\"engineType\":\"" + engineType + "\"}"; + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun08:Select_engineType_ByEnergineID"); + } + return text; + } + /// + /// 保存手动要求的条码 + /// + /// + private string SavingEngineIDShift() + { + string text = ""; + bool flag = false; + System.Data.DataTable dt = null; + try + { + string opname = HttpContext.Current.Request["value"];//工位号 + string date = HttpContext.Current.Request["date"];//日期 + string num = HttpContext.Current.Request["num"];//流水号 + string[] dates = date.Split('-'); + if (dates.Length > 2) + { + int year = Convert.ToInt32(dates[0]); + int month = Convert.ToInt32(dates[1]); + int day = Convert.ToInt32(dates[2]); + int single = Convert.ToInt32(num); + MES.OpName_MIS_Manual_Insert(opname, year, month, day, single); + flag = true; + } + if (flag) + { + text = "{\"flag\":\"1\"}"; + } + else + { + text = "{\"flag\":\"0\"}"; + } + return text; + } + catch (Exception err) + { + text = "{\"flag\":\"0\"}"; + //ApplicationLog.WriteLog(err, "MesWebFun01:SavingEngineIDShift"); + return text; + } + } + + private static string RepairStatusInit() + { + string Opname = HttpContext.Current.Request["value"];//工位号 + string selectID = HttpContext.Current.Request["text_selectByID"];//工位号 text_selectByID + string outtext = CreateRepairUpLine(Opname, selectID); + return outtext; + } + + + /// + /// 动态创建返修上线工位按钮 + /// + /// + /// + public static string CreateRepairUpLine(string OpName, string selectID) + { + StringBuilder HtmlStr = new StringBuilder();//可修改字符串 + + string BtnData = ""; + int RouteNum = 0; + bool HaveDataOrNot = false; + DataTable dt; + + string StationDataStr;//最近一条返修工位数据 + //查询返修上线字符串及路径数目 + RepairBtnDataSelect(OpName, out BtnData, out RouteNum); + string[] RepairSta = BtnData.Split('^');//目标工位数组 + string TargetStationData = "";//目标工位数据 + //查询之前的返修上线数据 + HaveDataOrNot = selectRepairStrSelect(OpName, selectID, out dt); + //合成界面显示按钮字符串 + if (HaveDataOrNot) + { + StationDataStr = dt.Rows[0]["返修字符串"].ToString(); + if (StationDataStr == "") + { + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + else + { + TargetStationData = StationDataStr; + } + } + else + { + + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + //页面定义 + HtmlStr.Append("\r\n"); + for (int i = 0; i < RepairSta.Length; i++) + { + //动态生成标签 + //样式定义 + string td_style = "width:20%;height:35px";//td样式 + string btn_style = "width:98%;height:98%;font-family:微软雅黑;font-size:15px;border-color: #99CCFF";//标签样式 + string type = "button"; + string tagID = "Btn_" + RepairSta[i]; + string value = RepairSta[i]; + string onclick = "RepairBtnClick(Btn_" + value + ")"; + string[] StationDataArray = TargetStationData.Split('^'); + string bgColor; + + if (StationDataArray[i] == "1") + { + bgColor = "background-color: green"; + } + else + { + bgColor = "background-color: gray"; + } + //保证每行5个按钮 + if (i < RepairSta.Length - 1) + { + if (i % 5 < 4) + { + HtmlStr.Append(""); + } + else + { + HtmlStr.Append(""); + HtmlStr.Append("\r\n"); + } + } + else + { + HtmlStr.Append(""); + HtmlStr.Append(""); + } + + } + HtmlStr.Append("
"); + //上线路径大于1条则显示上线路径 + if (RouteNum > 1) + { + + } + return HtmlStr.ToString(); + } + + + /// + /// 向数据库写入返修数据 + /// + /// + /// + /// + public static bool updateRepairStatusTo_SQL(string opname, string status) + { + string produceName = "测量数据_返修工位_工位状态_修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", status); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + private static string SaveRepairStatus() + { + + try + { + string RepairStatus = HttpContext.Current.Request["str_value"];//返修工位状态 + string engineID = HttpContext.Current.Request["engineID"];//返修零件总成号 + int RepairMethod = Convert.ToInt32(HttpContext.Current.Request["RepairMethod"]);//返修路径 + string engineType = HttpContext.Current.Request["engineType"];//返修零件总成号 + string RepairOpName = HttpContext.Current.Request["OpName"];//返修上线点 + string[] RepairStatusSplit = RepairStatus.Split('|'); + for (int i = 0; i < RepairStatusSplit.Length - 1; i++) + { + updateRepairStatusTo_SQL(RepairStatusSplit[i].Split('^')[0], RepairStatusSplit[i].Split('^')[1]); + } + + string produceName = "返修上线_返修工位及返修路径_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总成编号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", RepairStatus); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@返修路径", RepairMethod); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@返修上线点", RepairOpName); + string result = Convert.ToString(DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)); + return result; + } + catch (Exception err) + { + return "0"; + } + + } + /// [电子看板_发动机号_线首工位_查询_根据发动机号] 20160728 majian + /// + /// + /// + static public bool GetEngineID_Select(string engineID, string opName, out DataTable dt) + { + string errorMessage = ""; + DataSet ds; + bool isOK; + dt = null; + //string connectionString = ApplicationConfig.ConnectionString; + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_根据发动机号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + dt = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + private string QualityDataButton_bgColor_Select_energineSelect() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //单号 + string energineID = HttpContext.Current.Request["energineID"]; + string opname = HttpContext.Current.Request["value"]; + QualityDataButton_bgColor_Select(opname, energineID, out dt);//此处重新写函数 + if (dt != null) + { + if (dt.Rows.Count >= 0) + { + text = Buttons.Createbuttons(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun02:QualityDataButton_bgColor_Select"); + } + return text; + + } + /// WEB根据工位名称和发动机号查询质量数据合格索引(包括了分线的信息、存储过程中根据工位类型区分) 20140626 wt + /// + /// + /// + /// + /// + public static bool QualityDataButton_bgColor_Select(string opname, string energineID, out DataTable dt) + { + string procedureName = "显示测量数据_工位号_根据发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + /// + /// 获取对应工位的质量数据 + /// + /// + private string QualityDataSelectByEnergineID() + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + string energineID = HttpContext.Current.Request["value"]; + string opname = HttpContext.Current.Request["opname"]; + QualityDataSelect(opname, energineID, out dt); + if (dt != null) + { + //if (dt.Rows.Count > 0) + { + qualitydata = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun10:QualityDataSelect"); + } + return qualitydata; + + } + + static public bool QualityDataSelect(string opname, string energineID, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_根据_工位号_发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 查询返修上线工位及返修路径数目 + /// + /// + /// + /// + public static void RepairBtnDataSelect(string OpName, out string BtnData, out int RouteNum) + { + + DataTable dt; + string procedureName; + BtnData = ""; + RouteNum = 0; + procedureName = "返修上线_返修工位_返修上线点及返修路径_基础配置_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + BtnData = dt.Rows[0]["待返修工位"].ToString(); + RouteNum = Convert.ToInt32(dt.Rows[0]["返修路径数目"]); + } + } + } + + + /// + /// 查询当前上线点上次选择的返修工位,用于界面按钮颜色原始数据 + /// + /// + /// + /// + public static bool selectRepairData(string OpName, out DataTable dt) + { + + string procedureName; + procedureName = "返修上线_返修工位及返修路径_最近数据_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + } + /// + /// + /// + /// + /// + /// + public static bool selectRepairStrSelect(string OpName, string selectID, out DataTable dt) + { + string procedureName; + procedureName = "返修上线_返修工位及返修路径_是否工作判断"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", selectID); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + + } + } +} diff --git a/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction17.cs b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction17.cs new file mode 100644 index 0000000..03bd217 --- /dev/null +++ b/Common/08WebFun_base/WebFun_base/SpecialFun/WebFunction17.cs @@ -0,0 +1,483 @@ +using bizFacade; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web; +//using SystemFramework; +using System.Data; +using System.Data.SqlClient; +using DataLinkMesWork; +namespace MesWebFun +{ + public class WebFunction17 + { + HttpContext contextMesWebFun; + public string ProcessRequest(HttpContext context) + { + contextMesWebFun = context; ; + context.Response.ContentType = "text/plain"; + string type = contextMesWebFun.Request["type"]; + string responseText = ""; + switch (type) + { + //保存手动生成条码 + case "SavingEngineIDShift": + responseText = SavingEngineIDShift(); + break; + case "SaveRepairStatus"://将返修路径及返修数据保存到数据库 + responseText = SaveRepairStatus(); + break; + case "RepairStatusInit"://将返修路径及返修数据保存到数据库 + responseText = RepairStatusInit(); + break; + case "Select_engineType_ByEnergineID": //根据发动机号显示机型 + responseText = Select_engineType_ByEnergineID(); + break; + case "QualityDataButton_bgColor_Select_ByEnergineID": + responseText = QualityDataButton_bgColor_Select_energineSelect(); + break; + ///////////////////////质量查询根据发动机号 + case "QualityDataSelectByEnergineID": + responseText = QualityDataSelectByEnergineID(); + break; + default: + responseText = "17"; + break; + } + return responseText; + } + /// + /// //根据发动机号显示机型,界面提示 + /// + /// + private string Select_engineType_ByEnergineID() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + string opName = HttpContext.Current.Request["value"];//发动机号 + string energineID = HttpContext.Current.Request["energineID"];//发动机号 + GetEngineID_Select(energineID, opName, out dt); + + string engineType = ""; + if (dt != null) + { + if (dt.Rows.Count > 0) + { + engineType = dt.Rows[0]["发动机型号"].ToString(); + } + } + text = "{\"engineType\":\"" + engineType + "\"}"; + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun08:Select_engineType_ByEnergineID"); + } + return text; + } + /// + /// 保存手动要求的条码 + /// + /// + private string SavingEngineIDShift() + { + string text = ""; + bool flag = false; + System.Data.DataTable dt = null; + try + { + string opname = HttpContext.Current.Request["value"];//工位号 + string date = HttpContext.Current.Request["date"];//日期 + string num = HttpContext.Current.Request["num"];//流水号 + string[] dates = date.Split('-'); + if (dates.Length > 2) + { + int year = Convert.ToInt32(dates[0]); + int month = Convert.ToInt32(dates[1]); + int day = Convert.ToInt32(dates[2]); + int single = Convert.ToInt32(num); + MES.OpName_MIS_Manual_Insert(opname, year, month, day, single); + flag = true; + } + if (flag) + { + text = "{\"flag\":\"1\"}"; + } + else + { + text = "{\"flag\":\"0\"}"; + } + return text; + } + catch (Exception err) + { + text = "{\"flag\":\"0\"}"; + //ApplicationLog.WriteLog(err, "MesWebFun01:SavingEngineIDShift"); + return text; + } + } + + private static string RepairStatusInit() + { + string Opname = HttpContext.Current.Request["value"];//工位号 + string selectID = HttpContext.Current.Request["text_selectByID"];//工位号 text_selectByID + string outtext = CreateRepairUpLine(Opname, selectID); + return outtext; + } + + + /// + /// 动态创建返修上线工位按钮 + /// + /// + /// + public static string CreateRepairUpLine(string OpName, string selectID) + { + StringBuilder HtmlStr = new StringBuilder();//可修改字符串 + + string BtnData = ""; + int RouteNum = 0; + bool HaveDataOrNot = false; + DataTable dt; + + string StationDataStr;//最近一条返修工位数据 + //查询返修上线字符串及路径数目 + RepairBtnDataSelect(OpName, out BtnData, out RouteNum); + string[] RepairSta = BtnData.Split('^');//目标工位数组 + string TargetStationData = "";//目标工位数据 + //查询之前的返修上线数据 + HaveDataOrNot = selectRepairStrSelect(OpName, selectID, out dt); + //合成界面显示按钮字符串 + if (HaveDataOrNot) + { + StationDataStr = dt.Rows[0]["返修字符串"].ToString(); + if (StationDataStr == "") + { + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + else + { + TargetStationData = StationDataStr; + } + } + else + { + + for (int i = 0; i < RepairSta.Length; i++) + { + if (i < (RepairSta.Length - 1)) + { + TargetStationData = TargetStationData + "1^"; + } + else + { + TargetStationData = TargetStationData + "1"; + } + } + } + //页面定义 + HtmlStr.Append("\r\n"); + for (int i = 0; i < RepairSta.Length; i++) + { + //动态生成标签 + //样式定义 + string td_style = "width:20%;height:35px";//td样式 + string btn_style = "width:98%;height:98%;font-family:微软雅黑;font-size:15px;border-color: #99CCFF";//标签样式 + string type = "button"; + string tagID = "Btn_" + RepairSta[i]; + string value = RepairSta[i]; + string onclick = "RepairBtnClick(Btn_" + value + ")"; + string[] StationDataArray = TargetStationData.Split('^'); + string bgColor; + + if (StationDataArray[i] == "1") + { + bgColor = "background-color: green"; + } + else + { + bgColor = "background-color: gray"; + } + //保证每行5个按钮 + if (i < RepairSta.Length - 1) + { + if (i % 5 < 4) + { + HtmlStr.Append(""); + } + else + { + HtmlStr.Append(""); + HtmlStr.Append("\r\n"); + } + } + else + { + HtmlStr.Append(""); + HtmlStr.Append(""); + } + + } + HtmlStr.Append("
"); + //上线路径大于1条则显示上线路径 + if (RouteNum > 1) + { + + } + return HtmlStr.ToString(); + } + + + /// + /// 向数据库写入返修数据 + /// + /// + /// + /// + public static bool updateRepairStatusTo_SQL(string opname, string status) + { + string produceName = "测量数据_返修工位_工位状态_修改"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", status); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + private static string SaveRepairStatus() + { + + try + { + string RepairStatus = HttpContext.Current.Request["str_value"];//返修工位状态 + string engineID = HttpContext.Current.Request["engineID"];//返修零件总成号 + int RepairMethod = Convert.ToInt32(HttpContext.Current.Request["RepairMethod"]);//返修路径 + string engineType = HttpContext.Current.Request["engineType"];//返修零件总成号 + string RepairOpName = HttpContext.Current.Request["OpName"];//返修上线点 + string[] RepairStatusSplit = RepairStatus.Split('|'); + for (int i = 0; i < RepairStatusSplit.Length - 1; i++) + { + updateRepairStatusTo_SQL(RepairStatusSplit[i].Split('^')[0], RepairStatusSplit[i].Split('^')[1]); + } + + string produceName = "返修上线_返修工位及返修路径_增加"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@总成编号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@返修状态", RepairStatus); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@返修路径", RepairMethod); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@返修上线点", RepairOpName); + string result = Convert.ToString(DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)); + return result; + } + catch (Exception err) + { + return "0"; + } + + } + /// [电子看板_发动机号_线首工位_查询_根据发动机号] 20160728 majian + /// + /// + /// + static public bool GetEngineID_Select(string engineID, string opName, out DataTable dt) + { + string errorMessage = ""; + DataSet ds; + bool isOK; + dt = null; + //string connectionString = ApplicationConfig.ConnectionString; + string procedureName; + procedureName = "电子看板_发动机号_线首工位_查询_根据发动机号"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + isOK = DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out ds); + if (isOK) + { + if (ds.Tables.Count > 0) + { + dt = ds.Tables[0]; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + private string QualityDataButton_bgColor_Select_energineSelect() + { + string text = ""; + try + { + System.Data.DataTable dt = null; + //单号 + string energineID = HttpContext.Current.Request["energineID"]; + string opname = HttpContext.Current.Request["value"]; + QualityDataButton_bgColor_Select(opname, energineID, out dt);//此处重新写函数 + if (dt != null) + { + if (dt.Rows.Count >= 0) + { + text = Buttons.Createbuttons(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun02:QualityDataButton_bgColor_Select"); + } + return text; + + } + /// WEB根据工位名称和发动机号查询质量数据合格索引(包括了分线的信息、存储过程中根据工位类型区分) 20140626 wt + /// + /// + /// + /// + /// + public static bool QualityDataButton_bgColor_Select(string opname, string energineID, out DataTable dt) + { + string procedureName = "显示测量数据_工位号_根据发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + + /// + /// 获取对应工位的质量数据 + /// + /// + private string QualityDataSelectByEnergineID() + { + string qualitydata = ""; + try + { + System.Data.DataTable dt = null; + string energineID = HttpContext.Current.Request["value"]; + string opname = HttpContext.Current.Request["opname"]; + QualityDataSelect(opname, energineID, out dt); + if (dt != null) + { + //if (dt.Rows.Count > 0) + { + qualitydata = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, "MesWebFun10:QualityDataSelect"); + } + return qualitydata; + + } + + static public bool QualityDataSelect(string opname, string energineID, out DataTable dt) + { + string procedureName; + procedureName = "显示测量数据_根据_工位号_发动机型号_查询"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", energineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// 查询返修上线工位及返修路径数目 + /// + /// + /// + /// + public static void RepairBtnDataSelect(string OpName, out string BtnData, out int RouteNum) + { + + DataTable dt; + string procedureName; + BtnData = ""; + RouteNum = 0; + procedureName = "返修上线_返修工位_返修上线点及返修路径_基础配置_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + BtnData = dt.Rows[0]["待返修工位"].ToString(); + RouteNum = Convert.ToInt32(dt.Rows[0]["返修路径数目"]); + } + } + } + + + /// + /// 查询当前上线点上次选择的返修工位,用于界面按钮颜色原始数据 + /// + /// + /// + /// + public static bool selectRepairData(string OpName, out DataTable dt) + { + + string procedureName; + procedureName = "返修上线_返修工位及返修路径_最近数据_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + } + /// + /// + /// + /// + /// + /// + public static bool selectRepairStrSelect(string OpName, string selectID, out DataTable dt) + { + string procedureName; + procedureName = "返修上线_返修工位及返修路径_是否工作判断"; + SqlParameter[] sqlParameters = new SqlParameter[2]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@返修上线点", OpName); + sqlParameters[1] = new System.Data.SqlClient.SqlParameter("@发动机号", selectID); + DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + if (dt.Rows.Count > 0) + { + return true; + } + else + { + + return false; + } + + } + } +} diff --git a/Common/08WebFun_base/WebFun_base/SpecialFun/vssver2.scc b/Common/08WebFun_base/WebFun_base/SpecialFun/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..1146cc5219e830a937db6e043cbf9e393dcaa03c GIT binary patch literal 572 zcmXpJVq~~_m%l5bInsUAj6{**Nns)aFTNbz!NkD8&%nU26G*EcY&|;T_5^)KAb%H- zf8AWt_eTA6Fn>3YZ)xB9?1v_VzX!;lx-9pu#W@InFOa`J&Ho+8R|tO}kk3@EawKBI zG_d~tK)&9W;KUm*rh@qgfc%+1Qx5%@1>qkA@+CLL`0ikX@DBm`^Ixd%o)H4!9|rQ3 zl<&n$^iBcmKLX@$XZ5$PxD4SR1@dDoBKJlp&IZdL1M*Ea8J^ow4&fgM^4og+lso1@ z_$vCop26j*NpLE)I6O7Utu!w_xF9t-GciXWN&|%$ATr4%nfZAJhI+}xC;~?40w(AJ rrsx7@=mO^G0v2cjh6d;Y= + + + + Debug + AnyCPU + {90E76FB4-646D-45E2-95DB-0B8AB4E465D6} + Library + Properties + MesDataFunction + 09MesDataFunction + v4.8 + 512 + true + + + + true + full + false + ..\..\dll\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\..\dll_common\BasicData.dll + + + ..\..\..\dll_common\ConLink.dll + + + ..\..\..\dll_common\MesWork.DeviceDriver.dll + + + ..\..\..\dll_common\MesWork.PLC.dll + + + ..\..\..\dll_common\Monitor.MesWork.dll + + + ..\..\dll\MQTTnet.dll + + + ..\..\dll\MQTTnet.Extensions.ManagedClient.dll + + + False + ..\..\..\dll_common\Newtonsoft.Json.dll + + + ..\..\..\dll_common\NPOI.dll + + + ..\..\..\dll_common\NPOI.OOXML.dll + + + ..\..\..\dll_common\NPOI.OpenXml4Net.dll + + + ..\..\..\dll_common\NPOI.OpenXmlFormats.dll + + + ..\..\..\dll_common\Opc.Ua.Client.dll + + + ..\..\..\dll_common\Opc.Ua.Configuration.dll + + + ..\..\..\dll_common\Opc.Ua.Core.dll + + + ..\..\..\dll_common\OpcUaHelper.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + + + + + + + + + + + {f55da1a0-a982-4479-8c47-0d9a5aaf3e18} + 00MesWorkMqtt + + + {0d1af432-439a-4920-8692-43ae139f5530} + 01_01DoWhatPlc + + + {f434e066-4c59-47c8-aa82-6f48cc84501a} + 04-DataBaseAccess + + + {f0a0c525-03fd-428a-9b17-7f54aa0e4475} + 07BusinessFacade + + + {d98be764-adeb-488d-9714-61e308aa8201} + 08-WebFun_base + + + + + + + \ No newline at end of file diff --git a/Common/09MesDataFunction/MesDataFunction/LoadTagTypeCodeID.cs b/Common/09MesDataFunction/MesDataFunction/LoadTagTypeCodeID.cs new file mode 100644 index 0000000..102968a --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/LoadTagTypeCodeID.cs @@ -0,0 +1,128 @@ +//using BasicData; +//using MesWork; +//using OpcBasic; +using DoWhatPlc; +using MesServerWork; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesDataFunction +{ + public class LoadTagTypeCodeID + { + + + public static void Load(string path) + { + MIS_BASE.hashtable_TagType = new NameValueCollection(); + MIS_BASE.hashtable_TagTypeTagName = new NameValueCollection(); + MIS_BASE.hashtable_TagTypeChange = new NameValueCollection(); + MIS_BASE.hashtable_MesTagTypeChange = new NameValueCollection(); + MIS_BASE.hashtable_WebTagTypeChange = new NameValueCollection(); + MIS_BASE.hashtable_TagTypeDataType = new NameValueCollection(); + + var dt = NPOITest.ExeclHelper.ExcelToDataTable(path, "变量类型代码", true); + for (int i = 0; i < dt.Rows.Count; i++) + { + //序号 变量类型 TagTypeDataType TagName 变量类型代码 TagTypeChange MesTagTypeChange WebTagTypeChange 信号点名称 变量类型名称 + + var TagTypeDataType = dt.Rows[i]["TagTypeDataType"].ToString(); + var TagName = dt.Rows[i]["TagName"].ToString(); + var 变量类型代码 = dt.Rows[i]["变量类型代码"].ToString(); + var TagTypeChange = dt.Rows[i]["TagTypeChange"].ToString(); + var WebTagTypeChange = dt.Rows[i]["WebTagTypeChange"].ToString(); + var MesTagTypeChange = dt.Rows[i]["MesTagTypeChange"].ToString(); + + //OpcOperation.hashtable_TagType.Add(TagName, 变量类型代码); + //OpcOperation.hashtable_TagTypeTagName.Add(变量类型代码, TagName); + //OpcOperation.hashtable_TagTypeChange.Add(TagName, TagTypeChange); + //OpcOperation.hashtable_MesTagTypeChange.Add(TagName, MesTagTypeChange); + //OpcOperation.hashtable_WebTagTypeChange.Add(TagName, WebTagTypeChange); + //OpcOperation.hashtable_TagTypeDataType.Add(变量类型代码, TagTypeDataType); + if (!MIS_BASE.hashtable_TagType.AllKeys.Contains(TagName)) + MIS_BASE.hashtable_TagType.Add(TagName, 变量类型代码); + if (!MIS_BASE.hashtable_TagTypeTagName.AllKeys.Contains(变量类型代码)) + MIS_BASE.hashtable_TagTypeTagName.Add(变量类型代码, TagName); + if (!MIS_BASE.hashtable_TagTypeChange.AllKeys.Contains(TagName)) + MIS_BASE.hashtable_TagTypeChange.Add(TagName, TagTypeChange); + if (!MIS_BASE.hashtable_MesTagTypeChange.AllKeys.Contains(TagName)) + MIS_BASE.hashtable_MesTagTypeChange.Add(TagName, MesTagTypeChange); + if (!MIS_BASE.hashtable_WebTagTypeChange.AllKeys.Contains(TagName)) + MIS_BASE.hashtable_WebTagTypeChange.Add(TagName, WebTagTypeChange); + if (!MIS_BASE.hashtable_TagTypeDataType.AllKeys.Contains(变量类型代码)) + MIS_BASE.hashtable_TagTypeDataType.Add(变量类型代码, TagTypeDataType); + } + HashtableList.hashtable_TagTypeTagName_Temp = new Hashtable(); + foreach (string key in MIS_BASE.hashtable_TagTypeTagName.Keys) + { + HashtableList.hashtable_TagTypeTagName_Temp.Add(key, MIS_BASE.hashtable_TagTypeTagName[key]); + } + HashtableList.hashtable_TagTypeDataType_Temp = new NameValueCollection(); + foreach (string key in MIS_BASE.hashtable_TagTypeDataType.Keys) + { + HashtableList.hashtable_TagTypeDataType_Temp.Add(key, MIS_BASE.hashtable_TagTypeDataType[key]); + } + HashtableList.hashtable_TagType_Temp = new NameValueCollection(); + foreach (string key in MIS_BASE.hashtable_TagType.Keys) + { + HashtableList.hashtable_TagType_Temp.Add(key, MIS_BASE.hashtable_TagType[key]); + } + } + + public static void Load(DataTable dt) + { + MIS_BASE.hashtable_TagType = new NameValueCollection(); + MIS_BASE.hashtable_TagTypeTagName = new NameValueCollection(); + MIS_BASE.hashtable_TagTypeChange = new NameValueCollection(); + MIS_BASE.hashtable_MesTagTypeChange = new NameValueCollection(); + MIS_BASE.hashtable_WebTagTypeChange = new NameValueCollection(); + MIS_BASE.hashtable_TagTypeDataType = new NameValueCollection(); + + for (int i = 0; i < dt.Rows.Count; i++) + { + //序号 变量类型 TagTypeDataType TagName 变量类型代码 TagTypeChange MesTagTypeChange WebTagTypeChange 信号点名称 变量类型名称 + var TagTypeDataType = dt.Rows[i]["TagTypeDataType"].ToString(); + var TagName = dt.Rows[i]["TagName"].ToString(); + var 变量类型代码 = dt.Rows[i]["变量类型代码"].ToString(); + var TagTypeChange = dt.Rows[i]["TagTypeChange"].ToString(); + var WebTagTypeChange = dt.Rows[i]["WebTagTypeChange"].ToString(); + var MesTagTypeChange = dt.Rows[i]["MesTagTypeChange"].ToString(); + if (!MIS_BASE.hashtable_TagType.AllKeys.Contains(TagName)) + MIS_BASE.hashtable_TagType.Add(TagName, 变量类型代码); + if (!MIS_BASE.hashtable_TagTypeTagName.AllKeys.Contains(变量类型代码)) + MIS_BASE.hashtable_TagTypeTagName.Add(变量类型代码, TagName); + if (!MIS_BASE.hashtable_TagTypeChange.AllKeys.Contains(TagName)) + MIS_BASE.hashtable_TagTypeChange.Add(TagName, TagTypeChange); + if (!MIS_BASE.hashtable_MesTagTypeChange.AllKeys.Contains(TagName)) + MIS_BASE.hashtable_MesTagTypeChange.Add(TagName, MesTagTypeChange); + if (!MIS_BASE.hashtable_WebTagTypeChange.AllKeys.Contains(TagName)) + MIS_BASE.hashtable_WebTagTypeChange.Add(TagName, WebTagTypeChange); + if (!MIS_BASE.hashtable_TagTypeDataType.AllKeys.Contains(变量类型代码)) + MIS_BASE.hashtable_TagTypeDataType.Add(变量类型代码, TagTypeDataType); + } + HashtableList.hashtable_TagTypeTagName_Temp = new Hashtable(); + foreach (string key in MIS_BASE.hashtable_TagTypeTagName.Keys) + { + HashtableList.hashtable_TagTypeTagName_Temp.Add(key, MIS_BASE.hashtable_TagTypeTagName[key]); + } + HashtableList.hashtable_TagTypeDataType_Temp = new NameValueCollection(); + foreach (string key in MIS_BASE.hashtable_TagTypeDataType.Keys) + { + HashtableList.hashtable_TagTypeDataType_Temp.Add(key, MIS_BASE.hashtable_TagTypeDataType[key]); + } + HashtableList.hashtable_TagType_Temp = new NameValueCollection(); + foreach (string key in MIS_BASE.hashtable_TagType.Keys) + { + HashtableList.hashtable_TagType_Temp.Add(key, MIS_BASE.hashtable_TagType[key]); + } + } + + } + +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/InitTagValueListData.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/InitTagValueListData.cs new file mode 100644 index 0000000..0d66024 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/InitTagValueListData.cs @@ -0,0 +1,84 @@ +//using DataLinkMesWork; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +//using SystemFramework; + +namespace MesServerWork +{ + public class InitTagValueListData + { + public InitTagValueListData() + { + DataTable dt = ReadMesServerData(); + + InitMesReadTagKey(); + initAllItemValue(dt); + } + + DataTable ReadMesServerData() + { + return null;// MesWork.PlcLinkForm.dt_BasicData.Select($"是否启用 = 1 and 监控属性代码 = '{1}'").CopyToDataTable(); + } + + void InitMesReadTagKey() + { + DataTable dt = null;// MesWork.PlcLinkForm.dt_BasicData.Select($"是否启用 = 1 and 变量类型代码=19 and 监控属性代码 = '{1}'").CopyToDataTable(); ; + + for (int i = 0; i < dt.Rows.Count; i++) + { + if (MesReadTagKey_Hash.ContainsKey(dt.Rows[i]["工位号"].ToString())) + { + MesReadTagKey_Hash[dt.Rows[i]["工位号"].ToString()] = dt.Rows[i]["TagID"].ToString(); + } + else + { + MesReadTagKey_Hash.Add(dt.Rows[i]["工位号"].ToString(), dt.Rows[i]["TagID"].ToString()); + } + + } + + } + void initAllItemValue(DataTable dt) + { + for (int i = 0; i < dt.Rows.Count; i++) + { + if (ItemValue_Hash.ContainsKey(dt.Rows[i]["TagID"])) + { + if (Convert.ToInt32(dt.Rows[i]["列位置"]) != 0) + { + ItemValue_Hash[dt.Rows[i]["TagID"]] = dt.Rows[i]["测量项目"].ToString() + "(" + dt.Rows[i]["列位置"].ToString() + ")"; + } + else + { + ItemValue_Hash[dt.Rows[i]["TagID"]] = dt.Rows[i]["测量项目"].ToString(); + } + + } + else + { + if (Convert.ToInt32(dt.Rows[i]["列位置"]) != 0) + { + ItemValue_Hash[dt.Rows[i]["TagID"]] = dt.Rows[i]["测量项目"].ToString() + "(" + dt.Rows[i]["列位置"].ToString() + ")"; + } + else + { + ItemValue_Hash[dt.Rows[i]["TagID"]] = dt.Rows[i]["测量项目"].ToString(); + } + } + + } + + + } + + + + public static Hashtable MesReadTagKey_Hash = new Hashtable(); + public static Hashtable ItemValue_Hash = new Hashtable(); + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.Barcode.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.Barcode.cs new file mode 100644 index 0000000..1df2dfe --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.Barcode.cs @@ -0,0 +1,95 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +//using MesWork; +//using SystemFramework; +using bizFacade; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + static object lockerBarcode = new object(); + + /// + ///1.扫描配送单号,用于接收物料,扫描单号的时候,将接收的物料信息显示在“物料拉动”Tab区域 + ///2.扫描料箱标签/看板卡,用于追溯物料批次信息 + ///3.扫描零件条码,根据零件图号进行防错 + ///第一步,判断条码类型,根据条码类型,执行对应的存储过程 + ///第二步,条码类型(将扫描的条码保存到对应的表中) + ///第三步,扫描完成之后给出允许工作信号 + /// 处理页面扫描条码 + /// + /// + /// + static public void Barcode(object e) + { + lock (lockerBarcode) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + string barcode = Convert.ToString(msgEvent.TagValue); + string AlarmStr = ""; + + int IsAllowWork; + bool IsSuccess = false; + bool EngineGetOver_PLC_NextWorkStep; + //传递机型是否到位 + MIS_BASE.Read_EngineGetOver_PLC(OpName, out EngineGetOver_PLC_NextWorkStep); + + BaseDataSystemMES.PartMaterial_DM_Update(OpName, barcode, out IsSuccess); + if (!IsSuccess) + { + AsyncSendMessage_Notice(OpName, "条码无效,请确认"); + return; + } + else + { + SendInfomation("MaterialList", "1", OpName);//通知界面更新零件信息 + } + + + + //获取是否允许工作 + BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + + //此处逻辑有问题 需要考虑到批次扫描 提示PLC未传递机型的情况 + if (EngineGetOver_PLC_NextWorkStep && IsSuccess) + { + if (IsAllowWork == 1) + { + BaseDataSystemMES.Material_Insert(OpName, 1); + + //if (!BaseDataSystemMES.QualityVerifyStatusOutline(OpName, out AlarmStr)) + //{ + // SendInfomation("LineoutAlert", AlarmStr, OpName); + // return; + //} + //通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + } + else + { + AsyncSendMessage_Notice(OpName, "PLC未传递机型"); + } + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:Barcode"); + } + } + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.ConfirmOkGo.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.ConfirmOkGo.cs new file mode 100644 index 0000000..26b9cfa --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.ConfirmOkGo.cs @@ -0,0 +1,47 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +//using MesWork; +//using SystemFramework; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + static object lockerConfirmOkGo = new object(); + + static public void ConfirmOkGo(object e) + { + lock (lockerConfirmOkGo) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + + //BaseDataSystemMES.Material_Insert(OpName, 1); + + //更新订单完工数量及物料 + Sendmessage("24", "11", OpName); + + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:ConfirmOkGo"); + } + } + + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.EngineTypeGetOver_PLC_Work.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.EngineTypeGetOver_PLC_Work.cs new file mode 100644 index 0000000..670819c --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.EngineTypeGetOver_PLC_Work.cs @@ -0,0 +1,139 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +//using MesWork; +//using SystemFramework; +using bizFacade; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + static object lockerEngineTypeGetOver_PLC_Work = new object(); + + + static public void EngineTypeGetOver_PLC_Work(string OpName, int EngineTypeID, string EngineType, string EngineID, int PartPallet_Code,string OrderForm) + { + lock (lockerEngineTypeGetOver_PLC_Work) + { + int IsAllowWork; + int RepairPartStatusPLC = 0; + int MES_QualityMask = 1; + //string OrderForm = "";//订单号 + DataTable dt; + + if (EngineTypeID <= 0) + { + AsyncSendMessage_Notice(OpName, "PLC传递机型为空"); + return; + } + + //第一步,查询订单号,保存机型、机型代码、总成号、托盘号、订单号到数据库 + BaseDataSystemMES.GetEngineID_Select(OpName, EngineID, out dt); + if (dt != null && dt.Rows.Count > 0) + { + OrderForm = Convert.ToString(dt.Rows[0]["订单号"]); + } + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, OrderForm, EngineTypeID, EngineType, EngineID, PartPallet_Code, 0, 0, ""); + SaveMobyMessage(OpName, EngineTypeID, EngineType, EngineID, OrderForm); + + //第二步,将零件信息转移到零件_临时表中(本地BOM与订单BOM的选择显示关系) + BaseDataSystemMES.MesServer_Process_EngineTypeOver(OpName); + + //通知web显示 + Sendmessage("5123", "1111", OpName); + MIS_BASE.Read_PalletInfo(OpName, out MES_QualityMask);//合格标志 + MIS_BASE.Read_RepairStatus_PLC(OpName, out RepairPartStatusPLC);//返修标志 + SendInfomation("QualityMask", Convert.ToString(MES_QualityMask), OpName);//显示合格标志 + SendInfomation("RepairPartStatusPLC", Convert.ToString(RepairPartStatusPLC), OpName);//显示返修标志 + + if (MES_QualityMask == 2) + { + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + SendInfomation("NgGO", "1", OpName);//显示不合格标志 + return; + } + + + //第三步,用于工件离开后完工数量统计及工件编号追溯 + BaseDataSystemMES.MaterialPush_EngineIDStatus_Insert(OpName);//更新订单产量 + + //第四步,获取是否允许工作 + BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + + //暂时先定义为扫描完成才能进行压装工作,因为考虑到工作完成后,操作工未必会去扫描物料的情况 + if (IsAllowWork == 1) + { + //通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + } + + + } + + /// + /// 保存MOBY信息 + /// + /// + /// + /// + /// + static private void SaveMobyMessage(string OpName, int engineTypeID, string engineType, string engineID, string orderForm) + { + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_EngineTypeID[OpName] = engineTypeID; + } + if (MIS_BASE.hashtable_EngineGetOver_EngineType.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_EngineType[OpName] = engineType; + } + if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_EngineID[OpName] = engineID; + } + if (MIS_BASE.hashtable_EngineGetOver_OrderForm.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_OrderForm[OpName] = orderForm; + } + } + + /// + /// 返修件需要工作 + /// + /// 工位号 + static private void IsNeedRepaire_OK(string OpName) + { + string orderForm = ""; + int engineTypeID; + string engineType = ""; + string engineID = ""; + string palletCode = ""; + int isRepair; + string repairCode = ""; + //从监控系统中查询出本工位信息 + BaseDataSystemMES.OpName_MIS_Moby_Select(OpName, + out orderForm, out engineTypeID, out engineType, + out engineID, out palletCode, out isRepair, out repairCode); + + EngineTypeGetOver_PLC_Work(OpName, engineTypeID, engineType, engineID, Convert.ToInt32(palletCode),orderForm); + } + + + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.FalseGO.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.FalseGO.cs new file mode 100644 index 0000000..92ee314 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.FalseGO.cs @@ -0,0 +1,48 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +//using MesWork; +//using SystemFramework; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + static object lockerFalseGO = new object(); + + + static public void FalseGO(object e) + { + lock (lockerConfirmOkGo) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + //总合格标志2(不合格) + + //BaseDataSystemMES.Material_Insert_NG(OpName, 2); + + Sendmessage("24", "11", OpName); + + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.Material_Insert.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.Material_Insert.cs new file mode 100644 index 0000000..fc78eb6 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.Material_Insert.cs @@ -0,0 +1,59 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +//using MesWork; +//using SystemFramework; +using bizFacade; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + static object lockerMaterial_Insert = new object(); + + static public void Material_Insert(string OpName) + { + lock (lockerMaterial_Insert) + { + try + { + //int tagValue = Convert.ToInt32(msgEvent.TagValue); + int IsAllowWork; + //第四步,获取是否允许工作 + BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + bool EngineGetOver_PLC_NextWorkStep; + //传递机型是否到位 + MIS_BASE.Read_EngineGetOver_PLC(OpName, out EngineGetOver_PLC_NextWorkStep); + + //暂时先定义为扫描完成才能进行压装工作,因为考虑到工作完成后,操作工未必会去扫描物料的情况 + if (EngineGetOver_PLC_NextWorkStep&&IsAllowWork == 1) + { + BaseDataSystemMES.Material_Insert(OpName, 1); + + //更新订单完工数量及物料 + Sendmessage("24", "11", OpName); + + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + //通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:ConfirmOkGo"); + } + } + + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.MesReadOver.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.MesReadOver.cs new file mode 100644 index 0000000..260cd1a --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.MesReadOver.cs @@ -0,0 +1,66 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +//using MesWork; +//using SystemFramework; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + static object lockerMesReadOver = new object(); + + /// + /// 保存完成(针对半自动和手动压装工位) + /// + /// + /// + static public void MesReadOver(object e) + { + lock (lockerMesReadOver) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + var tagValue = msgEvent.TagValue.ToString(); + + if (tagValue == "1" | tagValue.ToLower() == "true") + { + int qualityMask; + MIS_BASE.Read_QualityMask(OpName, out qualityMask); + + SendInfomation("ShowTimelyQuality", "1&" + qualityMask.ToString(), OpName);//发给Web页面显示质量数据 + + if (qualityMask == 1)//全部OK,给出合格放行 + { + //如果存在线外扫描工位,根据扫描条码绑定线外数据 需要时解除禁用 + //BaseDataSystemMES.TransLaunchDataByMainMaterial(OpName, EngineType, EngineID, EngineTypeID); + + //如果存在线外排队工位,根据排队编号绑定线外数据 需要时解除禁用 + ////BaseDataSystemMES.MailLineAndSubLineData_InsertByEngineID_Subline(OpName,EngineID, EngineTypeID, EngineType); + + MIS_BASE.Write_ConfirmOkGo(OpName, true); + //MIS_BASE.Write_FalseGO(OpName, false); + } + else + { + //MIS_BASE.Write_ConfirmOkGo(OpName, false); + MIS_BASE.Write_FalseGO(OpName, true); + } + + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:MesReadOver"); + } + } + + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.SendMessage.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.SendMessage.cs new file mode 100644 index 0000000..92bfe0a --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.SendMessage.cs @@ -0,0 +1,162 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +//using MesWork; +//using SystemFramework; +using bizFacade; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + + /// + /// 发送提示消息 + /// + /// + static private void AsyncSendMessage_Notice(string opname, string notice) + { + //通知Web界面 + BaseDataSystemMES.Web_Notice_Insert(opname, notice); + string SendMessage = "MES|Notice|" + opname + "|" + "1"; + MIS_BASE.asyncSendMessage(SendMessage); + } + + /// + /// 向WEB发送信息(value为字符串) + /// + /// 消息种类 + /// 消息内容 + /// 工位号 + static public string SendInfomation(string Command, string Value, string OpName) + { + string SendMessage = "MES|" + Command + "|" + OpName + "|" + Value; + return AsyncSendMessage(SendMessage); + } + + /// + /// 发送信息到MES通讯服务器或者其他的 + /// + /// + static private string AsyncSendMessage(string Message) + { + return MIS_BASE.asyncSendMessage(Message); + } + + + /// + /// 批量发送WEB消息(Value为BOOL值) + /// + /// 消息编号组合 + /// 消息值组合 + /// 工位号 + static void Sendmessage(string MessageNumm, string Value, string OpName) + { + for (int i = 0; i < MessageNumm.Length; i++) + { + Sendmessage(MessageNumm[i], Value[i].ToString(), OpName); + + } + } + /// + /// 选择发送给WEB的消息 + /// + /// 消息类型 + /// 消息工位 + static string Sendmessage(char Num, string Value, string OpName) + { + string SendMessage; + string result = ""; + switch (Num) + { + case '1': + //1(直接在界面通过选择机型确认工序内容) + SendMessage = "MES|ProcessList|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '2': + //2显示物料 + SendMessage = "MES|MaterialList|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '3': + //3显示操作指导图片 + SendMessage = "MES|PicShow|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '4': + //4订单完工模块刷新完成数量 + SendMessage = "MES|OrderFormList|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case '5': + SendMessage = "MES|ShowMoby|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '6': + SendMessage = "MES|MaterialCheckPosition|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '7': + SendMessage = "MES|WorkStart|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '8'://清除MES生成编号 + + break; + case '9': + SendMessage = "MES|ConfirmOkGo|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case 'a': + SendMessage = "MES|FixAllow|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + } + return result; + } + ///// + ///// 向WEB发送信息(value为字符串) + ///// + ///// 消息种类 + ///// 消息内容 + ///// 工位号 + //string SendInfomation(string Command, string Value, string OpName) + //{ + // string SendMessage = "MES|" + Command + "|" + OpName + "|" + Value; + // return AsyncSendMessage(SendMessage); + //} + + + /// + /// 发送在线产量、在线节拍 + /// + /// + /// + private void SendActuallyCount(string OpName, int tagValue) + { + //当工件离开时,更新在线产量、在线节拍 + if (tagValue == 0) + { + try + { + int opNameCount = 0;//在线产量 + int opNameCountTime = 0;//在线节拍 + //基本数据_工作日历_班次产量查询_New + BaseDataSystemMES.OpNameCount_New(OpName, out opNameCount, out opNameCountTime); + string SendMessage; + SendMessage = "MES|ActuallyCount|" + OpName + "|" + opNameCount.ToString() + "&" + opNameCountTime.ToString(); + AsyncSendMessage(SendMessage); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:SendActuallyCount"); + } + } + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.WebSubmit.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.WebSubmit.cs new file mode 100644 index 0000000..e472489 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.WebSubmit.cs @@ -0,0 +1,282 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +//using MesWork; +//using SystemFramework; +using System.Threading; +using bizFacade; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + static object lockerWebSubmit = new object(); + + + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + static public void WebSubmit(object e) + { + lock (lockerWebSubmit) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + string Content = Convert.ToString(msgEvent.TagValue); + + string[] dataArray = Content.Split('|'); + if (dataArray.Length != 2) + return; + //消息类型 + string m_Command = dataArray[0].ToString(); + //消息参数 + string m_Value = dataArray[1].ToString(); + //消息参数数量 + string[] m_Value_array = m_Value.Split('&'); + //消息参数长度 + int m_Value_length = m_Value_array.Length; + + //工件信息 + string engineID = ""; + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName)) + { + engineID = MIS_BASE.hashtable_EngineGetOver_EngineID[OpName].ToString(); + } + + DoWhatPlc.CustomeEvetnArgs _e = new DoWhatPlc.CustomeEvetnArgs(); + _e.OpName = OpName; + _e.TagValue = m_Value; + + //根据请求的命令处理逻辑 + switch (m_Command) + { + case "Barcode": + if (m_Value_length > 1) return; + fun_Barcode(_e); + break; + case "ConfirmOkGo"://合格放行 + //删除不合格放行记录 + //修改托盘状态 + //Update_PalletStatus(OpName, 1, false); + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID); + MIS_BASE.Write_ConfirmOkGo(OpName, true); + MIS_BASE.Write_FalseGO(OpName, false); + break; + case "FalseGO"://返修放行 + //修改托盘状态 + //Update_PalletStatus(OpName, 3, false); + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID); + MIS_BASE.Write_FalseGO(OpName, true); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + break; + case "NgGO"://不合格放行 + //修改托盘状态 + //Update_PalletStatus(OpName, 2, false); + //保存不合格信息(必须保存不合格放行信息,由于B5A的Moby没有不合格标志位) + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Insert(OpName, engineID, "", ""); + MIS_BASE.Write_FalseGO(OpName, true); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + break; + case "OnLineState"://在线0、离线1、屏蔽2 + try + { + if (m_Value_length > 1) return; + int a = Convert.ToInt32(m_Value); + if (a <= 2) + { + BaseDataSystemMES.IsOnLine_Update(OpName, m_Value.ToString()); + MIS_BASE.Write_OnLineState(OpName, Convert.ToInt32(m_Value)); + } + } + catch + { + + } + break; + case "Reset"://复位,将MES所有的信息都复位了 + SetMoby(OpName);//将MES所有信号清空 + break; + case "FixAllow"://重新拧紧 + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_FixAllow(OpName, true); + break; + case "IsAutoGetEngineID"://自动手动申请编号(线首) + if (m_Value_length > 1) return; + MIS_BASE.Write_IsAutoGetEngineID(OpName, Convert.ToInt32(m_Value)); + break; + case "PartPalletGoOver"://空托盘放行 + int Is_PartPalletGoOver; + MIS_BASE.Read_PartPalletGoOver(OpName, out Is_PartPalletGoOver); + if (Is_PartPalletGoOver == 1) + { + MIS_BASE.Write_PartPalletGoOver(OpName, 1); + } + else + { + MIS_BASE.Write_PartPalletGoOver(OpName, 0); + } + break; + case "SetMoby"://清空托盘(线首) + SetMoby(OpName);//将MES所有信号清空 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "RepairUplineMES"://返修上线 + MIS_BASE.Write_RepairUpline_MES(OpName, true); + break; + case "CancelRepair"://将返修件置为正常件 + + break; + case "PartPalletCode"://申请写入托盘号 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "WritePartPalletCode"://写入托盘号 + if (m_Value_length > 1) return; + MIS_BASE.Write_PalletCode(OpName, Convert.ToInt32(m_Value)); + break; + case "Normal"://启用正常拧紧工位 + MIS_BASE.Write_Normal(OpName, 1); + MIS_BASE.Write_UnNormal(OpName, 0); + break; + case "UnNormal"://启用备用拧紧工位 + MIS_BASE.Write_Normal(OpName, 0); + MIS_BASE.Write_UnNormal(OpName, 1); + break; + case "ResetDevice"://复位设备 + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + break; + case "IsNeedRepaire"://返修上线(返修上线点) + if (Convert.ToInt32(m_Value) == 1) + { + //修改托盘状态 + MIS_BASE.Write_PalletInfo(OpName, 3); + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + IsNeedRepaire_OK(OpName); + + } + else if (Convert.ToInt32(m_Value) == 0) + { + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + //直接给出工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + else + { } + + break; + case "ContinueMatch": + BaseDataSystemMES.QualityVerifyStatus_Hash_Write(OpName, true); + break; + //初始化网页信号 + case "IniSingalToWeb": + InitializeSingalToWeb(OpName); + break; + case "Reset_Engine"://返修上线(返修上线点) + SetMoby(OpName);//将MES所有信号清空 + //fun_EngineTypeGetOverPLC(OpName, 0); + //fun_EngineTypeGetOverPLC(OpName, 1); + break; + + + default: break; + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:WebSubmit"); + } + } + + } + + //1.工件到位后,PLC给MES传递机型(DBX0.4)(44), + //MES判断条码是否全部扫描完成 + //PLC给出允许保存(DBX100.2)(19),MES见到(DBX100.2)(19)为1后给出保存完成(DBX102.2)(20), + //PLC见到保存完成(DBX102.2)(20)为1后,清空允许保存(DBX100.2)(19), + //MES见到允许保存(DBX100.2)(19)为0后,清空保存完成(DBX102.2)(20) + //MES判断总合格标志(INT104)(21)为1后,给出合格放行(DBX2.5)(51) + /// + /// 扫描条码 + /// + /// + /// + static public void fun_Barcode(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(Barcode, e); + } + static private void SetMoby(string OpName) + { + try + { + //清空Moby时,需要将MES信号清空 + MIS_BASE.Write_ClearMesMoby(OpName); + + BaseDataSystemMES.MesServer_Process_EngineTypeOver(OpName); + + Sendmessage("5123", "1111", OpName); + + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + } + catch + { + + } + } + /// 网页重现登录,恢复关闭前的页面状态 + /// + /// 工位号 + static private void InitializeSingalToWeb(string Opname) + { + + //工件到位 DBX0.1 + bool S_WorkStart; + bool S_FixAllow; + bool S_EngineGetOver; + bool S_MaterialVerifyOver; + + MIS_BASE.Read_WorkStart(Opname, out S_WorkStart); + MIS_BASE.Read_FixAllow(Opname, out S_FixAllow); + MIS_BASE.Read_EngineGetOver_PLC(Opname, out S_EngineGetOver); + MIS_BASE.Read_MaterialVerifyOver(Opname, out S_MaterialVerifyOver); + + + + if (S_WorkStart == true) + { + SendInfomation("WorkStart", Convert.ToString(Convert.ToInt32(S_WorkStart)), Opname); + } + + if (S_EngineGetOver == true) + { + + SendInfomation("EngineTypeGetOverPLC", Convert.ToString(Convert.ToInt32(S_EngineGetOver)), Opname); + Sendmessage("5123", "1111", Opname); + } + if (S_FixAllow == true) + { + SendInfomation("FixAllow", Convert.ToString(Convert.ToInt32(S_FixAllow)), Opname); + } + if (S_MaterialVerifyOver == true) + { + SendInfomation("MaterialVerifyOver", Convert.ToString(Convert.ToInt32(S_MaterialVerifyOver)), Opname); + } + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.WorkStart.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.WorkStart.cs new file mode 100644 index 0000000..ec1d4c4 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.WorkStart.cs @@ -0,0 +1,45 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +////using bizFacade; +using System.Collections.Specialized; +//using MesWork; +//using SystemFramework; +using System.Threading; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + static object lockerWorkStart = new object(); + + + + /// + /// 工件到位与离开时,清空MES自身信号 + /// + /// + /// + static private void WorkStart(object e) + { + lock (lockerWorkStart) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:WorkStart"); + } + } + + } + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Hashtable.TagID.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Hashtable.TagID.cs new file mode 100644 index 0000000..4f7074b --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Hashtable.TagID.cs @@ -0,0 +1,806 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +//using MesWork; +using bizFacade; +using DoWhatPlc; +using MesWork; + +namespace MesServerWork +{ + public partial class MIS_BASE // : Form + { + /// + /// 全部数据列表 + /// + public static DataTable BasicDataTagValue; + /// + /// MES_基本数据_测量范围 + /// + public static DataTable BasicDataTagValueUpDown; + /// + /// 是否通过监控系统保存数据 + /// 1:通过监控系统保存采集的质量数据;0:不通过监控系统保存采集的质量数据 + /// + static public Hashtable hashtable_tagTable_OpName_SaveData; + /// + /// 变量代码与列位置 + /// + static public Hashtable hashtable_tagTable_TagID_TagOrderBy; + /// + /// 变量代码与变量排序 + /// + static public Hashtable hashtable_tagTable_TagID_TagItemOrderBy; + /// + /// 变量代码与变量特点 + /// 0:没定义1:工位合格标志2:需要合格标志的测量数据3:每个工位的合格标志4:物料5:IQA码6:压装数据7:压装合格标志8:(自动拧紧)工位合格标志 + /// + static public Hashtable hashtable_tagTable_TagID_TagProperty; + /// + /// 发动机类型转换表 + /// SELECT ID,发动机机型代码 FROM MES_计划BOM_发动机型号代码 + /// + public static Hashtable hashtable_EngineTypeID; + + /// + /// 工位号与工位上下线类型 + /// (0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + /// (5分线上线 总线)(6分线上线 分线) + /// + public static Hashtable hashtableOpName_OpType; + /// + /// 工位号与大屏幕代码 + /// 对应LED大屏幕(1,2,3,4) + /// + public static Hashtable hashtableOpName_LedID; + /// + /// 大屏幕显示产量端口(41104) + /// + public static Hashtable hashtableOpName_LedID_Port; + + /// + /// 大屏幕显示Andon大屏幕代码 1 + /// + public static Hashtable hashtableOpName_AndonID; + + /// + /// 大屏幕显示Andon端口 (41105) + /// + public static Hashtable hashtableOpName_AndonID_Port; + + + /// + /// 是否有打印机(0,1) + /// + public static Hashtable hashtableOpName_IsPrinter; + + /// + /// 打印机通讯端口 + /// + public static Hashtable hashtableOpName_IsPrinter_Port; + + + + /// + /// 工位号与目标循环时间 + /// + public static Hashtable hashtableOpName_TargetTime; + /// + /// 工位号与线体类型 + /// + public static Hashtable hashtableOpName_LineType; + /// + /// 是否有工位计算机 + /// + public static Hashtable hashtableOpName_IsHaveComputer; + /// + /// 变量名称 + /// + public static Hashtable hashtableTagID_TagName; + /// + /// 工位号 + /// + public static Hashtable hashtableTagID_OpName; + /// + /// 数据来源 + /// + public static Hashtable hashtableTagID_OpNameFrom; + + /// + /// 工位名称 + /// + static Hashtable hashtableTagID_OpName_Name; + /// + /// 测量位置 + /// + public static Hashtable hashtableTagID_ShaftID; + /// + /// 测量项目 + /// + public static Hashtable hashtableTagID_ItemVale; + /// + /// 变量代码与变量类型 + /// + public static Hashtable hashtable_tagTable_TagID_TagTypeID_All; + + + + /// + ///工位号与机床状态 + /// [测量数据机床状态] + /// + public static Hashtable m_MachineStatus_OpName; + /// + ///工位号与工件离开 1->0 =0 无工件或工件离开 + ///工位号与工件到位 0->1 =1 有工件或工件到达 + ///[测量数据发动机在线状态] + /// + public static Hashtable m_WorkStart_OpName; + + /// + ///工位号与工件到位时间 + ///工位号与工件到位 0->1 + ///[测量数据发动机在线状态] + /// + public static Hashtable m_WorkStart_OpName_Time; + + /// + ///工位号与工件到位时间 + ///工位号与工件到位 0->1,零件运动方向 + /// + public static Hashtable m_WorkStart_OpName_PartMoveDirection; + + + /// + ///工位号与发动机号 + /// + public static Hashtable m_EngineTrace_OpName; + /// + ///工位号与发动机号_时间 + /// + public static Hashtable m_EngineTrace_OpName_Time; + /// + ///工位号与合格标志 + ///[测量数据发动机在线状态] + /// + public static Hashtable m_QualityMask_OpName; + + /// + ///工位号与机型 + ///[测量数据发动机在线状态] + /// + public static Hashtable m_EngineNumberType_OpName; + /// + ///工位号与发动机号 + ///[测量数据发动机在线状态] + /// + public static Hashtable m_EngineNumber_OpName; + + /// + ///工位号与订单号 + ///[测量数据发动机在线状态] + /// + public static Hashtable m_OrderForm_OpName; + /// + ///工位号与操作者工号 + ///[测量数据发动机在线状态] + /// + public static Hashtable m_OperatorCode_OpName; + + + /// + /// 测量合格标志 + /// 全部测量数据的测量工位 + /// 全部测量数据的测量工位的数据来源 + /// 全部测量数据的测量工位的数据来源的测量变量 + /// + public static Hashtable hashtable_QualityData_GoodBad_MIS_OpName; + /// + /// 列位置 + /// + public static Hashtable hashtable_QualityData_GoodBad_Index; + + /// + /// MesServerCode + /// + public static Hashtable hashtable_MesServerCode; + /// + /// MesDll + /// + public static Hashtable hashtable_MesDll; + /// + /// 各个工位是否允许工作 + /// + public static Hashtable hashtable_IsAllowWork; + + /// + /// 返修工位是否需要强制合格放行 + /// //20141104 ljl + /// + public static Hashtable hashtable_IsConfirmOkGo; + + + /// + /// 工步属性哈西表 + /// + public static Hashtable hashtable_workStepProperty; + + /// + /// 工作顺序哈西表 + /// + public static Hashtable hashtable_WorkGroupIndex; + + /// + /// 返修工位哈西表 + /// + public static Hashtable hashtable_OpNameRepair; + + /// + /// 记录工件到位的发动机机型代码 + /// + public static Hashtable hashtable_EngineGetOver_EngineTypeID; + /// + /// 记录工件到位的发动机机型 + /// + public static Hashtable hashtable_EngineGetOver_EngineType; + /// + /// 记录工件到位的发动机号 + /// + public static Hashtable hashtable_EngineGetOver_EngineID; + /// + /// 记录工件到位的订单号 + /// + public static Hashtable hashtable_EngineGetOver_OrderForm; + + /// + /// 拧紧/压装过程中的合格标志 + /// + public static Hashtable hashtable_QualityMesRead; + + + /// + /// 物料检测哈希表 + /// + public static Hashtable hashtable_CheckMaterial; + + /// + /// 托盘状态哈希表 + /// + public static Hashtable hashtable_PalletInfo; + /// + ///[测量数据机床状态_分拆统计] + ///各个工位机床上电开始时间 + ///机床上电产生 0->1 + ///机床上电解除 1->0 + /// + public static Hashtable m_MachineStatusPutOn_OpName_Time; + /// + ///[测量数据机床状态_分拆统计] + ///各个工位循环开始 开始时间 + ///循环开始产生 0->1 + ///循环开始解除 1->0 + /// + public static Hashtable m_MachineStatusWorkOn_OpName_Time; + /// + ///[测量数据机床状态_分拆统计] + ///各个工位机床故障开始时间 + ///机床故障产生 0->1 + ///机床故障解除 1->0 + /// + public static Hashtable m_MachineStatusAlarm_OpName_Time; + /// + ///[测量数据机床状态_分拆统计] + ///各个工位上料无件开始时间 + ///上料无件产生 0->1 + ///上料无件解除 1->0 + /// + public static Hashtable m_MachineStatusNoPart_OpName_Time; + /// + ///[测量数据机床状态_分拆统计] + ///各个工位下料堵塞开始时间 + ///下料堵塞产生 0->1 + ///下料堵塞解除 1->0 + /// + public static Hashtable m_MachineStatusBlock_OpName_Time; + + /// + ///工位号与托盘离开 1->0 + ///工位号与托盘到位 0->1 + ///[测量数据_监控系统_托盘到位] + /// + public static Hashtable m_PartPalletStatus_OpName; + /// + ///工位号与托盘离开 1->0 + ///工位号与托盘到位 0->1 + ///[测量数据_监控系统_托盘到位] + /// + public static Hashtable m_PartPalletStatus_OpName_Time; + /// + /// 托盘到位(1)托盘离开(0) (DBX101.7)(13) + /// + /// + /// + + /// + ///[测量数据机床状态_分拆统计] + ///各个工位机床上电开始时间 + ///机床上电产生 0->1 + ///机床上电解除 1->0 + /// + public static Hashtable m_MachineStatusPutOn_OpName; + /// + ///[测量数据机床状态_分拆统计] + ///各个工位循环开始 开始时间 + ///循环开始产生 0->1 + ///循环开始解除 1->0 + /// + public static Hashtable m_MachineStatusWorkOn_OpName; + /// + ///[测量数据机床状态_分拆统计] + ///各个工位机床故障开始时间 + ///机床故障产生 0->1 + ///机床故障解除 1->0 + /// + public static Hashtable m_MachineStatusAlarm_OpName; + /// + ///[测量数据机床状态_分拆统计] + ///各个工位上料无件开始时间 + ///上料无件产生 0->1 + ///上料无件解除 1->0 + /// + public static Hashtable m_MachineStatusNoPart_OpName; + /// + ///[测量数据机床状态_分拆统计] + ///各个工位下料堵塞开始时间 + ///下料堵塞产生 0->1 + ///下料堵塞解除 1->0 + /// + public static Hashtable m_MachineStatusBlock_OpName; + + public static NameValueCollection hashtable_TagTypeDataType ; + public static NameValueCollection hashtable_TagType; + /// + /// 托盘代码(DBB86)(80) + /// + /// + /// + + /// + /// 创建MesServerCode哈西表 + /// + static public void InitHashtable_MesServerCode() + { + hashtable_MesServerCode = new Hashtable(); + hashtable_IsAllowWork = new Hashtable(); + hashtable_WorkGroupIndex = new Hashtable(); + hashtable_EngineGetOver_EngineTypeID = new Hashtable(); + hashtable_EngineGetOver_EngineType = new Hashtable(); + hashtable_EngineGetOver_EngineID = new Hashtable(); + hashtable_EngineGetOver_OrderForm = new Hashtable(); + hashtable_QualityMesRead = new Hashtable(); + hashtable_CheckMaterial = new Hashtable(); + hashtable_PalletInfo = new Hashtable(); + hashtable_IsConfirmOkGo = new Hashtable(); + hashtable_MesDll = new Hashtable(); + + string OpName; + string MesServerCode; + string MesDll; + string workStepProperty; + string OpNameRepair; + DataTable dt; + dt = BaseDataSystemMES.GetMesServerCodeFromMIS(); + if (dt != null) + { + for (int i = 0; i < dt.Rows.Count; i++) + { + OpName = dt.Rows[i]["工位号"].ToString(); + MesServerCode = dt.Rows[i]["MesServerCode"].ToString(); + MesDll = dt.Rows[i]["MesDll"].ToString(); + hashtable_MesDll.Add(OpName, MesDll); + hashtable_MesServerCode.Add(OpName, MesServerCode); + hashtable_IsAllowWork.Add(OpName, 1); + hashtable_IsConfirmOkGo.Add(OpName, 0);//20141104 ljl + hashtable_PalletInfo.Add(OpName, 0);//20141104 ljl + hashtable_WorkGroupIndex.Add(OpName, 1); + hashtable_EngineGetOver_EngineTypeID.Add(OpName, 0); + hashtable_EngineGetOver_EngineType.Add(OpName, ""); + hashtable_EngineGetOver_EngineID.Add(OpName, ""); + hashtable_EngineGetOver_OrderForm.Add(OpName, ""); + hashtable_QualityMesRead.Add(OpName, 0); + hashtable_CheckMaterial.Add(OpName, new bool[16]); + } + } + DoWhatPlc.HashtableList.hashtable_MesServerCode_Temp = hashtable_MesServerCode; + DoWhatPlc.HashtableList.hashtable_MesDll_Temp = hashtable_MesDll; + + DoWhatPlc.HashtableList.hashtable_EngineGetOver_EngineID_Temp = hashtable_EngineGetOver_EngineID; + DoWhatPlc.HashtableList.hashtable_EngineGetOver_EngineTypeID_Temp = hashtable_EngineGetOver_EngineTypeID; + DoWhatPlc.HashtableList.hashtable_EngineGetOver_EngineType_Temp = hashtable_EngineGetOver_EngineType; + DoWhatPlc.HashtableList.hashtable_EngineGetOver_OrderForm_Temp = hashtable_EngineGetOver_OrderForm; + + //初始化工步属性 + hashtable_workStepProperty = new Hashtable(); + dt = BaseDataSystemMES.GetworkStepPropertyFromMIS(); + if (dt != null) + { + for (int i = 0; i < dt.Rows.Count; i++) + { + OpName = dt.Rows[i]["工位号"].ToString(); + workStepProperty = dt.Rows[i]["工步属性"].ToString(); + hashtable_workStepProperty.Add(OpName, workStepProperty); + } + } + + //返修工位 + hashtable_OpNameRepair = new Hashtable(); + dt = BaseDataSystemMES.GetOpNameRepairFromMIS(); + if (dt != null) + { + for (int i = 0; i < dt.Rows.Count; i++) + { + OpName = dt.Rows[i]["工位号"].ToString(); + OpNameRepair = dt.Rows[i]["返修工位号"].ToString(); + hashtable_OpNameRepair.Add(OpName, OpNameRepair); + } + } + + DoWhatPlc.HashtableList.hashtable_OpNameRepair_Temp = hashtable_OpNameRepair; + DoWhatPlc.HashtableList.hashtable_workStepProperty_Temp = hashtable_workStepProperty; + DoWhatPlc.HashtableList.hashtable_QualityMesRead_Temp = hashtable_QualityMesRead; + DoWhatPlc.HashtableList.hashtable_IsAllowWork_Temp = hashtable_IsAllowWork; + DoWhatPlc.HashtableList.hashtable_WorkGroupIndex_Temp = hashtable_WorkGroupIndex; + + + + } + + + /// + /// 创建合格标志哈西表 + /// + private static void InitHashtable_QualityData_GoodBad() + { + //列位置 + string index; + // + int tagID; + DataTable dt ; + dt = BaseDataSystemMES.BaseData_tagTable_All_B5A(); + + hashtable_QualityData_GoodBad_Index = new Hashtable(); + for (int i = 0; i < dt.Rows.Count; i++) + { + tagID = Convert.ToInt32(dt.Rows[i]["TagID"]); + index = (dt.Rows[i]["列位置"]).ToString(); + hashtable_QualityData_GoodBad_Index.Add(tagID, index); + } + + hashtable_EngineTypeID = new Hashtable(); + dt = BaseDataSystemMES.BaseData_tagTable_QualityData_EngineTypeID(); + for (int i = 0; i < dt.Rows.Count; i++) + { + tagID = Convert.ToInt32(dt.Rows[i]["发动机机型代码"]); + index = (dt.Rows[i]["ID"]).ToString(); + hashtable_EngineTypeID.Add(tagID, index); + } + //工位号 + DataTable dt_OpName; + //工位号数据来源 + DataTable dt_OpNameFrom; + //数据来源对应的TagID + DataTable dt_OpNameTagID; + string opName; + string opNameFrom; + hashtable_QualityData_GoodBad_MIS_OpName = new Hashtable(); + // 测量合格标志 + // 全部测量数据的测量工位的数据来源 + Hashtable hashtable_QualityData_GoodBad_MIS_OpName_OpNameFrom; + + // 测量合格标志 + // 全部测量数据的测量工位的数据来源的测量变量 + Hashtable hashtable_QualityData_GoodBad_MIS_OpName_OpNameFrom_TagID; + dt_OpName = BaseDataSystemMES.BaseData_tagTable_QualityData_GoodBad_MIS_OpName_B5A(); + if (dt_OpName != null) + { + //有不合格标志的测量工位 + for (int i = 0; i < dt_OpName.Rows.Count; i++) + { + //有不合格标志的测量工位 对应的 数据来源工位号 + hashtable_QualityData_GoodBad_MIS_OpName_OpNameFrom = new Hashtable(); + opName = dt_OpName.Rows[i]["工位号"].ToString(); + dt_OpNameFrom = BaseDataSystemMES.BaseData_tagTable_QualityData_GoodBad_MIS_OpName(opName); + if (dt_OpNameFrom != null) + { + for (int j = 0; j < dt_OpNameFrom.Rows.Count; j++) + { + opNameFrom = dt_OpNameFrom.Rows[j]["数据来源"].ToString(); + dt_OpNameTagID = BaseDataSystemMES.BaseData_tagTable_QualityData_GoodBad_MIS_OpName(opName, opNameFrom); + // + hashtable_QualityData_GoodBad_MIS_OpName_OpNameFrom_TagID = new Hashtable(); + if (dt_OpNameTagID != null) + { + for (int k = 0; k < dt_OpNameTagID.Rows.Count; k++) + { + tagID = Convert.ToInt32(dt_OpNameTagID.Rows[k]["TagID"]); + hashtable_QualityData_GoodBad_MIS_OpName_OpNameFrom_TagID.Add(tagID, tagID); + } + } + tagID = Convert.ToInt32(dt_OpNameFrom.Rows[j]["TagID"]); + //全部测量数据的测量工位的数据来源的测量变量 + hashtable_QualityData_GoodBad_MIS_OpName_OpNameFrom.Add(tagID, hashtable_QualityData_GoodBad_MIS_OpName_OpNameFrom_TagID); + } + } + hashtable_QualityData_GoodBad_MIS_OpName.Add(opName, hashtable_QualityData_GoodBad_MIS_OpName_OpNameFrom); + } + } + } + + + public static NameValueCollection hashtable_TagTypeID_OpName_ToTagID; + + /// + /// 变量代码与其他字段的对应关系 + /// + public static void InitHashtableTagID() + { + //变量代码 + string tagID; + //变量名称 + string tagName; + //工位号 + string opNmae; + //测量位置 + string shaftID; + //测量项目 + string itemVale; + //变量排序 + int tagItemOrderBy; + //变量特点 + // 0:没定义1:工位合格标志2:需要合格标志的测量数据3:每个工位的合格标志4:物料5:IQA码6:压装数据7:压装合格标志8:(自动拧紧)工位合格标志 + int tagProperty; + //列位置 + int tagOrderBy; + InitHashtable_QualityData_GoodBad(); + //MesServerCode哈希表创建 + InitHashtable_MesServerCode(); + //列位置 + hashtable_tagTable_TagID_TagOrderBy = new Hashtable(); + // 变量代码与变量排序 + hashtable_tagTable_TagID_TagItemOrderBy = new Hashtable(); + // 变量代码与变量特点 + // 0:没定义1:工位合格标志2:需要合格标志的测量数据3:每个工位的合格标志4:物料5:IQA码6:压装数据7:压装合格标志8:(自动拧紧)工位合格标志 + hashtable_tagTable_TagID_TagProperty = new Hashtable(); + hashtable_tagTable_OpName_SaveData = new Hashtable(); + //工位号与机床状态 + //[测量数据发动机在线状态] + m_MachineStatus_OpName = new Hashtable(); + ////工位号与工件离开 0 + ////工位号与工件到位 1 + ////[测量数据发动机在线状态] + //m_WorkStart_OpName = new Hashtable(); + ////工位号与工件到位时间 + ////工位号与工件到位 0->1 + ////[测量数据发动机在线状态] + //m_WorkStart_OpName_Time = new Hashtable(); + //工位号与发动机号 + //[测量数据发动机在线状态] + m_EngineTrace_OpName = new Hashtable(); + m_EngineTrace_OpName_Time = new Hashtable(); + //工位号与合格标志 + //[测量数据发动机在线状态] + m_QualityMask_OpName = new Hashtable(); + //工位号与目标循环时间 + hashtableOpName_TargetTime = new Hashtable(); + //工位号与线体类型 + hashtableOpName_LineType = new Hashtable(); + //是否有工位计算机 + hashtableOpName_IsHaveComputer = new Hashtable(); + + //工位号与机型 + //[测量数据发动机在线状态] + m_EngineNumberType_OpName = new Hashtable(); + //工位号与发动机号 + //[测量数据发动机在线状态] + m_EngineNumber_OpName = new Hashtable(); + //工位号与订单号 + //[测量数据发动机在线状态] + m_OrderForm_OpName = new Hashtable(); + //工位号与操作者工号 + //[测量数据发动机在线状态] + m_OperatorCode_OpName = new Hashtable(); + + + // + // 变量名称 + // + hashtableTagID_TagName = new Hashtable(); + // + // 工位号 + // + hashtableTagID_OpName = new Hashtable(); + // + // 数据来源 + // + hashtableTagID_OpNameFrom = new Hashtable(); + // + // 工位名称 + // + hashtableTagID_OpName_Name = new Hashtable(); + // + // 测量位置 + // + hashtableTagID_ShaftID = new Hashtable(); + // + // 测量项目 + // + hashtableTagID_ItemVale = new Hashtable(); + + hashtable_tagTable_TagID_TagTypeID_All = new Hashtable(); + + // 工位号与工位上下线类型 + // (0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + // (5 分线上线 总线) (6 分线上线 总线) + hashtableOpName_OpType = new Hashtable(); + // 工位号与大屏幕代码 + // 对应LED大屏幕(1,2,3,4) + hashtableOpName_LedID = new Hashtable(); + + + + + // 大屏幕显示产量端口(41104) + hashtableOpName_LedID_Port = new Hashtable(); + // 大屏幕显示Andon大屏幕代码 1 + hashtableOpName_AndonID = new Hashtable(); + // 大屏幕显示Andon端口 (41105) + hashtableOpName_AndonID_Port = new Hashtable(); + // 是否有打印机(0,1) + hashtableOpName_IsPrinter = new Hashtable(); + // 打印机通讯端口 (缸盖打印机 41101) (发动机上线打印机 41102) (发动机下线打印机 41103) + hashtableOpName_IsPrinter_Port = new Hashtable(); + + m_WorkStart_OpName_Time = new Hashtable(); + m_WorkStart_OpName = new Hashtable(); + + + m_MachineStatusPutOn_OpName_Time = new Hashtable(); + m_MachineStatusPutOn_OpName = new Hashtable(); + m_MachineStatusWorkOn_OpName_Time = new Hashtable(); + m_MachineStatusWorkOn_OpName = new Hashtable(); + m_MachineStatusAlarm_OpName_Time = new Hashtable(); + m_MachineStatusAlarm_OpName = new Hashtable(); + m_MachineStatusNoPart_OpName_Time = new Hashtable(); + m_MachineStatusNoPart_OpName = new Hashtable(); + m_MachineStatusBlock_OpName_Time = new Hashtable(); + m_MachineStatusBlock_OpName = new Hashtable(); + + + + + m_WorkStart_OpName_PartMoveDirection = new Hashtable(); + m_PartPalletStatus_OpName_Time = new Hashtable(); + m_PartPalletStatus_OpName = new Hashtable(); + + hashtable_TagTypeID_OpName_ToTagID = new NameValueCollection(); + + + + DataTable dt; + DateTime dateTime; + dateTime = DateTime.Now; + dt = BaseDataSystemMES.BaseData_tagTable_All(); + + //变量类型代码 + int TagTypeID; + for (int i = 0; i < dt.Rows.Count; i++) + { + tagID = dt.Rows[i]["TagID"].ToString (); + tagName = Convert.ToString(dt.Rows[i]["TagName"]); + opNmae = Convert.ToString(dt.Rows[i]["工位号"]); + shaftID = Convert.ToString(dt.Rows[i]["测量位置"]); + itemVale = Convert.ToString(dt.Rows[i]["测量项目"]); + TagTypeID = Convert.ToInt32(dt.Rows[i]["变量类型代码"]); + tagItemOrderBy = Convert.ToInt32(dt.Rows[i]["变量排序"]); + tagProperty = Convert.ToInt32(dt.Rows[i]["变量特点"]); + tagOrderBy = Convert.ToInt32(dt.Rows[i]["列位置"]); + + hashtableTagID_TagName.Add(tagID, tagName); + hashtableTagID_OpName.Add(tagID, opNmae); + hashtableTagID_ShaftID.Add(tagID, shaftID); + hashtableTagID_ItemVale.Add(tagID, itemVale);//列位置 + hashtable_tagTable_TagID_TagTypeID_All.Add(tagID, TagTypeID); + hashtable_tagTable_TagID_TagItemOrderBy.Add(tagID, tagItemOrderBy); + hashtable_tagTable_TagID_TagProperty.Add(tagID, tagProperty); + hashtable_tagTable_TagID_TagOrderBy.Add(tagID, tagOrderBy); + + + } + dt = BaseDataSystemMES.BaseData_tagTable_OpName(); + for (int i = 0; i < dt.Rows.Count; i++) + { + //是否通过监控系统保存数据 + // 1:通过监控系统保存采集的质量数据;0:不通过监控系统保存采集的质量数据 + hashtable_tagTable_OpName_SaveData.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToInt32(dt.Rows[i]["是否通过监控系统保存数据"])); + + hashtableOpName_TargetTime.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToString(dt.Rows[i]["目标循环时间"])); + hashtableOpName_LineType.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToString(dt.Rows[i]["线体类型"])); + hashtableOpName_IsHaveComputer.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToString(dt.Rows[i]["是否有工位计算机"])); + //用于LED显示 + // [MES_计划BOM_工位与名称] + // 工位上下线类型 + //(0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + hashtableOpName_OpType.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToInt32(dt.Rows[i]["工位上下线类型"])); + hashtableOpName_LedID.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToInt32(dt.Rows[i]["大屏幕代码"])); + m_WorkStart_OpName_Time.Add(Convert.ToString(dt.Rows[i]["工位号"]), dateTime); + m_WorkStart_OpName.Add(Convert.ToString(dt.Rows[i]["工位号"]), 0); + + + m_MachineStatusPutOn_OpName_Time.Add(Convert.ToString(dt.Rows[i]["工位号"]), dateTime); + m_MachineStatusPutOn_OpName.Add(Convert.ToString(dt.Rows[i]["工位号"]), 0); + m_MachineStatusWorkOn_OpName_Time.Add(Convert.ToString(dt.Rows[i]["工位号"]), dateTime); + m_MachineStatusWorkOn_OpName.Add(Convert.ToString(dt.Rows[i]["工位号"]), 0); + m_MachineStatusAlarm_OpName_Time.Add(Convert.ToString(dt.Rows[i]["工位号"]), dateTime); + m_MachineStatusAlarm_OpName.Add(Convert.ToString(dt.Rows[i]["工位号"]), 0); + m_MachineStatusNoPart_OpName_Time.Add(Convert.ToString(dt.Rows[i]["工位号"]), dateTime); + m_MachineStatusNoPart_OpName.Add(Convert.ToString(dt.Rows[i]["工位号"]), 0); + m_MachineStatusBlock_OpName_Time.Add(Convert.ToString(dt.Rows[i]["工位号"]), dateTime); + m_MachineStatusBlock_OpName.Add(Convert.ToString(dt.Rows[i]["工位号"]), 0); + + + + m_WorkStart_OpName_PartMoveDirection.Add(Convert.ToString(dt.Rows[i]["工位号"]), 0); + + + m_PartPalletStatus_OpName_Time.Add(Convert.ToString(dt.Rows[i]["工位号"]), dateTime); + m_PartPalletStatus_OpName.Add(Convert.ToString(dt.Rows[i]["工位号"]), 0); + try + { + hashtableOpName_LedID_Port.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToInt32(dt.Rows[i]["大屏幕显示产量端口"])); + } + catch { } + try + { + hashtableOpName_AndonID.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToInt32(dt.Rows[i]["大屏幕显示Andon大屏幕代码"])); + } + catch { } + try + { + hashtableOpName_AndonID_Port.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToInt32(dt.Rows[i]["大屏幕显示Andon端口"])); + } + catch { } + try { hashtableOpName_IsPrinter.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToInt32(dt.Rows[i]["是否有打印机"])); } + catch { } + try + { + hashtableOpName_IsPrinter_Port.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToInt32(dt.Rows[i]["打印机通讯端口"])); + } + catch { } + } + + + //20170310 CLB新加 + dt = BaseDataSystemMES.BaseData_tagTable_OpcServerMES_ALL_CF(); + for (int i = 0; i < dt.Rows.Count; i++) + { + try + { + hashtable_TagTypeID_OpName_ToTagID.Add(Convert.ToString(dt.Rows[i]["工位号"]) + "_" + Convert.ToString(dt.Rows[i]["变量类型代码"]), Convert.ToString(dt.Rows[i]["TagID"])); + //hashtable_TagTypeID_OpName_ToTagID; + } + catch(Exception err) + { + + } + } + + + + + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Machine.ServicePlan.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Machine.ServicePlan.cs new file mode 100644 index 0000000..61d5684 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Machine.ServicePlan.cs @@ -0,0 +1,98 @@ +using System; +using System.Data; +using System.Windows.Forms; +//using bizFacade; +//using DataLinkMesWork; +//using SystemFramework; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + /// + /// 设备保养计划 + /// + /// + /// + /// + public delegate void MachinePlan_Invoke(string OpName, string MachineType, string PlanID); + /// + /// 设备保养计划 + /// + public MachinePlan_Invoke machinePlan_Invoke; + /// + /// 设备保养 + /// + /// + /// 设备保养类型 + /// 工作日历流水号 + public void MachinePlan(string OpName, string MachineType, string PlanID) + { + try + { + string SendMessage; + SendMessage = "MES|MachinePlan|" + OpName + "|" + MachineType + "&" + PlanID; + asyncSendMessage(SendMessage); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MachinePlan"); + } + } + + /// + /// 设备保养计划Timer + /// + private Timer timer_Machine; + /// + /// 初始化设备保养计划 + /// + public void InitMachinePlan(MachinePlan_Invoke machinePlan_Invoke) + { + this.machinePlan_Invoke = machinePlan_Invoke; + timer_Machine = new Timer(); + timer_Machine.Interval = 60000;//每隔一分钟查询一次 + timer_Machine.Tick += new EventHandler(timer_Machine_Tick); + timer_Machine.Start(); + } + + /// + /// 分钟调度 + /// + /// + /// + private void timer_Machine_Tick(object sender, EventArgs e) + { + try + { + //if (ApplicationConfig.Is_MachinePlan == 1) + //{ + // DataTable dt; + // string opName; + // string machineType;//保养类型代码 + // string planID;//工作日历流水号 + // BaseDataSystemMES.MachinePlan_Select(out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // for (int i = 0; i < dt.Rows.Count; i++) + // { + // opName = dt.Rows[i]["工位号"].ToString(); + // machineType = dt.Rows[i]["保养类型代码"].ToString(); + // planID = dt.Rows[i]["工作日历流水号"].ToString(); + // BaseDataSystemMES.Rolling_news_Add(opName, opName + "工位有设备保养计划,请相关人员进行保养!!!"); + // BeginInvoke(machinePlan_Invoke, new object[] { opName, machineType, planID }); + // } + // } + // } + //} + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "timer_Machine_Tick"); + } + } + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.OpcServerMIS.Read.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.OpcServerMIS.Read.cs new file mode 100644 index 0000000..4663bc7 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.OpcServerMIS.Read.cs @@ -0,0 +1,1202 @@ +using bizFacade; +using System; +using SystemFramework; +//using SystemFramework; +//using bizFacade; + +namespace MesServerWork +{ + + public partial class MIS_BASE + { + + + /// + /// 通过TagTypeName读取PLC数据 + /// + /// + /// + static private void Read_TagValueByTagTypeName(string cmd, string opName, out string tagValue) + { + tagValue = "-1"; + int tagTypeID; + try + { + tagTypeID = Convert.ToInt32(MIS_BASE.hashtable_TagType[cmd]); + string msg = "MES|" + tagTypeID.ToString() + "|" + opName + "|" + tagValue; + //tagValue = ChatService.MesReadWhisperMessage(msg); + MIS_BASE.ReadTagValue(tagTypeID, opName, out tagValue); + } + catch (Exception err) + { + ApplicationLog.WriteLog(err, "Read_TagValueByTagTypeName_FUNC;工位号:" + opName + ";命令:" + cmd + ";值:" + tagValue); + } + + } + + /// + /// 通过TagID读取对应值 + /// + /// + /// + static private void Read_TagValueByTagID(string TagID, out object tagValue) + { + tagValue = "0"; + try + { + tagValue = MIS_BASE.ReadPLC(TagID).ToString(); + } + catch (Exception err) + { + ApplicationLog.WriteLog(err, "Read_TagValueByTagID_FUNC"); + } + } + + /// + /// 根据数据类型代码、工位号获得对应值 + /// + /// + /// + /// + private static void Read_TagValueByTagTypeID(int tagTypeID, string opName, out string tagValueStr) + { + tagValueStr = "-1"; + + try + { + MIS_BASE.ReadTagValue(tagTypeID, opName, out tagValueStr); + } + catch (Exception err) + { + ApplicationLog.WriteLog(err, "Read_TagValueByTagTypeID_FUNC"); + } + } + + /// + /// 根据数据类型代码、工位号获得对应值 + /// + /// + /// + /// + private static void Read_TagValueByTagTypeID(int tagTypeID, string opName, out object tagValueStr) + { + tagValueStr = "-1"; + + try + { + tagValueStr = MIS_BASE.ReadPLC(tagTypeID, opName); + } + catch (Exception err) + { + ApplicationLog.WriteLog(err, "Read_TagValueByTagTypeID_FUNC"); + } + } + + /// + /// 读取数据通过(TagID) + /// + /// + /// + public static void Read_TagID(string TagID, out object tagValueOb) + { + Read_TagValueByTagID(TagID, out tagValueOb); + } + + /// + /// 读取数据通过(TagTypeName&opName) + /// + /// + /// + public static void Read_TagTypeName(string cmd, string opName, out string tagValueStr) + { + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + } + + /// + /// 读取数据通过(TagTypeID&opName) + /// + /// + /// + public static void Read_TagTypeID(int tagTypeID, string opName, out string tagValueStr) + { + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + } + + public static void Read_TagTypeID(int tagTypeID, string opName, out object tagValueStr) + { + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + } + + + + + /// + /// 订单号(string)(25) + /// + /// + /// + public static void Read_OrderForm(string opName, out string tagValue) + { + tagValue = ""; + string cmd = "OrderForm"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValue); + //tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + /// + /// 总成编号(string)(26) + /// + /// + /// + public static void Read_AssemblyCode(string opName, out string tagValue) + { + tagValue = ""; + string cmd = "AssemblyCode"; + Read_TagValueByTagTypeName(cmd, opName, out tagValue); + //tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + /// + /// 配方号1(dint)(27) + /// + /// + /// + public static void Read_Recipe1(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "Recipe1"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + /// + /// 配方号2(dint)(28) + /// + /// + /// + public static void Read_Recipe2(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "Recipe2"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + + + /// + /// 订单号(string)(61) + /// + /// + /// + public static void Read_OrderForm_MES(string opName, out string tagValue) + { + tagValue = ""; + string cmd = "OrderForm_MES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValue); + //tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + /// + /// 总成编号(string)(62) + /// + /// + /// + public static void Read_AssemblyCode_MES(string opName, out string tagValue) + { + tagValue = ""; + string cmd = "AssemblyCode_MES"; + Read_TagValueByTagTypeName(cmd, opName, out tagValue); + //tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + /// + /// 配方号1(dint)(63) + /// + /// + /// + public static void Read_Recipe1_MES(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "Recipe1_MES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + /// + /// 配方号2(dint)(64) + /// + /// + /// + public static void Read_Recipe2_MES(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "Recipe2_MES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + + /// + /// 匹配结果(DBX3.4)(69) + /// 匹配是否成功 + /// + /// + /// + public static void Read_MatchSuccess(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "Match"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 是否匹配(DBX3.3)(68) + /// + /// + /// + public static void Read_MatchingCompleted(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "MatchingCompleted"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + + /// + /// MES保存完数据(必须MIS)(X102.2)(20) + /// + /// + /// + public static void Read_MesReadOver(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "MesReadOver"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 发动机到位(X0.1)(2) + /// + /// + /// + public static void Read_WorkStart(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "WorkStart"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + + /// + /// 发动机机型标志(INT4)(9) + /// + public static void Read_EngineTypeID(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "EngineTypeID"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + /// + /// 发动机ID(STRING6.38)(10) + /// + public static void Read_EngineID(string opName, out string tagValue) + { + tagValue = ""; + string cmd = "EngineID"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = tagValueStr; + } + //public static void Read_OrderForm(string opName, out string tagValue) + //{ + // tagValue = ""; + // string tagTypeID = "39"; + // string tagValueStr; + // tagValueStr = DtWebApi.ReadWritePLC.ReadPLC(tagTypeID, opName).ToString(); + // tagValue = tagValueStr; + //} + /// + /// 发动机型号(STRING46.38)(11) + /// + public static void Read_EngineType(string opName, out string tagValue) + { + tagValue = ""; + string cmd = "EngineType"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = tagValueStr; + + } + + /// + /// 工位直通(X101.6)(1006) + /// + public static void Read_PartGoOver(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PartGoOver"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 托盘到位(1)托盘离开(0) (DBX101.5)(13) + /// + public static void Read_PartPalletStatus(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "PartPalletStatus"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + + /// + /// 加工时间变量目标时间 (DINT 106)(17) + /// + public static void Read_MachineTime_TargetTime(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "TargetTime"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + /// + /// 加工时间变量实际时间 (DINT 110)(18) + /// + public static void Read_MachineTime_ActualTime(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "ActualTime"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 质量数据总成合格标志(INT104)(21) + /// + public static void Read_QualityMask(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "QualityMask"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + if (tagValueStr == "1" | tagValueStr.ToLower () == "true") + { + tagValueStr = "1"; + } + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 机体流向标志(1 BYTE): + /// 0普通工位: + /// 1:上线(发动机上线); + /// 2:下线(发动机下线);(INT114)(41) + /// + public static void Read_PartMoveDirection(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PartMoveDirection"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + + + /// + /// 强制MES(X103.0)(78) + /// + public static void Read_Mes_MustTest(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "IsMES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + /// + /// 工位三种状态:在线、离线、屏蔽(0,1,2)(DBB116)(79) + /// + public static void Read_OnLineState(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "OnLineState"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + + /// + /// 变量类型代码=44 CF0.4 + /// PLC向MES传递机型,机型代码,零件编号完成,通知PLC。 + /// 机型可读 + /// + /// + /// + public static void Read_EngineGetOver_PLC(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "EngineTypeGetOverPLC"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// X100.2允许保存质量数据(19) + /// + /// + /// + public static void Read_QualityData_Read_CF(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "MesRead"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt64(tagValueStr)); + + } + + /// + /// MES向PLC传递机型(DBX2.1)(5) + /// + /// + /// + public static void Read_EngineTypeGetOver_MES(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "EngineTypeGetOverMES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// X2.3 工作完成 + /// + /// + /// + public static void Read_MaterialVerifyOver(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "MaterialVerifyOver"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 申请上线(DBX0.3)(43) + /// + /// + /// + public static void Read_PartLoad(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "PartLoad"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 上线完成(DBX0.3)(48) + /// + /// + /// + public static void Read_PartLoad_OK(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "PartLoadOK"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 合格放行(51) + /// + /// + /// + public static void Read_ConfirmOkGo(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "ConfirmOkGo"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 拧紧结束(DBX1.1)(59) + /// + /// + /// + public static void Read_FixOK(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "FixOK"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 蘑菇按钮(DBX1.3)(61) + /// + /// + /// + public static void Read_NextPushButton(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "NextPushButton"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 允许拧紧(DBX3.1)(66) + /// + /// + /// + public static void Read_FixAllow(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "FixAllow"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 拧紧结束确认(DBX3.2)(67) + /// + /// + /// + public static void Read_FixOver(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "FixOver"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + ///返修上线,在上线工位,MES依据工件情况,设定为返修件,PLC见到MES设定为1后,将返修标志写入到DBX0.2为1 + ///MES设定完返修返修上线后,MES清空该信号 + ///DBX3.7(72) + /// + /// + /// + public static void Read_RepairUpline_MES(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "RepairUplineMES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + + + /// + /// 匹配结果(DBX3.4)(69) + /// + /// + /// + public static void Read_Match(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "Match"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + + /// + /// 发动机机型代码(DBB404)(73)[false] + /// + /// + /// + public static void Read_EngineTypeID_MES(string opName, out int EngineTypeID) + { + EngineTypeID = 0; + string cmd = "EngineTypeID_MES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + EngineTypeID = Convert.ToInt32(tagValueStr); + + } + + /// + /// 发动机机型(DBB446)(75) + /// + /// + /// + public static void Read_EngineType_MES(string opName, out string EngineType) + { + EngineType = ""; + string cmd = "EngineType_MES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + EngineType = tagValueStr; + + } + + /// + /// 发动机号(DBB406)(74) + /// + /// + /// + public static void Read_EngineID_MES(string opName, out string EngineID) + { + EngineID = ""; + string cmd = "EngineID_MES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + EngineID = tagValueStr; + + } + + /// + /// 拧紧序号(拧紧或者称重的顺序)(DBB88)(77)[false] + /// + /// + /// + public static void Read_OrderBy(string opName, out int tagValue) + { + tagValue =0; + string cmd = "ProcessCode"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 工步属性(工作性质)(DBB90)(88)[false] + /// + /// + /// + public static void Read_ProcessCode(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "ProcessCode"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + + /// + /// 套筒号、子程序代码子程序(DBB26)(2025)[false] + /// + /// + /// + public static void Read_BoltCode(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "BoltCode"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + + /// + /// 托盘代码(DBB86)(80) + /// + public static void Read_PalletCode(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PartPalletCode"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + + + /// + /// 获得机型,零件编号,机型代码,托盘号,(从PLC) + /// + /// + /// + /// + /// + /// + public static void GetEngineTypeFromPLC(string opName, out int EngineTypeID, out string EngineType, out string EngineID, out int PartPallet_Code,out string OrderForm) + { + Read_EngineTypeID(opName,out EngineTypeID); + Read_EngineType(opName, out EngineType); + Read_EngineID(opName, out EngineID); + Read_TagTypeID(39, opName, out OrderForm); + Read_PalletCode(opName, out PartPallet_Code); + } + + public static void GetEngineTypeFromPLC_MES(string opName, out int EngineTypeID, out string EngineType, out string EngineID, out string OrderForm) + { + Read_EngineTypeID_MES(opName, out EngineTypeID); + Read_EngineType_MES(opName, out EngineType); + Read_EngineID_MES(opName, out EngineID); + Read_OrderForm_MES(opName, out OrderForm); + + + } + + /// + /// 获得机型,零件编号,机型代码,托盘号,(从DB) + /// + /// + /// + /// + /// + /// + public static void GetEngineTypeFromDB(string opName, out int EngineTypeID, out string EngineType, out string EngineID, out int PartPallet_Code) + { + string orderForm = ""; + int isRepair = 0; + string repairCode = ""; + string palletCode = "0"; + BaseDataSystemMES.OpName_MIS_Moby_Select(opName, + out orderForm, out EngineTypeID, out EngineType, + out EngineID, out palletCode, out isRepair, out repairCode); + PartPallet_Code = Convert.ToInt32(palletCode); + } + + /// + /// 0:不修改;1:可以修改。(上线工位)通知PLC。(DBX1.2)(76) + /// + /// + /// + public static void Read_PartPalletCode_PLC_ToMES(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PartPalletCodePLCToMES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 通知写入托盘号(DBX3.5)(70) + /// + /// + /// + public static void Read_PartPalletCode_PLC(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PartPalletCodePLC"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 变量类型代码=86,打印第一行(机型),用于线首打印机。STRING 486 .38 + /// + /// + /// + public static void Read_PrintBarCode1_MES(string opName, out string tagValue) + { + tagValue = ""; + string cmd = "PrintBarCode1MES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = tagValueStr; + + } + + /// + /// 变量类型代码=87,打印第二行(流水号),用于线首打印机。STRING 526 .38 + /// + /// + /// + public static void Read_PrintBarCode2_MES(string opName, out string tagValue) + { + tagValue = ""; + string cmd = "PrintBarCode2MES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = tagValueStr; + + } + + + /// + /// 上线工位。0:正常工作;1:空托盘放行(DBX2.2)(6) + /// + /// + /// + public static void Read_PartPalletGoOver(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PartPalletGoOver"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 自动手动申请工件编号,0是自动方式;1:手动方式。切换时,(DBX2.1)(71) + /// + /// + /// + public static void Read_IsAutoGetEngineID(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "IsAutoGetEngineID"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 正常拧紧时选择(DBX100.3)(81) + /// + /// + /// + public static void Read_Normal(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "Normal"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 备用拧紧时选择(DBX100.4)(82) + /// + /// + /// + public static void Read_UnNormal(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "UnNormal"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 允许拧紧2(DBX100.5)(83) + /// + /// + /// + public static void Read_FixAllow_2(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "FixAllow2"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 拧紧结束2(DBX100.6)(84) + /// + /// + /// + public static void Read_FixOK_2(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "FixOK2"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 拧紧结束确认2(DBX100.7)(85) + /// + /// + /// + public static void Read_FixOver_2(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "FixOver2"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 拧紧顺序2(DBX101.7)(1007) + /// MES通知PLC开始拧紧顺序(0为其他位,1为第一位置)(必须MES) + /// + /// + /// + public static void Read_WriteShaft_2(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "WriteShaft2"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + + + /// + /// 返修上线(DBX2.6)(52) + /// + /// + /// + public static void Read_PartLoadFinish(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PartLoadFinish"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 返修上线后,PLC确认(DBX1.0)(58) + /// + /// + /// + public static void Read_PartLoadOver(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PartLoadOver"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 变量类型代码=22,读取托盘信息 DBW126 + /// + /// + /// + public static void Read_PalletInfo(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PalletInfo"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + + /// + /// 变量类型代码=23,读取托盘信息 DBW194 + /// + /// + /// + public static void Read_RepairStatus_PLC(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "RepairStatusPLC"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// PLC将MOBY信息成功写入到了对应的DB,然后通知MES(DBX1.5)(63) + /// + /// + /// + public static void Read_PalletMobyReadOver(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PalletMobyReadOver"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + + /// + /// 在线返修状态(DBX4.0)(91) + /// + /// + /// + public static void Read_OnlineRepair(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "OnlineRepair"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 离线返修状态(DBX4.1)(92) + /// + /// + /// + public static void Read_OutLineRepair(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "OutLineRepair"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// MES通知PLC修改托盘状态成功(DBX4.2)(93) + /// + /// + /// + public static void Read_UpdatePalletOK(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "UpdatePalletOK"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + + + /// + /// MES向PLC要求申请下线(DBX0.7)(50) + /// + /// + /// + public static void Read_PalletDown(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "PalletDown"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + + /// + /// 物料检测(99) + /// + /// + /// + public static void Read_CheckMaterial(string opName, out object tagValue) + { + tagValue = new bool[16]; + string cmd = "CheckMaterial"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 备用功能是否启用(95) + /// + /// + /// + public static void Read_BakOpNameIsWork(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "BakOpNameIsWork"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + + + /// + /// 质量呼叫(DBX301.2)(2011) + /// + /// + /// + public static void Read_QualityCall(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "QualityCall"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + + /// + /// 物料呼叫(DBX301.3)(2012) + /// + /// + /// + public static void Read_MaterialCall(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "MaterialCall"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 故障呼叫(DBX301.4)(2013) + /// + /// + /// + public static void Read_FaultCall(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "FaultCall"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + + public static void Read_PartScanCode(int tagTypeID, string opName, out string tagValue) + { + tagValue = ""; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + tagValue = tagValueStr; + } + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.OpcServerMIS.Write.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.OpcServerMIS.Write.cs new file mode 100644 index 0000000..3b9eae8 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.OpcServerMIS.Write.cs @@ -0,0 +1,564 @@ +using DoWhatPlc; +using System; +//using SystemFramework; +//using OpcData; + +namespace MesServerWork +{ + + public partial class MIS_BASE + { + + + //static public void WritePLC(int tagType, string opName, object tagValue) + //{ + // Write_TagTypeID(tagType, opName, tagValue); + //} + /// + /// + /// + /// + public delegate void DemoHandler(object sender, CustomeEvetnArgs e); + /// + /// + /// + public static event DemoHandler OPCTagDataDemo; + //static private void Write_MesReadOver(string opName, object tagValue) + //{ + // int tagTypeID = 0; + // string msg; + // try + // { + // string tagTypeCodeID = "20"; + // DtWebApi.ReadWritePLC.Write_TagValueByTagTypeID(tagTypeCodeID, opName, tagValue); ; + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "Write_TagValueByTagTypeName_FUNC"); + // } + + //} + /// + /// 根据tagType,工位号写入PLC对应值 + /// + /// + /// + static private void Write_TagValueByTagTypeName(string cmd, string opName,object tagValue) + { + int tagTypeID = 0; + string msg; + try + { + tagTypeID = Convert.ToInt32(MIS_BASE.hashtable_TagType[cmd]); + MIS_BASE.WriteTagValue(tagTypeID, opName, tagValue); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Write_TagValueByTagTypeName_FUNC"); + } + + } + + /// + /// 根据TagTypeID,工位号写入PLC对应值 + /// + /// + /// + static public void Write_TagValueByTagTypeID(int tagTypeID, string opName, object tagValue) + { + string msg; + object tagValueOb; + object newTagValue= tagValue; + try + { + MIS_BASE.WriteTagValue(tagTypeID, opName, tagValue); + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Write_TagValueByTagTypeID_FUNC"); + } + + } + + + + + /// + /// 通过TagID写入PLC数据 + /// + /// + /// + static private void Write_TagValueByTagID(string TagID, object tagValue) + { + string msg; + //tagValue = "0"; + try + { + MIS_BASE.WritePLC(TagID, tagValue); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Write_TagValueByTagID_FUNC"); + } + } + + public static void Write_TagTypeID(int tagTypeID, string opName, object tagValue) + { + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + + public static void Write_TagID(string TagID, object tagValue) + { + Write_TagValueByTagID(TagID, tagValue); + } + + + /// + /// 清空MES信号 MES传递机型(5) 允许工作(66) 合格放行(51) 不合格放行(8) 拧紧结束(67) 工作完成(7) 保存完成(20) 加工时间保存完成(54) 匹配完成(68) 默认false + /// + /// + /// + public static void Write_ClearMesMoby(string opName) + { + MIS_BASE.Write_EngineTypeGetOver_MES(opName, false); + MIS_BASE.Write_FixAllow(opName, false); + MIS_BASE.Write_ConfirmOkGo(opName, false); + MIS_BASE.Write_FalseGO(opName, false); + MIS_BASE.Write_FixOver(opName, false); + MIS_BASE.Write_MaterialVerifyOver(opName, false); + MIS_BASE.Write_MesReadOver(opName, false); + MIS_BASE.Write_MachineTime_ReadOver(opName, false); + MIS_BASE.Write_MatchingCompleted(opName, false); + } + + + /// + /// 订单号(string)(25) + /// + /// + /// + public static void Write_OrderForm(string opName, string tagValue) + { + string cmd = "OrderForm"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + /// + /// 总成编号(string)(26) + /// + /// + /// + public static void Write_AssemblyCode(string opName, string tagValue) + { + string cmd = "AssemblyCode"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + /// + /// 配方号1(dint)(27) + /// + /// + /// + public static void Write_Recipe1(string opName, int tagValue) + { + string cmd = "Recipe1"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + /// + /// 配方号2(dint)(28) + /// + /// + /// + public static void Write_Recipe2(string opName, int tagValue) + { + tagValue = 0; + string cmd = "Recipe2"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + + /// + /// 订单号(string)(61) + /// + /// + /// + public static void Write_OrderForm_MES(string opName, string tagValue) + { + string cmd = "OrderForm_MES"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + /// + /// 总成编号(string)(62) + /// + /// + /// + public static void Write_AssemblyCode_MES(string opName, string tagValue) + { + + string cmd = "AssemblyCode_MES"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + /// + /// 配方号1(dint)(63) + /// + /// + /// + public static void Write_Recipe1_MES(string opName, int tagValue) + { + string cmd = "Recipe1_MES"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + /// + /// 配方号2(dint)(64) + /// + /// + /// + public static void Write_Recipe2_MES(string opName, int tagValue) + { + string cmd = "Recipe2_MES"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + + /// + /// 各个工位返修状态(4) + /// + /// + /// + public static void Write_RepairPathString(string opName, string tagValue) + { + string cmd = "RepairPathString"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + /// + /// MES保存完数据(必须MIS)(X102.2)(20) + /// + /// + /// + public static void Write_MesReadOver(string opName, bool tagValue) + { + string cmd = "MesReadOver"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + /// + /// 加工时间保存完数据 DBX102.1 (54) + /// + /// + /// + public static void Write_MachineTime_ReadOver(string opName, bool tagValue) + { + string cmd = "MachineTime_ReadOver"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + + } + + /// + /// 工位三种状态:在线、离线、屏蔽(0,1,2)(DBB116)(79) + /// + /// + /// + public static void Write_OnLineState(string opName, int tagValue) + { + string cmd = "OnLineState"; + Write_TagValueByTagTypeName(cmd, opName,Convert .ToInt16 ( tagValue)); + } + + /// + /// 托盘编号(PLC)(80) + /// + /// + /// + public static void Write_PalletCode(string opName, int tagValue) + { + string cmd = "PartPalletCode"; + Write_TagValueByTagTypeName(cmd, opName, Convert.ToInt16(tagValue)); + } + + /// + /// MES向PLC传递机型(5) + /// + /// + /// + public static void Write_EngineTypeGetOver_MES(string opName, bool tagValue) + { + string cmd = "EngineTypeGetOverMES"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + /// + /// PLC向MES传递机型(44) + /// + /// + /// + public static void Write_EngineTypeGetOver_PLC(string opName, bool tagValue) + { + string cmd = "EngineTypeGetOverPLC"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + /// + /// PLC向MES质量数据可以读 允许保存(19) DBX587.0 + /// + /// + /// + public static void Write_MesRead_PLC(string opName, bool tagValue) + { + string cmd = "MesRead"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + /// + /// 工作完成(7) + /// + /// + /// + public static void Write_MaterialVerifyOver(string opName, bool tagValue) + { + string cmd = "MaterialVerifyOver"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + /// + /// 合格方式放行(51) + /// + /// + /// + public static void Write_ConfirmOkGo(string opName, bool tagValue) + { + string cmd = "ConfirmOkGo"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + /// + /// 允许拧紧(66) + /// + /// + /// + public static void Write_FixAllow(string opName, bool tagValue) + { + string cmd = "FixAllow"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + /// + /// 工件到位 + /// + /// + /// + public static void Write_WorkStart(string opName, bool tagValue) + { + string cmd = "WorkStart"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + /// + /// 拧紧结束(67) + /// + /// + /// + public static void Write_FixOver(string opName, bool tagValue) + { + string cmd = "FixOver"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + /// + ///返修上线,在上线工位,MES依据工件情况,设定为返修件,PLC见到MES设定为1后,将返修标志写入到DBX0.2为1 + ///MES设定完返修返修上线后,MES清空该信号 + ///DBX3.7(72) + /// + /// + /// + public static void Write_RepairUpline_MES(string opName, bool tagValue) + { + string cmd = "RepairUplineMES"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + /// + /// 匹配完成(68) + /// + /// + /// + public static void Write_MatchingCompleted(string opName, bool tagValue) + { + string cmd = "MatchingCompleted"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + + /// + /// 不合格放行(8) + /// + /// + /// + public static void Write_FalseGO(string opName, bool tagValue) + { + string cmd = "FalseGo"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + /// + /// 匹配结果(69) + /// + /// + /// + public static void Write_Match(string opName, bool tagValue) + { + string cmd = "Match"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + + } + + /// + /// 变量类型代码=73,机型代码。DBB404~405 机型标志 + /// + /// + /// + public static void Write_EngineTypeID_MES(string opName, int tagValue) + { + string cmd = "EngineTypeID_MES"; + Write_TagValueByTagTypeName(cmd, opName, Convert.ToInt16(tagValue)); + } + /// + /// 变量类型代码=74,零件编号。DBB406~445 发动机编号 + /// + /// + /// + public static void Write_EngineID_MES(string opName, string tagValue) + { + string cmd = "EngineID_MES"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + //public static void Write_OrderForm_MES(string opName, string tagValue) + //{ + // string tagTypeCodeID = "116"; + // DtWebApi.ReadWritePLC.WritePLC(tagTypeCodeID, opName, tagValue); + //} + + //WritePLC(string tagTypeCodeID, string opName, object tagValue) + /// + /// 变量类型代码=75,零件机型。DBB446~485 发动机机型 + /// + /// + /// + public static void Write_EngineType_MES(string opName, string tagValue) + { + string cmd = "EngineType_MES"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + /// + /// 拧紧序号(77) + /// + /// + /// + public static void Write_ProcessCode(string opName, int tagValue) + { + string cmd = "ProcessCode"; + Write_TagValueByTagTypeName(cmd, opName, Convert.ToInt16(tagValue)); + } + + + /// + /// 套筒号(88) + /// + /// + /// + public static void Write_BoltCode(string opName, int tagValue) + { + string cmd = "BoltCode"; + Write_TagValueByTagTypeName(cmd, opName, Convert.ToInt16(tagValue)); + } + + /// + /// 空托盘放行(DBX2.2)(6) + /// + /// + /// + public static void Write_PartPalletGoOver(string opName, int tagValue) + { + string cmd = "PartPalletGoOver"; + Write_TagValueByTagTypeName(cmd, opName, Convert.ToInt16(tagValue)); + } + + + /// + /// 自动手动申请工件编号,0是自动方式;1:手动方式。切换时,(DBX2.1)(71) + /// + /// + /// + public static void Write_IsAutoGetEngineID(string opName, int tagValue) + { + string cmd = "IsAutoGetEngineID"; + Write_TagValueByTagTypeName(cmd, opName, Convert.ToInt16(tagValue)); + } + + + /// + /// 正常拧紧时选择(DBX100.3)(81) + /// + /// + /// + public static void Write_Normal(string opName, int tagValue) + { + string cmd = "Normal"; + Write_TagValueByTagTypeName(cmd, opName, Convert.ToInt16(tagValue)); + } + /// + /// 备用拧紧时选择(DBX100.4)(82) + /// + /// + /// + public static void Write_UnNormal(string opName, int tagValue) + { + string cmd = "UnNormal"; + Write_TagValueByTagTypeName(cmd, opName, Convert.ToInt16(tagValue)); + } + + /// + /// 变量类型代码=52,复位设备(MES)DBX0.6 + /// 通知PLC复位设备 + /// + /// + /// + public static void Write_ResetDevice(string opName, bool tagValue) + { + string cmd = "PartLoadFinish"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + /// + ///托盘状态(22) + /// + /// + /// + public static void Write_PalletInfo(string opName, int tagValue) + { + string cmd = "PalletInfo"; + Write_TagValueByTagTypeName(cmd, opName, Convert.ToInt16(tagValue)); + } + /// + /// 返修标志(93) + /// + /// + /// + public static void Write_RepairStatusMES(string opName, int tagValue) + { + string cmd = "RepairStatusMES"; + Write_TagValueByTagTypeName(cmd, opName, Convert.ToInt16(tagValue)); + } + + /// + /// MES通知PLC修改托盘状态成功 + /// + /// + /// + public static void Write_UpdatePalletOK(string opName, bool tagValue) + { + string cmd = "UpdatePalletOK"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.QualityData.Read.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.QualityData.Read.cs new file mode 100644 index 0000000..73d5dd7 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.QualityData.Read.cs @@ -0,0 +1,119 @@ +using System; +using System.Data; +using System.Collections; +//using BasicData; +//using bizFacade; +//using SystemFramework; +using System.Configuration; +using bizFacade; +using DoWhatPlc; +using MesWork; +using System.Collections.Generic; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + + /// + /// 读取质量数据 + /// + /// + public static void ReadPLC_Sync_ValueList(string opName, out Hashtable valueList) + { + valueList = null; + ReadPLCData(opName, out valueList); + } + /// + /// 根据工位号 同步读取数据 + /// + /// 工位号 + /// PLC仅仅值列表 + private static void ReadPLCData(string opName, out Hashtable valueList) + { + valueList = new Hashtable(); + QualityDataType qualityDataType; + qualityDataType = new QualityDataType(); + System.Data.DataTable dt; + dt = BaseDataSystemMES.BaseData_tagTable_QualityData_Item_B5A(); + + object tagValueStr = "0"; + for (int i = 0; i < dt.Rows.Count; i++) + { + if (opName == dt.Rows[i]["工位号"].ToString()) + { + qualityDataType.tagID = dt.Rows[i]["TagID"].ToString (); + qualityDataType.tagTypeID = Convert.ToInt32(dt.Rows[i]["TagTypeID"]);//变量类型 + qualityDataType.opName = opName;// + qualityDataType.isGoodBad = 192;// + qualityDataType.tagQuality = 192;// + qualityDataType.tagValueType = Convert.ToInt32(dt.Rows[i]["变量类型代码"]); + qualityDataType.tagOrderBy = Convert.ToInt32(dt.Rows[i]["列位置"]); + qualityDataType.tagItemOrderBy = Convert.ToInt32(dt.Rows[i]["变量排序"]); + qualityDataType.tagProperty = Convert.ToInt32(dt.Rows[i]["变量特点"]); ;//变量特点 + + MIS_BASE.Read_TagID(qualityDataType.tagID, out tagValueStr); + + if (qualityDataType.tagTypeID == 18) + { + qualityDataType.tagValue = Convert.ToInt32(tagValueStr);//变量值 + } + else + { + qualityDataType.tagValue = tagValueStr;//变量值 + } + valueList.Add(qualityDataType.tagID, qualityDataType); + } + } + } + public static QualityDataSaveList ReadPLC_Sync_DataList_MesRead(string opName) + { + + QualityDataSaveList qualityDataSaveList = new QualityDataSaveList(); + qualityDataSaveList.BasicDataTagValue = MIS_BASE.BasicDataTagValue; + qualityDataSaveList.BasicDataTagValueUpDown = MIS_BASE.BasicDataTagValueUpDown; + qualityDataSaveList.hashtable_EngineTypeID = MIS_BASE.hashtable_EngineTypeID; + qualityDataSaveList.hashtable_tagTable_OpName_SaveData = MIS_BASE.hashtable_tagTable_OpName_SaveData; + //List TagIDQualityDataTypeList = new List(); + + Hashtable ht = new Hashtable(); + + var cd = PlcLinkForm.ReadPLC_GroupData(opName); + foreach (KeyValuePair _cd in cd) + { + var tagID = Convert.ToInt32(_cd.Key); + var TF = (TagFormat)_cd.Value; + + QualityDataType qualityDataType; + qualityDataType = new QualityDataType(); + + qualityDataType.tagID = TF.TagID; + qualityDataType.tagTypeID = TF.TagTypeID;//变量类型 + qualityDataType.opName = opName; + qualityDataType.isGoodBad = 192; + int.TryParse(TF.TagQuality, out int TagQuality); + qualityDataType.tagQuality = TagQuality; + qualityDataType.tagValueType = TF.TagTypeCodeID; + int.TryParse(TF.TagOrderBy, out int TagOrderBy); + qualityDataType.tagOrderBy = TagOrderBy; + int.TryParse(TF.TagItemOrderBy, out int TagItemOrderBy); + qualityDataType.tagItemOrderBy = TagItemOrderBy; + qualityDataType.tagProperty = TF.TagProperty;//变量特点 + qualityDataType.tagValue = TF.TagValue;//变量值 + + ht.Add(tagID, qualityDataType); + } + qualityDataSaveList.valuList = ht; + return qualityDataSaveList; + + //string api = ""; + //string type = "GET"; + //string controlStr = "PLC1"; + //string actionStr = "ReadPLC_Sync_DataList_MesRead"; + //Dictionary dic = new Dictionary(); + //dic.Add("opName", opName); + //var rc = new CallWebApi().InvokeWebapiQualityDataSaveList(controlStr, actionStr, api, type, dic); + //return rc; + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.SendMessage.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.SendMessage.cs new file mode 100644 index 0000000..a56b188 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.SendMessage.cs @@ -0,0 +1,127 @@ +using System; +using System.Data; +using System.Collections; +//using BasicData; +////using bizFacade; +//using SystemFramework; +using System.Configuration; +//using MesWork; +using MQTTnet.Client.Connecting; +using MQTTnet.Client.Disconnecting; +using MQTTnet.Client.Receiving; +using MQTTnet; +using MesWorkMqtt; +using System.Threading.Tasks; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + /// + /// + /// + public static string MqttTargetTopic = ConfigurationManager.AppSettings["MqttTargetTopic"]; + /// + /// + /// + static new MesWebFun_base.MisWebInterface misWebInterface = new MesWebFun_base.MisWebInterface(); + /// + /// + /// + static readonly Object locker = new Object(); + /// + /// 发消息给通讯服务器 + /// + /// + public static string asyncSendMessage(string Message) + { + lock (locker) + { + //"MES|MachinePlan|OpName|Value + var array = Message.Split('|'); + var cmd = array[1]; + var opName = array[2]; + var topic = $"{MqttTargetTopic}/{opName}"; + Task.Run(() => Mqtt.Publish(topic, Message)); + + var responseStr = misWebInterface.WebSocket_Function(Message); + if (responseStr.Length > 0) + { + Task.Run(() => Mqtt.Publish(topic, $"MES|{cmd}_Resources|{opName}|{responseStr}")); + } + return responseStr; + } + } + //public static string asyncSendMessage(Mqtt Mqtt1, string Message) + //{ + // lock (locker) + // { + // //"MES|MachinePlan|OpName|Value + // var array = Message.Split('|'); + // var cmd = array[1]; + // var opName = array[2]; + // var topic = $"{MqttTargetTopic}/{opName}"; + // Task.Run(() => Mqtt1.Publish(topic, Message)); + + + + // var responseStr = misWebInterface.WebSocket_Function(Message); + // if (responseStr.Length > 0) + // { + // Task.Run(() => Mqtt1.Publish(topic, $"MES|{cmd}_Resources|{opName}|{responseStr}")); + // } + // return responseStr; + // return ""; + // } + //} + public static string asyncSendMessageDemo(string Message) + { + lock (locker) + { + //"MES|MachinePlan|OpName|Value + var array = Message.Split('|'); + var cmd = array[1]; + var opName = array[2]; + var topic = $"{MqttTargetTopic}/{opName}"; + + //Mqtt.Publish(topic, Message); + string responseStr = ""; + //var responseStr = misWebInterface.WebSocket_Function(Message); + //if (responseStr.Length > 0) + //{ + + // Mqtt.Publish(topic, $"MES|{cmd}_Resources|{opName}|{responseStr}"); + //} + return responseStr; + } + } + + /// + /// 发消息给通讯服务器 + /// + /// + public static string asyncSendMessageQos0(string Message) + { + lock (locker) + { + //"MES|MachinePlan|OpName|Value + var array = Message.Split('|'); + var cmd = array[1]; + var opName = array[2]; + var topic = $"{MqttTargetTopic}/{opName}"; + Mqtt.PublishQos0(topic, Message); + //var responseStr = misWebInterface.WebSocket_Function(Message); + //if (responseStr.Length > 0) + //{ + // Mqtt.Publish(topic, $"MES|{cmd}_Resources|{opName}|{responseStr}"); + //} + //return responseStr; + return ""; + } + } + + + + } +} + diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS_BASE.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS_BASE.cs new file mode 100644 index 0000000..3e3f609 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS_BASE.cs @@ -0,0 +1,431 @@ +using BasicData; + +using MesWork; +using Newtonsoft.Json; +using OpcBasic; +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; +using System.Net.Http; +using System.Runtime.Remoting.Messaging; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerWork +{ + + /* +HeartBeatMIS 15 +EngineTypeGetOverMES 5 +PartPalletGoOver 6 +MaterialVerifyOver 7 +FalseGo 8 +ConfirmOkGo 51 +PartLoadFinish 52 +UnloadCompleted 53 +MachineTime_ReadOver 54 +FixAllow 66 +FixOver 67 +MatchingCompleted 68 +Match 69 +Reserved_1 70 +IsAutoGetEngineID 71 +RepairUplineMES 72 +ProcessCode 77 +BoltCode 88 +RepairStatus 93 +Reserved_3 24 +Reserved_4 25 +Reserved_5 26 +Reserved_6 27 +Reserved_7 28 +Reserved_8 29 +Reserved_9 30 +Reserved_10 31 +Reserved_11 32 +Reserved_12 33 +Reserved_13 34 +Reserved_14 35 +MesReadOver 20 +Reserved_15 110 +Reserved_16 111 +Reserved_17 112 +OnLineState 79 +EngineTypeID_MES 73 +EngineID_MES 74 +EngineType_MES 75 +MarkID 42 +RepairPathString 4 +SPareint1 113 +SPareint2 114 +SPareint3 115 +Sparestring1 116 +Sparestring2 117 +HeartBeatPLC 14 +WorkStart 2 +RepairPartStatusPLC 3 +PartLoad 43 +EngineTypeGetOverPLC 44 +PartLoadOK 48 +Reserved_18 49 +PalletDown 50 +Reserved_19 58 +FixOK 59 +Reserved_20 76 +Reserved_21 61 +Reserved_22 62 +Reserved_23 63 +Reserved_24 64 +Reserved_25 65 +EngineTypeID 9 +EngineID 10 +EngineType 11 +PartPalletCode 80 +PalletInfo 22 +MesRead 19 +PutOn 1000 +WorkOn 1001 +Alarm 1002 +NoPart 1003 +Block 1004 +PartPalletStatus 13 +TargetTimeRead 16 +QualityMask 21 +RepairStatusPLC 23 +MachineTargetTime 17 +MachineActualTime 18 +PLCSPareint1 36 +PLCSPareint2 37 +PLCSPareint3 38 +PLCSarestring1 39 +PLCSarestring2 40 + */ + + + + public partial class MIS_BASE + { + + + /// + ///引用程序集Hashtable + /// + public static Hashtable Hashtable_assembly = new Hashtable(); + /// + /// + /// + static public NameValueCollection hashtable_TagTypeTagName = null; + + /// + /// + /// + static public NameValueCollection hashtable_TagTypeChange = null; + /// + /// + /// + static public NameValueCollection hashtable_WebTagTypeChange = null; + /// + /// + /// + static public NameValueCollection hashtable_MesTagTypeChange = null; + /// + /// + /// + static readonly object l = new object(); + /// + /// + /// + /// + /// + /// + public static object ReadPLC(int tagTypeCodeID, string opName) + { + try + { + return PlcLinkForm.ReadPLC(tagTypeCodeID, opName); + + } + catch { return "-3"; } + } + /// + /// + /// + /// + /// + public static object ReadPLC(string tagID) + { + return PlcLinkForm.ReadPLC(tagID); + } + /// + /// 20230218 + /// 按组读质量数据,返回带合格标志的质量数据列表 + /// + /// + /// + public static Hashtable ReadPLC_Sync_DataList_MesRead_ByOnlyDataGroup(string opName) + { + lock (l) + { + + var tagValues = GetDbAndMaxLengthByOpNameByBytes(opName); + + var keyValues = tagValues.OrderBy(x => x.Key).ToDictionary(k => k.Key, v => v.Value); + + TagFormat tagFormatTemp; + int tagIndex = 1; + int isOK = 0; + + Hashtable ht = new Hashtable(); + + + foreach (KeyValuePair _cd in keyValues) + { + if (_cd.Key.ToString()[0].ToString() == "7") + { + tagFormatTemp = (TagFormat)_cd.Value; + if (tagIndex % 3 == 1) + { + isOK = Convert.ToInt32(tagFormatTemp.TagValue); + } + else if (tagIndex % 3 == 2) + { + var TF = (TagFormat)_cd.Value; + + QualityDataType qualityDataType; + qualityDataType = GetQualityDataType(TF); + qualityDataType.isGoodBad = isOK; + ht.Add(qualityDataType.tagID, qualityDataType); + } + else if (tagIndex % 3 == 0) + { + var TF = (TagFormat)_cd.Value; + + QualityDataType qualityDataType; + qualityDataType = GetQualityDataType(TF); + qualityDataType.isGoodBad = isOK; + ht.Add(qualityDataType.tagID, qualityDataType); + } + + tagIndex++; + } + //Console.WriteLine($"key:{kv.Key} value:{kv.Value}"); + } + return ht; + } + } + + public static ConcurrentDictionary GetDbAndMaxLengthByOpNameByBytes(string opName) + { + string tagStartAdr = ""; + ushort tagAdrListMaxLength = 0; + PlcLinkForm.GetDbAndMaxLengthByOpName(opName, out tagStartAdr, out tagAdrListMaxLength); + var tagAdrListTagFormat = PlcLinkForm.ReadQualityDataList(opName, tagStartAdr, tagAdrListMaxLength); + return tagAdrListTagFormat; + } + + + public static BasicData.QualityDataType GetQualityDataType(TagFormat TF) + { + QualityDataType qualityDataType; + + qualityDataType = new QualityDataType(); + + qualityDataType.tagID = TF.TagID; + qualityDataType.tagTypeID = TF.TagTypeID;//变量类型 + qualityDataType.opName = TF.OpName; + int.TryParse(TF.TagQuality, out int TagQuality); + qualityDataType.tagQuality = TagQuality; + qualityDataType.tagValueType = TF.TagTypeCodeID; + int.TryParse(TF.TagOrderBy, out int TagOrderBy); + qualityDataType.tagOrderBy = TagOrderBy; + int.TryParse(TF.TagItemOrderBy, out int TagItemOrderBy); + qualityDataType.tagItemOrderBy = TagItemOrderBy; + qualityDataType.tagProperty = TF.TagProperty;//变量特点 + qualityDataType.tagValue = TF.TagValue;//变量值 + + return qualityDataType; + } + /// + /// + /// + /// + /// + /// + public static void ReadTagValue(int tagTypeCodeID, string opName, out string tagValue) + { + tagValue = "0"; + try + { + var tagValueObj = PlcLinkForm.ReadPLC(tagTypeCodeID, opName); + var type = tagValueObj.GetType().Name.ToLower(); + if (type == "bool" | type == "boolean") + { + var val = tagValueObj.ToString().ToLower(); + + if (val == "true") + { + tagValue = "1"; + } + } + else + { + tagValue = tagValueObj.ToString(); + } + } + catch { } + } + + /// + /// + /// + /// + /// + /// + public static bool WritePLC(string tagID, object tagValue) + { + return PlcLinkForm.WritePLC(tagID, tagValue); + } + /// + /// + /// + /// + /// + /// + /// + public static bool WritePLC(int tagTypeCodeID, string opName, object tagValue) + { + return PlcLinkForm.WritePLC(tagTypeCodeID, opName, tagValue); + } + /// + /// + /// + /// + /// + /// + /// + public static bool WriteTagValue(int tagTypeCodeID, string opName, object tagValue) + { + return PlcLinkForm.WritePLC(tagTypeCodeID, opName, tagValue); + } + + public static ConcurrentDictionary ReadPLC_OpName(string opName) + { + try + { + string tagStartAdr = ""; + ushort tagAdrListMaxLength = 0; + PlcLinkForm.GetDbAndMaxLengthByOpName(opName, out tagStartAdr, out tagAdrListMaxLength); + var tagAdrListTagFormat = PlcLinkForm.ReadQualityDataList(opName, tagStartAdr, tagAdrListMaxLength); + + return tagAdrListTagFormat; + } + catch (Exception err) + { + return null; + + } + + } + + public static List Get_opNameList() + { + return PlcLinkForm.opNameList; + } + public static DoWhatPlc.HashtableList GetHashtableList() + { + DoWhatPlc.HashtableList hsList = new DoWhatPlc.HashtableList(); + hsList.hashtable_MesDll = DoWhatPlc.HashtableList.hashtable_MesDll_Temp; + hsList.hashtable_MesServerCode = DoWhatPlc.HashtableList.hashtable_MesServerCode_Temp; + hsList.hashtable_TagTypeDataType = DoWhatPlc.HashtableList.hashtable_TagTypeDataType_Temp; + hsList.hashtable_TagType = DoWhatPlc.HashtableList.hashtable_TagType_Temp; + hsList.hashtable_OpNameRepair = DoWhatPlc.HashtableList.hashtable_OpNameRepair_Temp; + hsList.hashtable_TagTypeTagName = DoWhatPlc.HashtableList.hashtable_TagTypeTagName_Temp; + + + hsList.hashtable_workStepProperty = DoWhatPlc.HashtableList.hashtable_workStepProperty_Temp; + hsList.hashtable_QualityMesRead = DoWhatPlc.HashtableList.hashtable_QualityMesRead_Temp; + hsList.hashtable_IsAllowWork = DoWhatPlc.HashtableList.hashtable_IsAllowWork_Temp; + hsList.hashtable_WorkGroupIndex = DoWhatPlc.HashtableList.hashtable_WorkGroupIndex_Temp; + hsList.hashtableOpName_OpType = DoWhatPlc.HashtableList.hashtableOpName_OpType_Temp; + hsList.hashtable_tagTable_OpName_SaveData = DoWhatPlc.HashtableList.hashtable_tagTable_OpName_SaveData_Temp; + + + + hsList.hashtable_EngineGetOver_EngineID = DoWhatPlc.HashtableList.hashtable_EngineGetOver_EngineID_Temp; + hsList.hashtable_EngineGetOver_EngineTypeID = DoWhatPlc.HashtableList.hashtable_EngineGetOver_EngineTypeID_Temp; + hsList.hashtable_EngineGetOver_EngineType = DoWhatPlc.HashtableList.hashtable_EngineGetOver_EngineType_Temp; + hsList.hashtable_EngineGetOver_OrderForm = DoWhatPlc.HashtableList.hashtable_EngineGetOver_OrderForm_Temp; + + hsList.BasicDataTagValue = MesServerWork.MIS_BASE.BasicDataTagValue; + hsList.BasicDataTagValueUpDown = MesServerWork.MIS_BASE.BasicDataTagValueUpDown; + hsList.hashtable_EngineTypeID = MesServerWork.MIS_BASE.hashtable_EngineTypeID; + hsList.hashtable_tagTable_OpName_SaveData = MesServerWork.MIS_BASE.hashtable_tagTable_OpName_SaveData; + return hsList; + } + + + public static List ReadPLC_GroupMonitor(string opName) + { + List TagIDTagFormatList = new List(); + var cd = MesWork.PlcLinkForm.ReadPLC_GroupMonitor(opName); + foreach (KeyValuePair _cd in cd) + { + var tagID = _cd.Key; + + var pp1 = JsonConvert.SerializeObject(_cd.Value); + var pp2 = JsonConvert.DeserializeObject(pp1); + DoWhatPlc.TagIDTagFormat TagTF = new DoWhatPlc.TagIDTagFormat(tagID, pp2); + + TagIDTagFormatList.Add(TagTF); + } + return TagIDTagFormatList; + } + + public static List ReadPLC_GroupData_Qd(string opName) + { + List TagIDTagFormatList = new List(); + var cd = MesWork.PlcLinkForm.ReadPLC_GroupData_Qd(opName); + foreach (KeyValuePair _cd in cd) + { + var tagID = _cd.Key; + var pp1 = JsonConvert.SerializeObject(_cd.Value); + var pp2 = JsonConvert.DeserializeObject(pp1); + DoWhatPlc.TagIDTagFormat TagTF = new DoWhatPlc.TagIDTagFormat(tagID, pp2); + + TagIDTagFormatList.Add(TagTF); + } + return TagIDTagFormatList; + } + public static List ReadPLC_GroupData(string opName) + { + try + { + List TagIDTagFormatList = new List(); + var cd = MesWork.PlcLinkForm.ReadPLC_GroupData(opName); + foreach (KeyValuePair _cd in cd) + { + var tagID = _cd.Key; + + var pp1 = JsonConvert.SerializeObject(_cd.Value); + var pp2 = JsonConvert.DeserializeObject(pp1); + DoWhatPlc.TagIDTagFormat TagTF = new DoWhatPlc.TagIDTagFormat(tagID, pp2); + + TagIDTagFormatList.Add(TagTF); + } + return TagIDTagFormatList; + } + catch (Exception err) + { + return null; + + } + + } + } + + + +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesWorkPlc.cs b/Common/09MesDataFunction/MesDataFunction/MesWorkPlc.cs new file mode 100644 index 0000000..40cc46e --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesWorkPlc.cs @@ -0,0 +1,40 @@ +using MesWork; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesDataFunction +{ + public class MesWorkPlc: PlcLinkForm + { + + public static Action D_OPCTagData_TagDataOnChangeMIS = null; + + /// + /// 监控数据的所有变化,从这里产生 + /// + /// + /// + public override void OPCTagData_TagDataOnChangeMIS(object sender, OpcData.CustomeEvetnArgs e) + { + Console.WriteLine($"【【{e.TagName}【【{e.TagValueBefore}->{e.TagValue}【【{e.TagKeepTime}"); + + if (D_OPCTagData_TagDataOnChangeMIS != null) + D_OPCTagData_TagDataOnChangeMIS(e); + // OPCTagData_TagDataOnChange(sender, e); + } + + /// + /// 定时触发,检测PLC在线状态,周期:3 s + /// + /// + /// + public override void PlcStateEvent(object sender, OpcData.PlcStateEvetnArgs eState) + { + + } + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MisDataFunction/Heartbeat.cs b/Common/09MesDataFunction/MesDataFunction/MisDataFunction/Heartbeat.cs new file mode 100644 index 0000000..2df0434 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MisDataFunction/Heartbeat.cs @@ -0,0 +1,25 @@ +//using bizFacade; +using System; +using System.Collections; +using System.Data; +//using SystemFramework; + +namespace MisDataFunction +{ + partial class Function + { + + private static void Heartbeat(string opName, string tagValue) + { + if (tagValue == "1") + { + Write_TagTypeID(15, opName, true); + } + else + { + Write_TagTypeID(15, opName, false); + } + } + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MisDataFunction/MIS.Interface.cs b/Common/09MesDataFunction/MesDataFunction/MisDataFunction/MIS.Interface.cs new file mode 100644 index 0000000..904c975 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MisDataFunction/MIS.Interface.cs @@ -0,0 +1,326 @@ + +using bizFacade; +using DoWhatPlc; +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +//using SystemFramework; + +namespace MisDataFunction +{ + public partial class Function: MIS_BASE + { + + + + /// + /// 处理MIS逻辑 TagName 变量类型代码 变量类型名称 + /// WorkStart 2 工件到位。托盘到达工位,并且托盘上有工件。 + ///RepairPartStatusPLC 3 备用 + ///RepairPathString 4 工位返修字符串(121211112222111),前2位是西门子字符串格式,第一位是总长度,第二位是实际长度 + ///EngineTypeGetOverMES 5 MES传递总成信息给PLC(上线工位) + ///PartPalletGoOver 6 上线工位。0:正常工作;1:空托盘放行,PLC读取到此标志不走申请上线逻辑。 + ///MaterialVerifyOver 7 MES保存完质量数据,物料数据等与PLC信号交互完成后通知PLC,所以工步都完成,才可以放行工件,正常工作时工件放行的必要条件。 + ///FalseGo 8 按MES界面[不合格放行] 按钮,MES发送此信号。操作者判断工件不合格,通知设备,按不合格方式放行工件,工件流转到返修下线工位后,返修下线。MES工作完成MES0.3=1,MES合格放行MES0.5=0,MES0.4=1 + ///EngineTypeID 9 MES发动机机型标志(必须PLC) + ///EngineID 10 MES发动机编号(必须PLC) + ///EngineType 11 MES发动机机型(必须PLC) + ///PartPalletStatus 13 MES激发变量托盘到位离开(必须PLC) + ///HeartBeatPLC 14 心跳处理:PLC收到MES心跳信号后,PLC延时5秒后,数值取反再写回PLC,写回PLC开始计时,如果5秒钟MES无反馈报通讯故障。 + ///HeartBeatMIS 15 间隔时间5S,心跳处理。收到PLC心跳信号后,MES按原值回写。PLC收到MES信号后延时5秒,取反写入,以此循环。 + ///TargetTimeRead 16 MES允许可读工位运行时间 + ///MachineTargetTime 17 目标运行时间 + ///MachineActualTime 18 实际运行时间 + ///MesRead 19 质量数据可以读数据 + ///MesReadOver 20 MES保存完数据(必须MIS) + ///QualityMask 21 质量数据工位合格标志0:没有工作;1:合格 ;2 :不合格(必须PLC) + ///PalletInfo 22 0空托盘,1合格件,2不合格件 + ///RepairStatusPLC 23 0正常件,1返修件 + ///Reserved_3 24 备用 + ///Reserved_4 25 备用 + ///Reserved_5 26 备用 + ///Reserved_6 27 备用 + ///Reserved_7 28 备用 + ///Reserved_8 29 备用 + ///Reserved_9 30 备用 + ///Reserved_10 31 备用 + ///Reserved_11 32 备用 + ///Reserved_12 33 备用 + ///Reserved_13 34 备用 + ///Reserved_14 35 备用 + ///PLCSPareint1 36 备用 + ///PLCSPareint2 37 备用 + ///PLCSPareint3 38 备用 + ///PLCSarestring1 39 备用 + ///PLCSarestring2 40 备用 + ///MarkID 42 机体打标号(MES)前2位是西门子字符串格式,第一位是总长度,第二位是实际长度 + ///PartLoad 43 上线工位,PLC向MES申请总成编号。收到该信号后,MES将机型标志(DBB22 ~23)、总成号(DBB24 ~63)、总成机型DBB64 ~103写入PLC。之后MES通过信号“传递机型(DBX0.1)”通知PLC。 + ///EngineTypeGetOverPLC 44 PLC将机型标志(DBB50…51)、工件编号(DBB52…101)、产品型号(DBB102…187)、托盘编号(DBB188…189)准备完毕后,通知MES。 + ///PartLoadOK 48 备用 + ///Reserved_18 49 备用 + ///PalletDown 50 暂时保留,项目未使用 + ///ConfirmOkGo 51 按MES界面[合格放行] 按钮,MES发送此信号。操作者判断工件合格,通知设备,工件按合格方式放行工件。MES工作完成MES0.3=1,MES合格放行MES0.5=1,MES0.4=0 + ///ResetDevice 52 针对手动工位,无HMI,需要复位设备在MES页面操作。 + ///UnloadCompleted 53 暂时保留,项目未使用 + ///MachineTime_ReadOver 54 备用 + ///Reserved_19 58 备用 + ///FixOK 59 手动拧紧工位,单工步螺栓拧紧完成,通知PC读取数据。 + ///Reserved_21 61 备用 + ///Reserved_22 62 备用 + ///Reserved_23 63 备用 + ///Reserved_24 64 备用 + ///Reserved_25 65 备用 + ///FixAllow 66 设备工作的必须信号,对于有物料验证的工位,MES验证完成给出此信号,对于无物料验证工位,MES直接给出此信号。 + ///FixOver 67 用于手动拧紧且有质量数据工位。通知设备当前工步拧紧螺钉工作结束。 + ///MatchingCompleted 68 分线上总线,匹配成功是1;不成功是0。 + ///Match 69 分线上总线,匹配成功是1;不成功是0。 + ///Reserved_2 70 备用 + ///IsAutoGetEngineID 71 自动手动申请工件编号。0是自动方式;1:手动方式。暂时保留,生成流水号方式是在数据库中实现的 + ///RepairUplineMES 72 上线清空MOBY(针对上线工位):通知PLC从新开始申请上线流程 + ///EngineTypeID_MES 73 MES发动机机型标志(必须MES) + ///EngineID_MES 74 MES发动机编号(必须MES) + ///EngineType_MES 75 MES发动机机型(必须MES) + ///Reserved_20 76 备用 + ///ProcessCode 77 手动拧紧工位:由MES通知PLC拧紧序号 + ///OnLineState 79 通过线体工位PC实现下达工位工作状态:工位有三种状态:在线、离线、屏蔽。在线:0正常状态,实现正常功能。1离线:设备脱离MES工作,进入不交互模式。 + ///PartPalletCode 80 托盘编号(B5A) + ///BoltCode 88 手动拧紧工位:指导PLC所用套筒 + ///RepairStatus 93 0正常件,1返修件。对于上线工位MES给出是正常上线还是返修上线,返修路径 + ///Reserved_15 110 备用 + ///Reserved_16 111 备用 + ///Reserved_17 112 备用 + ///SPareint1 113 备用int1 + ///SPareint2 114 备用int2 + ///SPareint3 115 备用int3 + ///Sparestring1 116 备用字符串1 + ///Sparestring2 117 备用字符串2 + ///MachineStatusPutOn 1000 机床上电(必须PLC) + ///MachineStatusWorkOn 1001 循环开始(必须PLC) + ///MachineStatusAlarm 1002 机床故障(必须PLC) + ///MachineStatusNoPart 1003 上料无件(必须PLC) + ///MachineStatusBlock 1004 下料堵塞(必须PLC) + ///Alarm 103 设备报警 + /// + /// + public static void MIS_Funtion(object e) + { + try + { + + string recData = e.ToString(); + string[] dataArray = recData.Split('|'); + if (dataArray.Length != 4) + return; + //消息来源 + string m_Source = dataArray[0].ToString(); + //消息类型 + string m_Command = dataArray[1].ToString(); + //工位号 + string m_OpName = dataArray[2].ToString(); + //消息参数 + string m_Value = dataArray[3].ToString(); + + DoWhatPlc.ReturnValueString rv = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + //Console.WriteLine($"【【{rv.TagID}【【【【{ rv.TagKeepTime}"); + + int tagType; + string opName; + string tagValue; + int tagid; + DoWhatPlc.ReturnValueString msgEvent = rv; + if (msgEvent.TagValue == null) return; + tagType = Convert.ToInt32(msgEvent.TagTypeID); + opName = msgEvent.OpName.ToString(); + tagid = Convert.ToInt32(msgEvent.TagID); + + + //int tagType; + //string opName; + //string tagValue; + //int tagid; + //DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + //if (msgEvent.TagValue == null) return; + //tagType = Convert.ToInt32(msgEvent.TagType); + //opName = msgEvent.OpName.ToString(); + //tagid = Convert.ToInt32(msgEvent.TagKey); + switch (Convert.ToInt32(msgEvent.TagTypeCodeID)) + { + case 11: + switch (msgEvent.TagValue.ToLower()) + { + case "1": + case "true": + tagValue = "1"; + break; + default: + tagValue = "0"; + break; + } + break; + default: + tagValue = msgEvent.TagValue.ToString(); + break; + } + ///根据信号处理逻辑 + switch (tagType) + { + case 19: + //允许保存 + MesRead(opName, tagValue, tagid); + break; + case 14: + //心跳 + Heartbeat(opName, tagValue); + break; + case 44://PLC传递机型过后 才允许保存过站信息,否则不允许保存 + //if (tagValue == "1") + //{ + // IsEngTypeGetOver_Write(opName, true); + + // EngineData Enginedata = new EngineData(DtWebApi.ReadWritePLC.ReadPLC("10", opName).ToString(), Convert.ToInt32(DtWebApi.ReadWritePLC.ReadPLC("80", opName))); + // //EngineData Enginedata = new EngineData(MesDataFunction.OpcOperation.ReadPLC(10, opName).ToString(), Convert.ToInt32(MesDataFunction.OpcOperation.ReadPLC(80, opName))); + // //保存产品编号、托盘号 保存过站信息用 + // EngineData_Hash_Write(opName, Enginedata); + //} + break; + case 2://工件到位 + WorkStart( rv); + + + //WorkStart(opName, tagValue); + break; + case 51: + if (hashtableOpName_IsHaveComputer[opName].ToString() == "1") + { + SaveProductLeaveData(opName, 1); + } + + break; + case 8: + if (hashtableOpName_IsHaveComputer[opName].ToString() == "1") + { + SaveProductLeaveData(opName, 2); + } + break; + case 103: + + Alarm_Insert(rv); + + break; + } + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + } + } + private static void Alarm_Insert(ReturnValueString rv) + { + string TagID; + string opName; + string tagTypeID; + int TagValue; + + DateTime alarmStartTime; + DateTime alarmEndTime; + int TimeDiff; + string TagOrderBy; + string Text1; + string Text2; + TagID = rv.TagID; + tagTypeID = rv.TagTypeID; + opName = rv.OpName; + TagValue = Convert.ToInt32( rv.TagValue); + + alarmStartTime = Convert.ToDateTime( rv.TimeStampBefore); + alarmEndTime = Convert.ToDateTime( rv.TimeStamp); + TimeDiff = Convert.ToInt32(rv.TagKeepTime); + TagOrderBy = rv.TagOrderBy; + Text1 = rv.ItemName; + Text2 = rv.ShaftID; + + BaseDataSystemMES.Alarm_Insert(TagID, tagTypeID, opName, TagValue, + alarmStartTime, alarmEndTime, TimeDiff, Text1, Text2, TagOrderBy); + } + private static void WorkStart(ReturnValueString rv) + { + + + + var ro = rv.ReturnValueToObject(); + + string opName = ro.OpName; + DateTime arrivedTime = ro.TimeStampBefore; + DateTime leavedTime = ro.TimeStamp; + int TimeDiff = ro.TagKeepTime; + int targetTime = 0; + string isPass = ""; + + int QualityMark=0; + string tagValue="0"; + switch (ro.TagValue.ToString().ToLower()) + { + case "1": + case "true": + tagValue = "1"; + break; + default: + tagValue = "0"; + break; + } + //if (ro.TagValue.ToString() == "0") + //{ + // //Write_TagTypeID(5, opName, false);//MES传递机型 + // //Write_TagTypeID(66, opName, false);//允许工作 + // //Write_TagTypeID(51, opName, false);//合格放行 + // //Write_TagTypeID(8, opName, false);//不合格放行 + // //Write_TagTypeID(7, opName, false);//工作完成 + // //Write_TagTypeID(20, opName, false);//保存完成 + + // //string isHaveComputer = hashtableOpName_IsHaveComputer[opName].ToString(); + // //if (Convert.ToInt32(isHaveComputer) == 0)//自动工位 读合格标志 + // //{ + // // if (IsEngTypeGetOver_Read(opName)) + // // { + // // //PLC未传递机型 不保存过站信息 + // // SaveProductLeaveData_AutoWorkStation(opName, Convert.ToInt32(DtWebApi.ReadWritePLC.ReadPLC("21", opName))); + // // //SaveProductLeaveData_AutoWorkStation(opName, Convert.ToInt32(MesDataFunction.OpcOperation.ReadPLC(21, opName))); + // // } + + // //} + + // ////清空信号 + // ////m_WorkStart_OpName[opName] = 0;//清空工件到位标志 + // ////通知WEB更新产量 + // //SendActuallyCount(opName, 0); + //} + + QualityMark = Convert.ToInt32(ReadPLC(21, opName)); + + if (QualityMark == 1) + { + isPass = "1"; + } + else + { + isPass = "0"; + } + int EngineTypeID;//机型代码 + int PartPallet_Code;//托盘编号 + string EngineType;//机型 + string EngineID;//工件编号 + string OrderForm; + MIS_BASE.GetEngineTypeFromPLC(opName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code,out OrderForm); + + //EngineData Enginedata = (EngineData)EngineData_Hash_Read(opName); + BaseDataSystemMES.WorkStartInsert_AutoWorkStation(opName, EngineID, PartPallet_Code, arrivedTime, leavedTime, TimeDiff, targetTime, null, isPass, 0); + + } + + + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MisDataFunction/MesRead.cs b/Common/09MesDataFunction/MesDataFunction/MisDataFunction/MesRead.cs new file mode 100644 index 0000000..cc1fd54 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MisDataFunction/MesRead.cs @@ -0,0 +1,465 @@ +//using BasicData; +using bizFacade; +using DoWhatPlc; +using Newtonsoft.Json; +//using bizFacade; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +//using SystemFramework; + +namespace MisDataFunction +{ + partial class Function + { + /// + /// 获取质量数据Hashtable + /// + /// + /// + //static public Hashtable ReadPLC_Sync_DataList_MesRead(string opName) + //{ + // return (Hashtable)MesDataFunction.OpcOperation.ReadPLC_Sync_DataList_MesRead(opName); + //} + static object lockerReadPLC_Sync_DataList_MesRead1 = new object(); + public static void ReadPLC_Sync_DataList_MesRead(string opName, out Hashtable valueList, out DataTable BasicDataTagValue, out DataTable BasicDataTagValueUpDown, out Hashtable hashtable_EngineTypeID, out Hashtable hashtable_tagTable_OpName_SaveData) + { + //QualityDataSaveList QualityDataType + valueList = new Hashtable(); + //var qualityDataSaveList = DtWebApi.SaveData.ReadPLC_Sync_DataList_MesRead(opName); + var qualityDataSaveList = MesServerWork.MIS_BASE.ReadPLC_Sync_DataList_MesRead(opName); + foreach (DictionaryEntry de in qualityDataSaveList.valuList) + { + valueList.Add(de.Key, JsonConvert.DeserializeObject(de.Value.ToString())); + } + BasicDataTagValue = qualityDataSaveList.BasicDataTagValue; + BasicDataTagValueUpDown = qualityDataSaveList.BasicDataTagValueUpDown; + hashtable_EngineTypeID = qualityDataSaveList.hashtable_EngineTypeID; + hashtable_tagTable_OpName_SaveData = qualityDataSaveList.hashtable_tagTable_OpName_SaveData; + } + public static Hashtable ReadPLC_Sync_DataList_MesRead(string opName) + { + lock (lockerReadPLC_Sync_DataList_MesRead1) + { + Hashtable ht = new Hashtable(); + var cd = ReadPLC_GroupData(opName); + //var cd = PlcLinkForm.ReadPLC_GroupData(opName); + + foreach (var _cd in cd) + { + var tagID = Convert.ToInt32(_cd.TagID); + var TF =_cd.TF; + + QualityDataType qualityDataType; + qualityDataType = new QualityDataType(); + + qualityDataType.tagID = TF.TagID; + qualityDataType.tagTypeID = TF.TagTypeID;//变量类型 + qualityDataType.opName = opName; + qualityDataType.isGoodBad = 192; + int.TryParse(TF.TagQuality, out int TagQuality); + qualityDataType.tagQuality = TagQuality; + qualityDataType.tagValueType = TF.TagTypeCodeID; + int.TryParse(TF.TagOrderBy, out int TagOrderBy); + qualityDataType.tagOrderBy = TagOrderBy; + int.TryParse(TF.TagItemOrderBy, out int TagItemOrderBy); + qualityDataType.tagItemOrderBy = TagItemOrderBy; + qualityDataType.tagProperty = TF.TagProperty;//变量特点 + qualityDataType.tagValue = TF.TagValue;//变量值 + + ht.Add(tagID, qualityDataType); + } + return ht; + } + + } + + /// + /// 允许保存(针对半自动和手动压装工位) + /// + /// + /// + private static void MesRead(string opName, string tagValue, int tagid) + { + if (tagValue == "0") + { + Write_TagTypeID(20, opName, false); + } + else + { + SaveQualityData(opName, Convert.ToInt32(tagValue), tagid); + } + } + + private static void SaveQualityData(string opName, int tagValue, int tagID) + { + try + { + int id_tagCF; + int qualityMask = 0; + int engineTypeID = 0; + string engineID = ""; + string engineType = ""; + string engineTraceCode = ""; + string engineCap = ""; + string partPallet = ""; + DataTable dt_WWW; + dt_WWW = BaseDataSystemMES.BuildDataTables_WWW(); + Hashtable valueList; + //valueList = ReadPLC_Sync_DataList_MesRead(opName); + ReadPLC_Sync_DataList_MesRead(opName, out valueList, out BasicDataTagValue, out BasicDataTagValueUpDown, out hashtable_EngineTypeID, out hashtable_tagTable_OpName_SaveData); + valueList = GetQualityData_GoodBad_Values(valueList); + int mes_MustTest = 0; + int onLineState = 0; + int partMoveDirection = 0; + int pressIsOK = 0; + int pressIsNoOK = 0; + BaseDataSystemMES.GetQualityDataTable_B5A(valueList, opName, BasicDataTagValue, + BasicDataTagValueUpDown, + out dt_WWW,//数据列表 + out qualityMask,//工位合格标志 + out engineTypeID,//发动机类型代码 + out engineID,//发动机编号 + out engineType, //发动机型号 + out partPallet,//托盘编号 + out engineTraceCode, //发动机条码 + out engineCap,//缸盖号, + hashtable_EngineTypeID,//发动机类型转换表 + out mes_MustTest, out onLineState, out partMoveDirection, out pressIsOK, out pressIsNoOK); + + + + + // 1:通过监控系统保存采集的质量数据;0:不通过监控系统保存采集的质量数据 + if (Convert.ToInt32(hashtable_tagTable_OpName_SaveData[opName]) != 0) + { + DateTime lastupdatetime = DateTime.Now; + + BaseDataSystemMES.BaseData_tagTable_QualityData_B5A_IndexInsert(engineID, tagID, engineType, engineTypeID, opName, qualityMask, partPallet, out id_tagCF); + BaseDataSystemMES.BaseData_tagTable_QualityData_B5A_Insert(id_tagCF, engineTypeID, engineID, opName, dt_WWW); + + } + Write_TagTypeID(20, opName, true); + #region + //string orderForm = ""; + //string operatorCode = ""; + //int shiftCode = 1; + //DateTime arrivedTime; + //DateTime leavedTime; + //int TimeDiff; + //int targetTime = 0; + //string lineType = ""; + //string isPass; + //int machineWorkOn = 0; + //int arrivedOrLeaved = 2; + //int cartColorOpName = 0; + //int cartColorConfirm = 0; + //// int partMoveDirection; + //int partGoOver = 0; + //if (qualityMask == 1) + //{ + // isPass = "PASS"; + //} + //else + //{ + // isPass = "FAIL"; + //} + + ////工位上下线类型 + ////(0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + //int OpNameUpDownType; + //OpNameUpDownType = Convert.ToInt32(hashtableOpName_OpType[opName]); + //arrivedTime = (DateTime)m_WorkStart_OpName_Time[opName]; + //leavedTime = DateTime.Now; + //TimeDiff = Convert.ToInt32(leavedTime.Subtract(arrivedTime).TotalSeconds); + + //lineType = hashtableOpName_LineType[opName].ToString(); + + //string isHaveComputer = hashtableOpName_IsHaveComputer[opName].ToString(); + ////isHaveComputer = MIS_BASE.hashtable_tagTable_OpName_SaveData[opName].ToString(); + ////有计算机的工位,通过工位计算机保存[测量数据发动机在线状态]。 + //if (Convert.ToInt32(isHaveComputer) == 0) + //{ + // //1->0 工件离开 工件刚刚离开 + // if (Convert.ToInt32(m_WorkStart_OpName[opName]) == 1) + // { + + // //[测量数据发动机在线状态] + // QualityDataSystem.WorkStartInsert + // (opName, orderForm, engineTypeID, engineType, engineID, partPallet.ToString(), operatorCode, shiftCode, + // arrivedTime, leavedTime, TimeDiff, targetTime, lineType, isPass, machineWorkOn, + // arrivedOrLeaved, cartColorOpName, cartColorConfirm, partMoveDirection, partGoOver, mes_MustTest, onLineState, OpNameUpDownType); + // } + //} + #endregion + } + catch (Exception err) + { + Write_TagTypeID(20, opName, true); + ////ApplicationLog.WriteLog(err, err.Message); + } + + } + public static void SaveQualityData_Mes(string opName, int tagID) + { + try + { + int id_tagCF; + int qualityMask = 0; + int engineTypeID = 0; + string engineID = ""; + string engineType = ""; + string engineTraceCode = ""; + string engineCap = ""; + string partPallet = ""; + DataTable dt_WWW; + dt_WWW = BaseDataSystemMES.BuildDataTables_WWW(); + Hashtable valueList; + valueList = ReadPLC_Sync_DataList_MesRead(opName); + valueList = GetQualityData_GoodBad_Values(valueList); + int mes_MustTest = 0; + int onLineState = 0; + int partMoveDirection = 0; + int pressIsOK = 0; + int pressIsNoOK = 0; + BaseDataSystemMES.GetQualityDataTable_B5A(valueList, opName, BasicDataTagValue, + BasicDataTagValueUpDown, + out dt_WWW,//数据列表 + out qualityMask,//工位合格标志 + out engineTypeID,//发动机类型代码 + out engineID,//发动机编号 + out engineType, //发动机型号 + out partPallet,//托盘编号 + out engineTraceCode, //发动机条码 + out engineCap,//缸盖号, + hashtable_EngineTypeID,//发动机类型转换表 + out mes_MustTest, out onLineState, out partMoveDirection, out pressIsOK, out pressIsNoOK); + // 1:通过监控系统保存采集的质量数据;0:不通过监控系统保存采集的质量数据 + if (Convert.ToInt32(hashtable_tagTable_OpName_SaveData[opName]) != 0) + { + DateTime lastupdatetime = DateTime.Now; + BaseDataSystemMES.BaseData_tagTable_QualityData_B5A_IndexInsert(engineID, tagID, engineType, engineTypeID, opName, qualityMask, partPallet, out id_tagCF); + //BaseDataSystemMES.BaseData_tagTable_QualityData_B5A_Insert(id_tagCF, engineTypeID, engineID, opName, dt_WWW); + + } + + + } + catch (Exception err) + { + Write_TagTypeID(20, opName, true); + ////ApplicationLog.WriteLog(err, err.Message); + } + + } + + /// + /// 确定合格标志 + /// + /// + /// + static public Hashtable GetQualityData_GoodBad_Values(Hashtable valuList) + { + try + { + Hashtable valuList_Temp; + valuList_Temp = (Hashtable)valuList.Clone(); + int[] value_GoodBad_New = new int[128]; + int tagID; + QualityDataType value; + //1:获得合格标志 + foreach (DictionaryEntry de in valuList) //ht为一个Hashtable实例 + { + tagID = Convert.ToInt32(de.Key); + value = (QualityDataType)de.Value; + + //拧紧数据合格标志 + if (value.tagProperty == 1) + { + if (value.tagTypeID == 8203) + { + value_GoodBad_New = (int[])value.tagValue; + break; + } + else + { + value_GoodBad_New[value.tagOrderBy - 1] = Convert.ToInt32(value.tagValue); + } + } + //拧紧数据合格标志 + if (value.tagProperty == 8) + { + if (value.tagTypeID == 8203) + { + value_GoodBad_New = (int[])value.tagValue; + break; + } + else + { + value_GoodBad_New[value.tagOrderBy - 1] = Convert.ToInt32(value.tagValue); + } + } + //压装数据合格标志 + if (value.tagProperty == 7) + { + value_GoodBad_New[value.tagOrderBy - 1] = Convert.ToInt32(value.tagValue); + } + } + //将合格标志赋予每个变量 + foreach (DictionaryEntry de in valuList) //ht为一个Hashtable实例 + { + tagID = Convert.ToInt32(de.Key); + value = (QualityDataType)de.Value; + //201706061720新加 + if (value .tagTypeID ==11) + { + if (value.tagValue.ToString ()=="False") + { + value.tagValue ="0"; + } + else + { + value.tagValue = "1"; + } + valuList_Temp[tagID] = value; + //value.tagValue = Convert.ToInt32(value.tagValue); + } + + + //测量变量 + if (value.tagProperty == 2 || value.tagProperty == 6) + { + try + { + if (value_GoodBad_New != null) + { + value.isGoodBad = Convert.ToInt32(value_GoodBad_New[value.tagOrderBy - 1]); + valuList_Temp[tagID] = value; + } + else + { + value.isGoodBad = 0; + valuList_Temp[tagID] = value; + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + + } + } + + + + } + return valuList_Temp; + } + catch//转换出了故障时 + { + return valuList; + } + } + + + + /// + /// 制定工位PLC是否传递过机型 (默认不传递机型不保存过站信息) + /// + static Hashtable EngTypeGetOver = new Hashtable(); + + static Hashtable EngineData_Hash = new Hashtable(); //保存 + + public static void IsEngTypeGetOver_Write(string OpName, bool value) + { + if (EngTypeGetOver.ContainsKey(OpName)) + { + EngTypeGetOver[OpName] = value; + } + else + { + EngTypeGetOver.Add(OpName, value); + } + } + + + public static bool IsEngTypeGetOver_Read(string OpName) + { + if (EngTypeGetOver.ContainsKey(OpName)) + { + return Convert.ToBoolean(EngTypeGetOver[OpName]); + } + else + { + return true; + } + } + + public static void EngineData_Hash_Write(string OpName, object value) + { + if (EngineData_Hash.ContainsKey(OpName)) + { + EngineData_Hash[OpName] = value; + + } + else + { + EngineData_Hash.Add(OpName, value); + } + } + + public static object EngineData_Hash_Read(string OpName) + { + if (EngineData_Hash.ContainsKey(OpName)) + { + return EngineData_Hash[OpName]; + } + else + { + return null; + } + + } + + + private DataTable ChangeQualificationMark(DataTable dt) + { + var dtNew = dt.Copy(); + for (int i = 0; i < dt.Rows.Count; i++) + { + var 变量排序 = dt.Rows[i]["变量排序"].ToString(); + if (变量排序 == "0") + { + + } + } + + + return dtNew; + } + + + + + } + struct EngineData + { + public EngineData(string engineID, int pallet) + { + EngineID = engineID; + Pallet = pallet; + } + + public string EngineID;//工件编号 + //public string EngineType; + //public int EngineTypeID; + public int Pallet;//托盘号 + + } + + + + + + +} diff --git a/Common/09MesDataFunction/MesDataFunction/MisDataFunction/WorkStart.cs b/Common/09MesDataFunction/MesDataFunction/MisDataFunction/WorkStart.cs new file mode 100644 index 0000000..d3901e8 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MisDataFunction/WorkStart.cs @@ -0,0 +1,236 @@ +//using BasicData; +using bizFacade; +//using DataBaseAccess; +//using bizFacade; +using DataLinkMesWork; +using MesServerWork; +using System; +using System.Collections; +using System.Data; +using System.Data.SqlClient; +//using SystemFramework; + +namespace MisDataFunction +{ + partial class Function + { + /// + /// 工件到位与离开时,清空MES自身信号 + /// + /// + /// + private static void WorkStart(string opName, string tagValue) + { + try + { + //工位没有工件,或工件刚刚离开 工件离开工位后,清空该工位的发动机号 + if (tagValue == "0") + { + Write_TagTypeID(5, opName, false);//MES传递机型 + Write_TagTypeID(66, opName, false);//允许工作 + Write_TagTypeID(51, opName, false);//合格放行 + Write_TagTypeID(8, opName, false);//不合格放行 + Write_TagTypeID(7, opName, false);//工作完成 + Write_TagTypeID(20, opName, false);//保存完成 + + //string isHaveComputer = hashtableOpName_IsHaveComputer[opName].ToString(); + //if (Convert.ToInt32(isHaveComputer) == 0)//自动工位 读合格标志 + { + if (IsEngTypeGetOver_Read(opName)) + { + //PLC未传递机型 不保存过站信息 + SaveProductLeaveData_AutoWorkStation(opName, Convert.ToInt32(ReadPLC(21, opName))); + //SaveProductLeaveData_AutoWorkStation(opName, Convert.ToInt32(MesDataFunction.OpcOperation.ReadPLC(21, opName))); + } + + } + + //清空信号 + //m_WorkStart_OpName[opName] = 0;//清空工件到位标志 + //通知WEB更新产量 + SendActuallyCount(opName,0); + } + else + { + //保存工件到达数据 + //m_WorkStart_OpName_Time[opName] = DateTime.Now; + //m_WorkStart_OpName[opName] = 1; + } + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + + } + } + /// + /// 保存过站信息 (数据库读机型信息) + /// + /// + /// + static void SaveProductLeaveData(string opName, int QualityMark) + { + try + { + if (!IsEngTypeGetOver_Read(opName)) + { + //PLC未传递机型 不保存过站信息 + return; + } + IsEngTypeGetOver_Write(opName, false);//清空传递机型标志 + + DateTime arrivedTime; + DateTime leavedTime; + int TimeDiff; + int targetTime = 0; + string lineType = ""; + string isPass; + if (QualityMark == 1) + { + isPass = "PASS"; + } + else + { + isPass = "FAIL"; + } + //工位上下线类型 + //(0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + int OpNameUpDownType; + OpNameUpDownType = Convert.ToInt32(hashtableOpName_OpType[opName]); + arrivedTime = (DateTime)m_WorkStart_OpName_Time[opName]; + leavedTime = DateTime.Now; + TimeDiff = Convert.ToInt32(leavedTime.Subtract(arrivedTime).TotalSeconds); + lineType = hashtableOpName_LineType[opName].ToString(); + + //1->0 工件离开 工件刚刚离开 + //if (Convert.ToInt32(m_WorkStart_OpName[opName]) == 1) + //{ + // WorkStartInsert(opName, arrivedTime, leavedTime, TimeDiff, targetTime, lineType, isPass, OpNameUpDownType); + //} + //通知WEB更新产量 + SendActuallyCount(opName, 0); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + + } + + + } + /// + /// 保存过站信息 (数据库读机型信息) + /// + /// + /// + static void SaveProductLeaveData_AutoWorkStation(string opName, int QualityMark) + { + try + { + if (!IsEngTypeGetOver_Read(opName)) + { + //PLC未传递机型 不保存过站信息 + return; + } + IsEngTypeGetOver_Write(opName, false);//清空传递机型标志 + + DateTime arrivedTime; + DateTime leavedTime; + int TimeDiff; + int targetTime = 0; + string lineType = ""; + string isPass; + if (QualityMark == 1) + { + isPass = "PASS"; + } + else + { + isPass = "FAIL"; + } + //工位上下线类型 + //(0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + int OpNameUpDownType; + //OpNameUpDownType = Convert.ToInt32(hashtableOpName_OpType[opName]); + // arrivedTime = (DateTime)m_WorkStart_OpName_Time[opName]; + leavedTime = DateTime.Now; + //TimeDiff = Convert.ToInt32(leavedTime.Subtract(arrivedTime).TotalSeconds); + //lineType = hashtableOpName_LineType[opName].ToString(); + + //1->0 工件离开 工件刚刚离开 + //if (Convert.ToInt32(m_WorkStart_OpName[opName]) == 1) + //{ + // //查询工件编号、托盘号 + //EngineData Enginedata = (EngineData)EngineData_Hash_Read(opName); + //WorkStartInsert_AutoWorkStation(opName, Enginedata.EngineID, Enginedata.Pallet, arrivedTime, leavedTime, TimeDiff, targetTime, lineType, isPass, OpNameUpDownType); + //} + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + + } + + + } + + /// + /// 测量数据发动机在线状态_增加数据 + /// + /// + /// + /// + /// + /// + /// + static public void WorkStartInsert(string opName, DateTime arrivedTime, DateTime leavedTime, int TimeDiff, int Target, string lineType, string isPass, int OpNameUpDownType) + { + string procedureName; + procedureName = "测量数据发动机在线状态_增加数据"; + SqlParameter[] thisParms = new SqlParameter[8]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@到达时间", arrivedTime); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@离开时间", leavedTime); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@在线时间", TimeDiff); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@目标时间", Target); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@线体类型", lineType); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@是否合格", isPass); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@工位上下线类型", OpNameUpDownType); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + + + /// + /// 发送在线产量、在线节拍 + /// + /// + /// + static void SendActuallyCount(string OpName, int tagValue) + { + //当工件离开时,更新在线产量、在线节拍 + if (tagValue == 0) + { + try + { + int opNameCount = 0;//在线产量 + int opNameCountTime = 0;//在线节拍 + //基本数据_工作日历_班次产量查询_New + BaseDataSystemMES.OpNameCount_New(OpName, out opNameCount, out opNameCountTime); + + string SendMessage; + SendMessage = "MES|ActuallyCount|" + OpName + "|" + opNameCount.ToString() + "&" + opNameCountTime.ToString(); + + MIS_BASE.asyncSendMessage(SendMessage); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function01:SendActuallyCount"); + } + } + } + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/Properties/AssemblyInfo.cs b/Common/09MesDataFunction/MesDataFunction/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..057bcf1 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("MesDataFunction")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MesDataFunction")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("90e76fb4-646d-45e2-95db-0b8ab4e465d6")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Common/10SignalChangeMonitorControl/10MesControl.csproj b/Common/10SignalChangeMonitorControl/10MesControl.csproj new file mode 100644 index 0000000..7bd2621 --- /dev/null +++ b/Common/10SignalChangeMonitorControl/10MesControl.csproj @@ -0,0 +1,139 @@ + + + + + Debug + AnyCPU + {FAB322CC-531D-4AEA-986A-B921B64D8D3F} + Library + Properties + MesControl + MesControl + v4.8 + 512 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + + + + UserControl + + + MesBoolSignal.cs + + + UserControl + + + PlcWorkStationSignal.cs + + + UserControl + + + PlcConnect.cs + + + + True + True + Resources.resx + + + UserControl + + + + + + MesBoolSignal.cs + + + PlcWorkStationSignal.cs + + + ResXFileCodeGenerator + Designer + Resources.Designer.cs + + + PlcConnect.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Common/10SignalChangeMonitorControl/MesBoolSignal.Designer.cs b/Common/10SignalChangeMonitorControl/MesBoolSignal.Designer.cs new file mode 100644 index 0000000..2989846 --- /dev/null +++ b/Common/10SignalChangeMonitorControl/MesBoolSignal.Designer.cs @@ -0,0 +1,79 @@ +namespace MesControl +{ + partial class MesBoolSignal + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.pictureBox_Signal = new System.Windows.Forms.PictureBox(); + this.label_SignalName = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_Signal)).BeginInit(); + this.SuspendLayout(); + // + // pictureBox_Signal + // + this.pictureBox_Signal.BackgroundImage = global::MesControl.Properties.Resources.none; + this.pictureBox_Signal.Location = new System.Drawing.Point(3, 1); + this.pictureBox_Signal.Name = "pictureBox_Signal"; + this.pictureBox_Signal.Size = new System.Drawing.Size(20, 20); + this.pictureBox_Signal.TabIndex = 0; + this.pictureBox_Signal.TabStop = false; + // + // label_SignalName + // + this.label_SignalName.AutoSize = true; + this.label_SignalName.Font = new System.Drawing.Font("宋体", 12F); + this.label_SignalName.Location = new System.Drawing.Point(32, 3); + this.label_SignalName.MaximumSize = new System.Drawing.Size(72, 16); + this.label_SignalName.MinimumSize = new System.Drawing.Size(72, 16); + this.label_SignalName.Name = "label_SignalName"; + this.label_SignalName.Size = new System.Drawing.Size(72, 16); + this.label_SignalName.TabIndex = 1; + this.label_SignalName.Text = "心跳信号"; + // + // MesBoolSignal + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Transparent; + this.Controls.Add(this.label_SignalName); + this.Controls.Add(this.pictureBox_Signal); + this.MaximumSize = new System.Drawing.Size(110, 22); + this.MinimumSize = new System.Drawing.Size(110, 22); + this.Name = "MesBoolSignal"; + this.Size = new System.Drawing.Size(110, 22); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_Signal)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.PictureBox pictureBox_Signal; + private System.Windows.Forms.Label label_SignalName; + } +} diff --git a/Common/10SignalChangeMonitorControl/MesBoolSignal.cs b/Common/10SignalChangeMonitorControl/MesBoolSignal.cs new file mode 100644 index 0000000..c3e1d98 --- /dev/null +++ b/Common/10SignalChangeMonitorControl/MesBoolSignal.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace MesControl +{ + public partial class MesBoolSignal : UserControl + { + public MesBoolSignal() + { + InitializeComponent(); + } + + /// + /// 外部调用控件触发的信号 + /// + /// + public void InputBoolSignal(bool Signal) + { + + if (Signal) + { + + pictureBox_Signal.BackgroundImage = Properties.Resources.green; + } + else + { + pictureBox_Signal.BackgroundImage = Properties.Resources.init; + } + + } + + [Browsable(true)] + [Description("控件中显示的文本内容"), Category("SignalText"), DefaultValue("")] + public string SignalText + { + get + { + return label_SignalName.Text; + } + + set + { + label_SignalName.Text = value; + } + + } + + SignalImage_Enum enum1; + + [Browsable(true)] + [Description("控件用于显示状态的图片"), Category("SignalImage"), DefaultValue("none")] + public SignalImage_Enum SignalImage + { + get + { + return enum1; + } + set + { + SetSignalImage(value); + enum1 = value; + + + + } + + + } + + + + public enum SignalImage_Enum + { + + none, init, green, yellow, red + + } + + void SetSignalImage(SignalImage_Enum Image) + { + switch (Image) + { + case SignalImage_Enum.none: + pictureBox_Signal.BackgroundImage = Properties.Resources.none; + break; + case SignalImage_Enum.init: + pictureBox_Signal.BackgroundImage = Properties.Resources.init; + break; + case SignalImage_Enum.green: + pictureBox_Signal.BackgroundImage = Properties.Resources.green; + break; + case SignalImage_Enum.yellow: + pictureBox_Signal.BackgroundImage = Properties.Resources.yellow; + break; + case SignalImage_Enum.red: + pictureBox_Signal.BackgroundImage = Properties.Resources.red; + break; + + } + + } + + + } +} diff --git a/Common/10SignalChangeMonitorControl/MesBoolSignal.resx b/Common/10SignalChangeMonitorControl/MesBoolSignal.resx new file mode 100644 index 0000000..1810bb4 --- /dev/null +++ b/Common/10SignalChangeMonitorControl/MesBoolSignal.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + \ No newline at end of file diff --git a/Common/10SignalChangeMonitorControl/MesControl.sln b/Common/10SignalChangeMonitorControl/MesControl.sln new file mode 100644 index 0000000..542454f --- /dev/null +++ b/Common/10SignalChangeMonitorControl/MesControl.sln @@ -0,0 +1,55 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32901.82 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MesControl", "MesControl.csproj", "{FAB322CC-531D-4AEA-986A-B921B64D8D3F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "00-0Json8.3.1", "..\..\Common\00-1Json8.3\Json8.3\00-0Json8.3.1.csproj", "{1A10FDB2-1A6A-44A8-AB4D-33387563247E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "00MesWorkMqtt", "..\..\Common\00MesWorkMqtt\MesWorkMqtt\00MesWorkMqtt.csproj", "{F55DA1A0-A982-4479-8C47-0D9A5AAF3E18}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "01_01DoWhatPlc", "..\..\Common\01DoWhatPlc\01_01DoWhatPlc.csproj", "{0D1AF432-439A-4920-8692-43AE139F5530}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "02_02WebApiCallPLC", "..\..\Common\02WebApiCall\02_02WebApiCallPLC.csproj", "{3E6D1DD5-01C9-435F-9941-61F906CE35BB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonitorForm", "..\MonitorForm\MonitorForm.csproj", "{488BADD9-579F-4BF3-91DC-9FA95E3181A5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {FAB322CC-531D-4AEA-986A-B921B64D8D3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FAB322CC-531D-4AEA-986A-B921B64D8D3F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FAB322CC-531D-4AEA-986A-B921B64D8D3F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FAB322CC-531D-4AEA-986A-B921B64D8D3F}.Release|Any CPU.Build.0 = Release|Any CPU + {1A10FDB2-1A6A-44A8-AB4D-33387563247E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1A10FDB2-1A6A-44A8-AB4D-33387563247E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1A10FDB2-1A6A-44A8-AB4D-33387563247E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1A10FDB2-1A6A-44A8-AB4D-33387563247E}.Release|Any CPU.Build.0 = Release|Any CPU + {F55DA1A0-A982-4479-8C47-0D9A5AAF3E18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F55DA1A0-A982-4479-8C47-0D9A5AAF3E18}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F55DA1A0-A982-4479-8C47-0D9A5AAF3E18}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F55DA1A0-A982-4479-8C47-0D9A5AAF3E18}.Release|Any CPU.Build.0 = Release|Any CPU + {0D1AF432-439A-4920-8692-43AE139F5530}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0D1AF432-439A-4920-8692-43AE139F5530}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D1AF432-439A-4920-8692-43AE139F5530}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0D1AF432-439A-4920-8692-43AE139F5530}.Release|Any CPU.Build.0 = Release|Any CPU + {3E6D1DD5-01C9-435F-9941-61F906CE35BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3E6D1DD5-01C9-435F-9941-61F906CE35BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3E6D1DD5-01C9-435F-9941-61F906CE35BB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3E6D1DD5-01C9-435F-9941-61F906CE35BB}.Release|Any CPU.Build.0 = Release|Any CPU + {488BADD9-579F-4BF3-91DC-9FA95E3181A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {488BADD9-579F-4BF3-91DC-9FA95E3181A5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {488BADD9-579F-4BF3-91DC-9FA95E3181A5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {488BADD9-579F-4BF3-91DC-9FA95E3181A5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {6372AD35-C9E4-4A9A-A52E-4F41531AC05B} + EndGlobalSection +EndGlobal diff --git a/Common/10SignalChangeMonitorControl/PlcConnect.Designer.cs b/Common/10SignalChangeMonitorControl/PlcConnect.Designer.cs new file mode 100644 index 0000000..5e44fd1 --- /dev/null +++ b/Common/10SignalChangeMonitorControl/PlcConnect.Designer.cs @@ -0,0 +1,81 @@ +namespace MesControl +{ + partial class PlcConnect + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.pictureBox_OpName = new System.Windows.Forms.PictureBox(); + this.label_OpName = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_OpName)).BeginInit(); + this.SuspendLayout(); + // + // pictureBox_OpName + // + this.pictureBox_OpName.BackgroundImage = global::MesControl.Properties.Resources.BreakPLC; + this.pictureBox_OpName.Location = new System.Drawing.Point(3, 1); + this.pictureBox_OpName.MaximumSize = new System.Drawing.Size(20, 20); + this.pictureBox_OpName.MinimumSize = new System.Drawing.Size(20, 20); + this.pictureBox_OpName.Name = "pictureBox_OpName"; + this.pictureBox_OpName.Size = new System.Drawing.Size(20, 20); + this.pictureBox_OpName.TabIndex = 0; + this.pictureBox_OpName.TabStop = false; + // + // label_OpName + // + this.label_OpName.AutoSize = true; + this.label_OpName.Font = new System.Drawing.Font("宋体", 12F); + this.label_OpName.Location = new System.Drawing.Point(32, 3); + this.label_OpName.MaximumSize = new System.Drawing.Size(72, 16); + this.label_OpName.MinimumSize = new System.Drawing.Size(72, 16); + this.label_OpName.Name = "label_OpName"; + this.label_OpName.Size = new System.Drawing.Size(72, 16); + this.label_OpName.TabIndex = 1; + this.label_OpName.Text = "通讯状态"; + // + // PlcConnect + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Transparent; + this.Controls.Add(this.label_OpName); + this.Controls.Add(this.pictureBox_OpName); + this.MaximumSize = new System.Drawing.Size(110, 22); + this.MinimumSize = new System.Drawing.Size(110, 22); + this.Name = "PlcConnect"; + this.Size = new System.Drawing.Size(110, 22); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_OpName)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.PictureBox pictureBox_OpName; + private System.Windows.Forms.Label label_OpName; + } +} diff --git a/Common/10SignalChangeMonitorControl/PlcConnect.cs b/Common/10SignalChangeMonitorControl/PlcConnect.cs new file mode 100644 index 0000000..6bbf2e1 --- /dev/null +++ b/Common/10SignalChangeMonitorControl/PlcConnect.cs @@ -0,0 +1,221 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace MesControl +{ + public delegate void PlcStatusHandle(); + public partial class PlcConnect: UserControl + { + public PlcConnect() + { + InitializeComponent(); + + } + public static PlcStatusHandle PlcBreakChange,PlcConnectChange; + + + #region 内部变量 + int externalTimerTimes =0; + + int testPlcBreakInterval=10000; + + int testPlcBreakTime=0; + + int externalTimerInterval = 200; + + bool isBreakPLC = true; + + bool plcTestEnable; + + bool plcBreakIsChanged=false; + bool plcConnectIsChanged = false; + + #endregion + #region 内部方法 + + void TimerTimeChange() + { + if (externalTimerTimes == 999) + { + externalTimerTimes = 0; + } + else + { + externalTimerTimes++; + } + + if (testPlcBreakTime > 0) + { + testPlcBreakTime--; + plcBreakIsChanged = false; + + if (PlcConnectChange!=null&&!plcConnectIsChanged) + { + PlcConnectChange(); + plcConnectIsChanged = true; + } + } + else + { + if (plcTestEnable) + { + if(PlcBreakChange != null&& !plcBreakIsChanged) + { + PlcBreakChange(); + plcBreakIsChanged = true; + } + plcConnectIsChanged = false; + } + isBreakPLC = true; + } + + } + #endregion + + #region 外部方法 + public void ExternalTimer() + { + + if (!isBreakPLC) + { + switch (externalTimerTimes % 5) + { + case 0: + pictureBox_OpName.BackgroundImage = Properties.Resources.PlcConnect0; + break; + case 1: + pictureBox_OpName.BackgroundImage = Properties.Resources.PlcConnect1; + break; + case 2: + pictureBox_OpName.BackgroundImage = Properties.Resources.PlcConnect2; + break; + case 3: + pictureBox_OpName.BackgroundImage = Properties.Resources.PlcConnect3; + break; + case 4: + pictureBox_OpName.BackgroundImage = Properties.Resources.PlcConnect4; + break; + + } + } + else + { + pictureBox_OpName.BackgroundImage = Properties.Resources.BreakPLC; + } + + + TimerTimeChange(); + } + + + + + public void ExternalPlcConnect() + { + testPlcBreakTime = (testPlcBreakInterval / externalTimerInterval) + 1; + isBreakPLC = false; + + } + + public void PlcBreak() + { + pictureBox_OpName.BackgroundImage = Properties.Resources.BreakPLC; + isBreakPLC = true; + } + + #endregion + + #region 属性 + + [Browsable(true)] + [Description("控件中显示的文本内容"), Category("外观"), DefaultValue("OP0000")] + public string LabelText + { + get + { + return label_OpName.Text; + } + + set + { + label_OpName.Text = value; + } + + } + + + [Browsable(true)] + [Description("外部定时器周期"), Category("行为"), DefaultValue("200")] + public int ExternalTimerInterval + { + get + { + return externalTimerInterval; + } + + set + { + externalTimerInterval = value; + } + + } + + [Browsable(true)] + [Description("检测PLC在线状态超时,超过此时间,PLC为离线状态"), Category("行为"), DefaultValue("200")] + public int TestPlcBreakInterval + { + get + { + return testPlcBreakInterval; + } + + set + { + testPlcBreakInterval = value; + } + + } + + [Browsable(true)] + [Description("指示PLC是否为断开状态"), Category("行为"), DefaultValue("True")] + public bool IsBreakPLC + { + get + { + return isBreakPLC; + } + + set + { + isBreakPLC = value; + } + + } + + [Browsable(true)] + [Description("是否启用检测PLC在线状态功能"), Category("行为"), DefaultValue("True")] + public bool PlcTestEnable + { + get + { + return plcTestEnable; + } + + set + { + plcTestEnable = value; + } + + } + + #endregion + + + } +} diff --git a/Common/10SignalChangeMonitorControl/PlcConnect.resx b/Common/10SignalChangeMonitorControl/PlcConnect.resx new file mode 100644 index 0000000..0abf881 --- /dev/null +++ b/Common/10SignalChangeMonitorControl/PlcConnect.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + \ No newline at end of file diff --git a/Common/10SignalChangeMonitorControl/PlcWorkStationSignal.Designer.cs b/Common/10SignalChangeMonitorControl/PlcWorkStationSignal.Designer.cs new file mode 100644 index 0000000..e4e1488 --- /dev/null +++ b/Common/10SignalChangeMonitorControl/PlcWorkStationSignal.Designer.cs @@ -0,0 +1,80 @@ +namespace MesControl +{ + partial class PlcWorkStationSignal + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.groupBox_WorkStationGrp = new System.Windows.Forms.GroupBox(); + this.plcConnect_WorkStation = new MesControl.PlcConnect(); + this.groupBox_WorkStationGrp.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox_WorkStationGrp + // + this.groupBox_WorkStationGrp.BackColor = System.Drawing.Color.Transparent; + this.groupBox_WorkStationGrp.Controls.Add(this.plcConnect_WorkStation); + this.groupBox_WorkStationGrp.Location = new System.Drawing.Point(4, 4); + this.groupBox_WorkStationGrp.Name = "groupBox_WorkStationGrp"; + this.groupBox_WorkStationGrp.Size = new System.Drawing.Size(125, 50); + this.groupBox_WorkStationGrp.TabIndex = 0; + this.groupBox_WorkStationGrp.TabStop = false; + this.groupBox_WorkStationGrp.Text = "OP0000"; + // + // plcConnect_WorkStation + // + this.plcConnect_WorkStation.BackColor = System.Drawing.Color.Transparent; + this.plcConnect_WorkStation.ExternalTimerInterval = 200; + this.plcConnect_WorkStation.IsBreakPLC = false; + this.plcConnect_WorkStation.LabelText = "通讯状态"; + this.plcConnect_WorkStation.Location = new System.Drawing.Point(7, 21); + this.plcConnect_WorkStation.MaximumSize = new System.Drawing.Size(110, 22); + this.plcConnect_WorkStation.MinimumSize = new System.Drawing.Size(110, 22); + this.plcConnect_WorkStation.Name = "plcConnect_WorkStation"; + this.plcConnect_WorkStation.PlcTestEnable = false; + this.plcConnect_WorkStation.Size = new System.Drawing.Size(110, 22); + this.plcConnect_WorkStation.TabIndex = 0; + this.plcConnect_WorkStation.TestPlcBreakInterval = 0; + // + // PlcWorkStationSignal + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Transparent; + this.Controls.Add(this.groupBox_WorkStationGrp); + this.Name = "PlcWorkStationSignal"; + this.Size = new System.Drawing.Size(136, 60); + this.groupBox_WorkStationGrp.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox_WorkStationGrp; + private PlcConnect plcConnect_WorkStation; + } +} diff --git a/Common/10SignalChangeMonitorControl/PlcWorkStationSignal.cs b/Common/10SignalChangeMonitorControl/PlcWorkStationSignal.cs new file mode 100644 index 0000000..da90c09 --- /dev/null +++ b/Common/10SignalChangeMonitorControl/PlcWorkStationSignal.cs @@ -0,0 +1,228 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace MesControl +{ + public delegate void WorkStationPlcBreakChanged(); + public partial class PlcWorkStationSignal : UserControl + { + public PlcWorkStationSignal() + { + InitializeComponent(); + PlcConnect.PlcBreakChange = new PlcStatusHandle(internalPlcBreak); + PlcConnect.PlcConnectChange = new PlcStatusHandle(internalPlcConnect); + this.SetStyle(ControlStyles.UserPaint, true); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + + } + + public EventHandler WorkStationPlcStatusChange; + + #region 工位信号方法与属性 + + public void InitSignalControl() + { + + + for (int i = 0; i < SignalItems.Count; i++) + { + + MesBoolSignal mesBoolSignalNew = new MesBoolSignal(); + this.groupBox_WorkStationGrp.Controls.Add(mesBoolSignalNew);//扩展GroupBox + mesBoolSignalNew.BackColor = System.Drawing.Color.Transparent; + mesBoolSignalNew.Location = new System.Drawing.Point(7, 46 + (25 * i)); + mesBoolSignalNew.Name = SignalItems[i].Name; + mesBoolSignalNew.SignalImage = MesBoolSignal.SignalImage_Enum.none; + mesBoolSignalNew.SignalText = SignalItems[i].SignalText; + mesBoolSignalNew.Size = new System.Drawing.Size(110, 22); + mesBoolSignalNew.TabIndex = i; + + } + + //groupbox大小 + groupBox_WorkStationGrp.Size = new Size(125, 50 + (SignalItems.Count * 25)); + //控件大小 + this.Size = new Size(136, 60 + (SignalItems.Count * 25)); + + } + + private List signalItems = new List(); + [Browsable(true)] + [Description("MES信号控件集合"), Category("数据")] + [TypeConverter(typeof(System.ComponentModel.CollectionConverter))] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + public List SignalItems + { + get + { + return signalItems; + } + + set + { + signalItems = value; + InitSignalControl(); + } + } + + /// + ///更改工位各个信号状态(默认) + /// + /// + /// + public void SignalChange(string SignalName, bool Value) + { + MesBoolSignal thisControl = (MesBoolSignal)Controls.Find(SignalName, true)[0]; + if (thisControl != null) + thisControl.SignalImage = Value ? MesBoolSignal.SignalImage_Enum.green : MesBoolSignal.SignalImage_Enum.init; + + } + + #endregion + + #region PLC在线状态属性与方法 + + ///////////////////////////////////////////////方法/////////////////////////////////////////////////// + + public void PlcConnectStatusChange(bool value) + { + plcConnect_WorkStation.ExternalPlcConnect(); + + } + public void ExternalTimerExcute() + { + plcConnect_WorkStation.ExternalTimer(); + } + + public void PlcBreak() + { + plcConnect_WorkStation.PlcBreak(); + } + + void internalPlcBreak() + { + if (WorkStationPlcStatusChange != null) + { + WorkStationPlcStatusChange(groupBox_WorkStationGrp.Text+"&Breaked",null); + } + + } + + void internalPlcConnect() + { + if (WorkStationPlcStatusChange != null) + { + WorkStationPlcStatusChange(groupBox_WorkStationGrp.Text + "&Connected", null); + } + } + + + //////////////////////////////////////////////////////////////属性/////////////////////////////////////////////// + + [Browsable(true)] + [Description("检测PLC在线状态开关"), Category("行为"), DefaultValue(true)] + public bool TestPLC_Enable + { + get + { + return plcConnect_WorkStation.PlcTestEnable; + } + set + { + plcConnect_WorkStation.PlcTestEnable = value; + } + } + + [Browsable(true)] + [Description("PLC心跳超时(超过此时间认为PLC离线)"), Category("行为"), DefaultValue(10000)] + public int TestPLC_Interval + { + get + { + return plcConnect_WorkStation.TestPlcBreakInterval; + } + set + { + + plcConnect_WorkStation.TestPlcBreakInterval = value; + + } + } + + + [Browsable(true)] + [Description("外部定时器循环时间"), Category("行为"), DefaultValue(200)] + public int ExternalTimerInterval + { + get + { + return plcConnect_WorkStation.ExternalTimerInterval; + } + set + { + plcConnect_WorkStation.ExternalTimerInterval = value; + } + } + + [Browsable(true)] + [Description("PLC在线状态"), Category("行为"), DefaultValue(false)] + public bool PLC_ConnectStatus + { + get + { + return plcConnect_WorkStation.IsBreakPLC; + } + set + { + plcConnect_WorkStation.IsBreakPLC = value; + } + } + + #endregion + + #region 当前控件方法与属性 + + [Browsable(true)] + [Description("控件显示的工位号"), Category("外观"), DefaultValue("OP0000")] + public string WorkStationNameText + { + get + { + return groupBox_WorkStationGrp.Text; + } + set + { + groupBox_WorkStationGrp.Text = value; + + } + + } + + [Browsable(true)] + [Description("控件中plc通讯显示的文本内容"), Category("外观"), DefaultValue("PLC连接")] + public string WS_PlcLabelText + { + get + { + return plcConnect_WorkStation.LabelText ; + } + + set + { + plcConnect_WorkStation.LabelText = value; + } + + } + + + #endregion + + } +} diff --git a/Common/10SignalChangeMonitorControl/PlcWorkStationSignal.resx b/Common/10SignalChangeMonitorControl/PlcWorkStationSignal.resx new file mode 100644 index 0000000..48f62a6 --- /dev/null +++ b/Common/10SignalChangeMonitorControl/PlcWorkStationSignal.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + \ No newline at end of file diff --git a/Common/10SignalChangeMonitorControl/Properties/AssemblyInfo.cs b/Common/10SignalChangeMonitorControl/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..68d5529 --- /dev/null +++ b/Common/10SignalChangeMonitorControl/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("MesControl")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MesControl")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("fab322cc-531d-4aea-986a-b921b64d8d3f")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Common/10SignalChangeMonitorControl/Properties/Resources.Designer.cs b/Common/10SignalChangeMonitorControl/Properties/Resources.Designer.cs new file mode 100644 index 0000000..3b13928 --- /dev/null +++ b/Common/10SignalChangeMonitorControl/Properties/Resources.Designer.cs @@ -0,0 +1,193 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace MesControl.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MesControl.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap BreakPLC { + get { + object obj = ResourceManager.GetObject("BreakPLC", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap green { + get { + object obj = ResourceManager.GetObject("green", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap init { + get { + object obj = ResourceManager.GetObject("init", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap none { + get { + object obj = ResourceManager.GetObject("none", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap PlcConnect0 { + get { + object obj = ResourceManager.GetObject("PlcConnect0", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap PlcConnect1 { + get { + object obj = ResourceManager.GetObject("PlcConnect1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap PlcConnect2 { + get { + object obj = ResourceManager.GetObject("PlcConnect2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap PlcConnect3 { + get { + object obj = ResourceManager.GetObject("PlcConnect3", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap PlcConnect4 { + get { + object obj = ResourceManager.GetObject("PlcConnect4", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap PlcConnectBig { + get { + object obj = ResourceManager.GetObject("PlcConnectBig", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap PlcConnectSmall { + get { + object obj = ResourceManager.GetObject("PlcConnectSmall", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap red { + get { + object obj = ResourceManager.GetObject("red", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap yellow { + get { + object obj = ResourceManager.GetObject("yellow", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Common/10SignalChangeMonitorControl/Properties/Resources.resx b/Common/10SignalChangeMonitorControl/Properties/Resources.resx new file mode 100644 index 0000000..e9eebfc --- /dev/null +++ b/Common/10SignalChangeMonitorControl/Properties/Resources.resx @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\red.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\yellow.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\PlcConnect1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\PlcConnect0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\PlcConnect3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\none.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\PlcConnectSmall.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\PlcConnect2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\init.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\PlcConnectBig.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\BreakPLC.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\PlcConnect4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Common/10SignalChangeMonitorControl/Properties/_system~.ini b/Common/10SignalChangeMonitorControl/Properties/_system~.ini new file mode 100644 index 0000000..e69de29 diff --git a/Common/10SignalChangeMonitorControl/Resources/BreakPLC.png b/Common/10SignalChangeMonitorControl/Resources/BreakPLC.png new file mode 100644 index 0000000000000000000000000000000000000000..4873366aae7666823af3aaa4e1f3a8250cffad7c GIT binary patch literal 4041 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 JPDHLkV1gj&ai9PI literal 0 HcmV?d00001 diff --git a/Common/10SignalChangeMonitorControl/Resources/PlcConnect1.png b/Common/10SignalChangeMonitorControl/Resources/PlcConnect1.png new file mode 100644 index 0000000000000000000000000000000000000000..8c0a417c4e044feb5bf5e86be49569972b398d50 GIT binary patch literal 2936 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 FV1gdBS^EG0 literal 0 HcmV?d00001 diff --git a/Common/10SignalChangeMonitorControl/Resources/PlcConnect3.png b/Common/10SignalChangeMonitorControl/Resources/PlcConnect3.png new file mode 100644 index 0000000000000000000000000000000000000000..165eaebf23cc4732d06c16705bea028fcf21e40d GIT binary patch literal 3647 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

OSG8q`#=rukS*W(Cj zA^6+_K>lfSP~Z2j0e#yqUrCY=_CL@S@a}E5UUx}|0N1Zd`W92Rm`S!N*$#~)#u;bV?ff+WR}x^9F=2(C P00000NkvXXu0mjf;&;=D literal 0 HcmV?d00001 diff --git a/Common/10SignalChangeMonitorControl/Resources/PlcConnectSmall.png b/Common/10SignalChangeMonitorControl/Resources/PlcConnectSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..8f43514961ee0b3e48b84b5b25811b8f03db1264 GIT binary patch literal 3265 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 literal 0 HcmV?d00001 diff --git a/Common/10SignalChangeMonitorControl/Resources/_system~.ini b/Common/10SignalChangeMonitorControl/Resources/_system~.ini new file mode 100644 index 0000000..e69de29 diff --git a/Common/10SignalChangeMonitorControl/Resources/green.png b/Common/10SignalChangeMonitorControl/Resources/green.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b463ef1549f24bd41f3c55009e58fabb99808f GIT binary patch literal 3885 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 literal 0 HcmV?d00001 diff --git a/Common/10SignalChangeMonitorControl/Resources/init.png b/Common/10SignalChangeMonitorControl/Resources/init.png new file mode 100644 index 0000000000000000000000000000000000000000..c148366505baa0fa32cc0541529eaffb7e273c62 GIT binary patch literal 3902 zcmV-E55e$>P)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z1Zzn|K~#9!bd=3+T;&zUf9L(W_s*Re8^`1eoMK^u9KixGEZVBH3#2aEMU?&p?7Qlw zT~$?Cuw}ur>Z0nVs(>yEq7^I^_bf{1W$b(Jeuukp$9Z3g@8#}D=&{9?3y`yGg17igI} z`P9n~Pjy~9_xQuz^B2yu^!yS=psFeW@}fWxmY1*a#_!+c#^2V`&ZzzQ;NG=YNRzJy z8m3P@_44VN@>l1cc!Uc-I*(}N^Of6dtgSPy4ndWWcQ}6H1Wzn3;zPzC-gt}8ZhgV} zP+#5p*I$1|nqUF)sWZ>dojUoux!K%*_j})Au({5sf4Rio_J-1q36k(e(YoUP&JJsL z|0yXpJU0Ir+Z*ek@!N+nUzr>Xu3JoyN9WG|=0w??ee%h(IF!NK9qo9-Y%gcJ-($9) zGuY)p++dKBnPVVV-f@W6fbppL^ zPUZudO^C60qgW#}(U3XCbaJfoBr4jbp;rX$7EXGdaL(ny&gB7$;3+fDbm8gcp5UNK zj!7~^luQ5-f>XQ?SeJ-xLlbi*^@Il_PnkDe7c902fllrza!;0d%EEy{(;9rLAt|B; z5remau?9n=3Z5cMbc;Y)1iYJwX<{1Wd7#_LDT2d03t~waoJ5>4IBRLu5>-$HO^T`^ zID6Euvv}`_iLn_C?_amp6TC%?C#s`u8Z<>z4YgWYHK2+UND6gKL<Z{5S+n{n!Nem#ka0rz4%i!Uiv@824G5T{^B>z%zuCJ z@%d-xPMx5v9m1;b$SGRX}ZmfKM?H_l(_;WMa{}ZtFRr9|G0L1j@ANzyr9smFU M07*qoM6N<$f-o_JeEKLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z1YJo)K~#9!td&nl8)+EEpUfXJnM}tFvNpA#)`FKc2}}1fvF#S2hn7-YS!u{&FX|qI z-P5wHtDa1gUFb#kwA7wTgHUlL6iW^*-L^?QL?x4g(BiZPYg4jxk~oY>=9_U3#h|C>x^A3q*^{`|Sm@AtonL?RRC&Yg=_Div6k1t^MwLZN^}A`ucr z(H2F~ibkWiR8>8hN~Ms^W>G8_Q7jgb&1R8GrJ$o1XWd$OeV3ivV!gHZESCEV`XIp$z&3$s-jdXA(>1L zx?C>e_xoRGv)RDL#s(-s5SY2Sxyf8E*EK#q{;SXDTdY(nux%UvCfl}AsZ`M0+q)Qv zL}H4fbltvvdrA-lhT7TL@x|lufnYHBA{-9?yt}&#LJ0Qv_nUQ~!*_%bRI63oxN#$L z>C&ZKJRTp|+1c??ilPLo)haVEFz`Fi^CgO+K+`m6nua7v;5e>n!f_lVNdiStIMi3a za^*^5cXyXo6eUPyGMNh=kB7*z{J<~_*tQMZwqcqkBuRoG2q1)j5CTCEAW71Z7wqlr zAs7rk@OV5VlgV6QR8>9A^L$;Bq%G4lKSuvIQ4|FLFirDVrjjIW@jPEwRrNH5|5;Rb zclTSvFr1pEb+RnmZSVY0z~Y48wq780fkVP1C?I3>*#z91aIuE*H}2^tE!i%*e9*jPm>aX;Bo( z($dnGhGBeS+cpRxux%TfrlD4=HHT}p8Z=GA{{B8J%YtQDFiq3-@ZrPjCr+HO{C!$MG-VjH%%N4N0ZOtGt07QYiq;u^7402o;(SJ!{Md&_Vzrb z>pB@38Hoe}fj6;O>{~@q21QY9CVMP+ih?9bP!#3b)YQ~ZU0q#&j*gB_>$*-T(=^f6 z)|Q)|o*t)Zni(1zx_|H9y=j-r#kt+?CclGnyWQY8j$2q*_#qSu#SOy{W3kvoYin!H zG)>TBV`CtM;LMpbFJxJMwYIkQ`Q5vBudlDKUu`rRr@daU!Eqd^*XzRj_wPS_^ytwy zv$M0m%+Ah!?e%)AGcz;aU%q_#w+|mad_;2Gf}NY2o1CAY|EgRrAG=^Z9*-Rgg%(Ce yMxq@Z9l5=|JyfgJkDUL@7tm-lnn4{H{xtyNiB`qp@Qu#^0000KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z1UX4WK~#9!Y?RH5)pZocKj-`M`~B{{^P*GOI7MQmS=vITKrGr+^tPzz4+w%5wMmL{ z+p3~P>o!3}fk6<}qJ_{R!(NEeNf1NJ%F@Yc9B1a<`+NC*&uO7Sl+W&*!*h5zhvyNl zfJrA)*E@N5tLo!@We?Evmqu;v)0bc2!rCf7I(h3*>Yhx73BcCi9=gxR zPX=o4_D3IM`<^{4AO4ErcSq^YE#jLF1ab((&6}8>-_6FodpLdM2wxsJz(tI&EI+@H z^6TD1yeouvHzU_xyLpZqcI{&Q&|&1N91#hG)sRmIk%bm z{1U^97b!({pT^$ybI#p!M~M43if7C09Mj{L;>1a2n#{C#20k#;8!%Or1XX;e^weN= z4Z}#9xVUs4aWYte(|(6{Pj7Q!@1_u$tp-f3tg&HO(^H5Dg$QK`kTPOM;XU3!+7?kI z<-}-xNR2TTT$poiZz;k6p;}#ILIN9Og^xx(s_Ak^@E+$py|Ti4$8a_iTs-6IrRm==VxAB|7f_kE#MfS(b=^6Tz8LWn%(kAdbHC44m%= zFG%G)Q$@*yd0dmJ$73)<&B&^d5+Mj}+mN%8QU(ESJDfKv5>})rnijmP+q%0+^BW zrG;JBVQQFOvO$aiRio=#R5Nn9XQo8&aX=Er?o8IBO-eLv17eiDl2{fLMM1ycr{C`( zBIKM2;nFQt4FtqH5JAmInpsTgSNEIh7ps~XYsQrYMZZTV3t|x|%aRZxB0@@urfEqj zfq)BvHg{wPW6QJxr*b~z&SpJ$QuC=X#%k`UEzw${P906x(su3Tr-1X0SVUa(G?o}^ zq76b9Jm;LO{gm@Z9#~t&%3F(g-=uhg8Sb*b>t;;bb!1f}c&dI6f?q={G6c#Zf(T|xQpLRB%L1Y&IT({!%`MBKET)zZhwFzw z8`sYP%l;oRXHq^oLbqQR!%YD}1@In;9`z1lKzaou%Pe;_7c}v^c6>Y>e)~yXKWlId z!2c@}mw)QgmnYiBO$WE56e<KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z1a3)0K~#9!bd*hqTvZmwf9Kx&-m9*9_3ERmI-R6VYhp|?j*$UB1_TFD5pkm+Ze6<4 zouDpsKg?#BxRF^51GADDMVJp1gNPA{&>52Hq)oS-&KKQwcdENSU%h(w-8+kJP-paP z&N*<-AO4*G`3pZ4Qlipsovt2;pRCq{$4lYpxWbvtl{bcc`LegZ^Lc-J@QKU1#s97T zZyV1Xe&EpYskaW!W-r`--?8YyQ;#rr=r~F=TX$~ppR4D&^vz{%uXBFmhWYL0^4eeV z*-rrq(?{=p?%oH|zZ^SKuD$T=D?E7WalkRo`grdsMKM}OT)VNz-~Rb7i_0tATx0dlF`S8R&wequ1yi9p2;O6=QyS;1Vc^B^;K~N=$@8a<6uP{2{ z?3eFzap^Lv%dJ1Ge7*V_#TX4xs<)1wek}TU{;*9Rd-y4=-QfD|zmw&Qguy0pWk_5Z zVRVOdyvA1N3bx3&>(EKMy&H(>JUYypw+GwZ1p|sBrmfm?3C$i0=Y(|Z=?zBohZo4QA;;#A&>w7b^rU)cYpwde39Gdub9d)2HS3B-;t;Mf z+v?Mv*3@E85DK9Yy!Uv7NiGbALT5K)r~56{xIufmL^c`CP0uASnp!J-venFzMjh(O zkaly-?2Mt22<0iyRLNkB;0i}N&T(E5mxU7VFN>3Zorbdtkya6}mk|tL^VIm83SG#2ZXE42_zl zRu!Va5*k4SoGY-_s97W-2wtrmo#V2WM@DB$NH<_z6H=faMww% zlYV{vt9%i zlg*jRGxz_p{OE}j<)eoWQd0`)?8z8BO* P00000NkvXXu0mjfw}6l( literal 0 HcmV?d00001 diff --git a/Common/10SignalChangeMonitorControl/SignalInit.cs b/Common/10SignalChangeMonitorControl/SignalInit.cs new file mode 100644 index 0000000..3b5b0a8 --- /dev/null +++ b/Common/10SignalChangeMonitorControl/SignalInit.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MesControl +{ + public partial class PlcWorkStationSignal + { + void initsignal() + { + //private PlcConnect plcConnect_WorkStation; + //this.plcConnect_WorkStation = new MesControl.PlcConnect(); + //this.groupBox_WorkStationGrp.Controls.Add(this.plcConnect_WorkStation); + + //// + //// plcConnect_WorkStation + //// + //this.plcConnect_WorkStation.BackColor = System.Drawing.Color.Transparent; + //this.plcConnect_WorkStation.ExternalTimerInterval = 200; + //this.plcConnect_WorkStation.IsBreakPLC = false; + //this.plcConnect_WorkStation.LabelText = "通讯状态"; + //this.plcConnect_WorkStation.Location = new System.Drawing.Point(7, 21); + //this.plcConnect_WorkStation.MaximumSize = new System.Drawing.Size(110, 22); + //this.plcConnect_WorkStation.MinimumSize = new System.Drawing.Size(110, 22); + //this.plcConnect_WorkStation.Name = "plcConnect_WorkStation"; + //this.plcConnect_WorkStation.PlcTestEnable = false; + //this.plcConnect_WorkStation.Size = new System.Drawing.Size(110, 22); + //this.plcConnect_WorkStation.TabIndex = 0; + //this.plcConnect_WorkStation.TestPlcBreakInterval = 0; + + } + + + + } +} diff --git a/Common/10SignalChangeMonitorControl/_system~.ini b/Common/10SignalChangeMonitorControl/_system~.ini new file mode 100644 index 0000000..e69de29 diff --git a/Common/11MonitorForm/11MonitorForm.csproj b/Common/11MonitorForm/11MonitorForm.csproj new file mode 100644 index 0000000..d096bcf --- /dev/null +++ b/Common/11MonitorForm/11MonitorForm.csproj @@ -0,0 +1,137 @@ + + + + + Debug + AnyCPU + {488BADD9-579F-4BF3-91DC-9FA95E3181A5} + Library + MonitorFrom + MonitorFrom + v4.8 + 512 + true + true + + + + AnyCPU + true + full + false + bin\MonitorForm\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + Mes32X32.ico + + + + + + + False + ..\..\Common\dll\MQTTnet.dll + + + False + ..\..\Common\dll\MQTTnet.Extensions.ManagedClient.dll + + + + + + + + + + + + + + + + + Form + + + Form1.cs + + + + Form + + + Form + + + + + Form + + + SecondForm.cs + + + Form + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SecondForm.cs + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + {f55da1a0-a982-4479-8c47-0d9a5aaf3e18} + 00MesWorkMqtt + + + {0d1af432-439a-4920-8692-43ae139f5530} + 01_01DoWhatPlc + + + {90e76fb4-646d-45e2-95db-0b8ab4e465d6} + 09-MesDataFunction + + + {fab322cc-531d-4aea-986a-b921b64d8d3f} + 10MesControl + + + + + + + \ No newline at end of file diff --git a/Common/11MonitorForm/App.config b/Common/11MonitorForm/App.config new file mode 100644 index 0000000..91dd9a9 --- /dev/null +++ b/Common/11MonitorForm/App.config @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/Common/11MonitorForm/Form1.Designer.cs b/Common/11MonitorForm/Form1.Designer.cs new file mode 100644 index 0000000..a594139 --- /dev/null +++ b/Common/11MonitorForm/Form1.Designer.cs @@ -0,0 +1,41 @@ + +namespace MonitorFrom +{ + partial class Form1 + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Text = "Form1"; + } + + #endregion + } +} + diff --git a/Common/11MonitorForm/Form1.cs b/Common/11MonitorForm/Form1.cs new file mode 100644 index 0000000..94de9ff --- /dev/null +++ b/Common/11MonitorForm/Form1.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace MonitorFrom +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + } +} diff --git a/Common/11MonitorForm/FunctionForm_HashiTable.cs b/Common/11MonitorForm/FunctionForm_HashiTable.cs new file mode 100644 index 0000000..6e6efd4 --- /dev/null +++ b/Common/11MonitorForm/FunctionForm_HashiTable.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MisDataName +{ + class FunctionForm_HashiTable + { + public static Hashtable OpName_Hash = new Hashtable(); + public static object OpName_Hash_Read(string Key) + { + if (OpName_Hash.ContainsKey(Key)) + { + return OpName_Hash[Key]; + + } + else + { + return null; + } + + } + + public static void OpName_Hash_Write(string Key, object obj) + { + + if (OpName_Hash.ContainsKey(Key)) + { + + OpName_Hash[Key] = obj; + } + else + { + OpName_Hash.Add(Key, obj); + } + + } + + + public static Hashtable SignalName = new Hashtable(); + public static string SignalName_Hash_Read(string Key) + { + if (SignalName.ContainsKey(Key)) + { + return SignalName[Key].ToString (); + + } + else + { + return null; + } + + } + + public static void SignalName_Hash_Write(string Key, string str) + { + + if (SignalName.ContainsKey(Key)) + { + + SignalName[Key] = str; + } + else + { + SignalName.Add(Key, str); + } + + } + + + public static Hashtable SignalConfig = new Hashtable(); + public static object SignalConfig_Hash_Read(string Key) + { + if (SignalConfig.ContainsKey(Key)) + { + return SignalConfig[Key]; + + } + else + { + return null; + } + + } + + public static void SignalConfig_Write(string Key, object str) + { + + if (SignalConfig.ContainsKey(Key)) + { + + SignalConfig[Key] = str; + } + else + { + SignalConfig.Add(Key, str); + } + + } + } +} diff --git a/Common/11MonitorForm/MainSignalChangeEvent.cs b/Common/11MonitorForm/MainSignalChangeEvent.cs new file mode 100644 index 0000000..8311d1b --- /dev/null +++ b/Common/11MonitorForm/MainSignalChangeEvent.cs @@ -0,0 +1,127 @@ +using DoWhatPlc; +using MesControl; +using MQTTnet; +using MQTTnet.Client.Connecting; +using MQTTnet.Client.Disconnecting; +using MQTTnet.Client.Receiving; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +//using SystemFramework; + +namespace MisDataName +{ + public partial class SecondForm + { + public MesWorkMqtt.Mqtt2 mqtt2; + //public void InitMqtt2(string url, string topic) + //{ + // mqtt2 = new MesWorkMqtt.Mqtt2(); + // mqtt2.MqttUrl = url; + // mqtt2.topic = topic; + // mqtt2.StartAsync(); + // mqtt2.mqttClient.ConnectedHandler = new MqttClientConnectedHandlerDelegate(OnSubscriberConnected); + // mqtt2.mqttClient.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(OnSubscriberDisconnected); + // mqtt2.mqttClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(OnSubscriberMessageReceived); + + // //MesServerCode哈希表创建 + // //MesServerWork.MIS_BASE.InitHashtable_MesServerCode(); + + //} + //private void OnSubscriberConnected(MqttClientConnectedEventArgs x) + //{ + // var rec = x.AuthenticateResult.ResultCode.ToString(); + + //} + + //private void OnSubscriberDisconnected(MqttClientDisconnectedEventArgs x) + //{ + + //} + + //private void OnSubscriberMessageReceived(MqttApplicationMessageReceivedEventArgs x) + //{ + // var rec = x.ApplicationMessage.ConvertPayloadToString(); + + + // //处理MES业务 + // ThreadPool.QueueUserWorkItem(MainSignalChange, rec); + //} + + + void WorkStation_RefreshWorkStationStatus(string OpName, bool value) + { + try + { + PlcWorkStationSignal plcWorkStationSignal = (PlcWorkStationSignal)Controls.Find("plcWorkStationSignal_" + OpName, true)[0]; + plcWorkStationSignal.PlcConnectStatusChange(value); + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, err.Message); + } + } + void InitMainSignalEvent() + { + //MisData.PlcChange = new PlcChangeEvent(MainSignalChange); + } + + //void MainSignalChange(object e) + //{ + // string recData = e.ToString(); + // string[] dataArray = recData.Split('|'); + // if (dataArray.Length != 4) + // return; + // //消息来源 + // string m_Source = dataArray[0].ToString(); + // //消息类型 + // string m_Command = dataArray[1].ToString(); + // //工位号 + // string m_OpName = dataArray[2].ToString(); + // //消息参数 + // string m_Value = dataArray[3].ToString(); + // if (m_Source == "BarCode") return; + + // DoWhatPlc.ReturnValueString rv = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + // //Console.WriteLine($"【【{rv.TagID}【【【【{ rv.TagKeepTime}"); + // if (rv == null) return; + // int tagType; + // string opName; + // string tagValue; + // int tagid; + // DoWhatPlc.ReturnValueString msgEvent = rv; + // if (msgEvent.TagValue == null) return; + // tagType = Convert.ToInt32(msgEvent.TagTypeID); + // opName = msgEvent.OpName.ToString(); + // tagid = Convert.ToInt32(msgEvent.TagID); + // int tagTypeCodeID = Convert.ToInt32(msgEvent.TagTypeCodeID); + // switch (tagType) + // { + // case 11: + // switch (msgEvent.TagValue.ToLower()) + // { + // case "1": + // case "true": + // tagValue = "1"; + // break; + // default: + // tagValue = "0"; + // break; + // } + // break; + // default: + // tagValue = msgEvent.TagValue.ToString(); + // break; + // } + // if (tagType == 11) + // { + + // WriteWorkStationSignal(opName, tagTypeCodeID.ToString(), Convert.ToBoolean(Convert.ToInt32(tagValue))); + // } + //} + + + } +} diff --git a/Common/11MonitorForm/Mes32X32.ico b/Common/11MonitorForm/Mes32X32.ico new file mode 100644 index 0000000000000000000000000000000000000000..ec465b232715999d0ff00139a6887cb4b0185d36 GIT binary patch literal 4286 zcmb8xduUc=9KiACb(*HxH1kr3zM6^J#mzykT5b!$>_SnPnHq%(MfU>TACXCEQgqR@ zrbebk2|^KqRuHZPTTu#bMo1F&NYVmunT`>j=V2o2Zf!~s{Ih@3?>jPobf;Z{72*#Dm?Pr!@#0p{}$_TYI8Lnjo88uDYsd*^m2X5wqa zJ{_TKtas2I)_(voej{c3>i2{32(}=8Z+^>Bi*EQ|9^7|H-o3%q{2gQ4-iC*9Kb&vh z$6O1=kMA7wp12JwaTvDe_m0)Ga2{`hbw=YT+Kiv>Sn_RWu9bKJ z`{2CTm#;7twr^a=Xc4Z#+c1aA;rqVW4fmP%O84LO@f3!m#d_nJ^_`nRcogel%-7*N z%S(~}maB2TLEJ~@P<9=E*hWrzPlRZQHp%rX8E+%fA{I+Ylg*p3Ai;w*Ty>=eB#_df&pi zZ&!RPSr_hsES|vUID+GFKdgagR{H#l=TC;`#Pr_o=ph_Yl(k9~kT8EB=>< z?Kzg?U_8$QWBYB3_|3lc46xpG7}LD^<6dk-jDL*s0*r*QtQ(ukUz2C%lEq9Eji1!D z4fC_!TX0PqV=qo1#*WuhJUfVwF%g4cyh3?Y^St2vTiI`L9zKKZJ9mG;7%`q#&o%qr z{JCv^hh?}K-I33Qt8EvHZ=H)U86P43zabsd^?V?CKY^>~gL`x*+;i!=mi=3_3D3ea z*>zbcegn^6#va(G=Iyu+UAK>6C_EG5SebWU+yeW&8*z=rcH;clMm@YwufJF?eKq$l zF$dLfZ>HDNVD4Q@j)8ys%*R{?U>ZKaFKC`ij8Q1QYik#l!gf6`Y}2+KyWS{C?uT(* zjLrB0voIR@Jh@tbILvV)9K-ZliSfDmk+>O3)JkF}&-2Q>N z+%uhXCqu{`4xxHOmrxq|m1Q#h#-Mag&weFM<@Mq5iuzDqQD26t@=^1v%d=g|noypt zE6Zf-Dl8$N*k&|rl~T7a+1h|67 signalItems = InitWorkStationSignal(); + RecordWorkStationSignal(signalItems); + + int RowsWidth = SignalPanel.Width-20; + int RowsNum = RowsWidth / 133; + int i = 0; + var opNameList = MIS_BASE.Get_opNameList(); + foreach (var opName in opNameList) + { + PlcWorkStationSignal plcWorkStationSignal = new PlcWorkStationSignal(); + + plcWorkStationSignal.BackColor = System.Drawing.Color.Transparent; + plcWorkStationSignal.Location = new System.Drawing.Point(3 + ((i % RowsNum) * 133), (i / RowsNum) * ((signalItems.Count * 25) + 60)); + plcWorkStationSignal.MaximumSize = new System.Drawing.Size(0, 0); + plcWorkStationSignal.MinimumSize = new System.Drawing.Size(0, 0); + plcWorkStationSignal.Name = "plcWorkStationSignal_" + opName; + plcWorkStationSignal.Size = new System.Drawing.Size(136, 60); + plcWorkStationSignal.TabIndex = i; + plcWorkStationSignal.SignalItems = signalItems; + plcWorkStationSignal.WorkStationNameText = opName; + plcWorkStationSignal.WS_PlcLabelText = "PLC连接"; + plcWorkStationSignal.TestPLC_Interval = 10000; + + plcWorkStationSignal.TestPLC_Enable = true; + PlcConnectTimer += plcWorkStationSignal.ExternalTimerExcute; + + this.SignalPanel.Controls.Add(plcWorkStationSignal); + i++; + } + + + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, err.Message); + } + + } + + public List InitWorkStationSignal() + { + try + { + List signalItems = new List(); + MesBoolSignal MBS; + signalItems.Clear(); + XDocument SystemConfig = XDocument.Load("SystemConfig.xml"); + IEnumerable plc = SystemConfig.Descendants ("PLC"); + IEnumerable plcSignal = plc.Elements(); + foreach (XElement PlcSignal in plcSignal) + { + XElement Name = PlcSignal.Element("Name"); + XElement TagType = PlcSignal.Element("TagType"); + XElement Text = PlcSignal.Element("Text"); + XElement Index = PlcSignal.Element("Index"); + XElement Enabled = PlcSignal.Element("Enabled"); + + MBS = new MesBoolSignal(); + MBS.Name = "TagType_" + TagType.Value ; + MBS.SignalText = Text.Value ; + MBS.SignalImage = MesBoolSignal.SignalImage_Enum.none; + + if (Convert.ToBoolean(Enabled.Value)) + { + signalItems.Add(MBS); + } + } + IEnumerable mes = SystemConfig.Descendants("MES"); + IEnumerable mesSignal = mes.Elements(); + foreach (XElement MesSignal in mesSignal) + { + XElement Name = MesSignal.Element("Name"); + XElement TagType = MesSignal.Element("TagType"); + XElement Text = MesSignal.Element("Text"); + XElement Index = MesSignal.Element("Index"); + XElement Enabled = MesSignal.Element("Enabled"); + + MBS = new MesBoolSignal(); + MBS.Name = "TagType_" + TagType.Value; + MBS.SignalText = Text.Value; + MBS.SignalImage = MesBoolSignal.SignalImage_Enum.none; + + if (Convert .ToBoolean ( Enabled .Value)) + { + signalItems.Add(MBS); + } + + } + + return signalItems; + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, err.Message); + return null; + } + } + + + string[] SignalNames; + + void RecordWorkStationSignal(List items) + { + SignalNames = new string[items.Count]; + for (int i=0;i< items.Count;i++) + { + SignalNames[i] = items[i].Name; + } + + + } + + + + } +} diff --git a/Common/11MonitorForm/Program.cs b/Common/11MonitorForm/Program.cs new file mode 100644 index 0000000..67147e1 --- /dev/null +++ b/Common/11MonitorForm/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace MisDataName +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new SecondForm()); + } + } +} diff --git a/Common/11MonitorForm/Properties/AssemblyInfo.cs b/Common/11MonitorForm/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..53b0405 --- /dev/null +++ b/Common/11MonitorForm/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("MonitorFrom")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MonitorFrom")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("488badd9-579f-4bf3-91dc-9fa95e3181a5")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Common/11MonitorForm/Properties/Resources.Designer.cs b/Common/11MonitorForm/Properties/Resources.Designer.cs new file mode 100644 index 0000000..554b127 --- /dev/null +++ b/Common/11MonitorForm/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace MonitorFrom.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MonitorFrom.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Common/11MonitorForm/Properties/Resources.resx b/Common/11MonitorForm/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Common/11MonitorForm/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Common/11MonitorForm/Properties/Settings.Designer.cs b/Common/11MonitorForm/Properties/Settings.Designer.cs new file mode 100644 index 0000000..422dbaa --- /dev/null +++ b/Common/11MonitorForm/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace MonitorFrom.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.0.3.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Common/11MonitorForm/Properties/Settings.settings b/Common/11MonitorForm/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Common/11MonitorForm/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Common/11MonitorForm/SecondForm.Designer.cs b/Common/11MonitorForm/SecondForm.Designer.cs new file mode 100644 index 0000000..fdf10cb --- /dev/null +++ b/Common/11MonitorForm/SecondForm.Designer.cs @@ -0,0 +1,83 @@ +namespace MisDataName +{ + partial class SecondForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SecondForm)); + this.groupBox_PlcSignal = new System.Windows.Forms.GroupBox(); + this.SignalPanel = new MisDataName.MyPanel(); + this.groupBox_PlcSignal.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox_PlcSignal + // + this.groupBox_PlcSignal.Controls.Add(this.SignalPanel); + this.groupBox_PlcSignal.Location = new System.Drawing.Point(12, 12); + this.groupBox_PlcSignal.Name = "groupBox_PlcSignal"; + this.groupBox_PlcSignal.Size = new System.Drawing.Size(718, 807); + this.groupBox_PlcSignal.TabIndex = 1; + this.groupBox_PlcSignal.TabStop = false; + this.groupBox_PlcSignal.Text = "LineStatus"; + // + // SignalPanel + // + this.SignalPanel.AutoScroll = true; + this.SignalPanel.Location = new System.Drawing.Point(6, 20); + this.SignalPanel.Name = "SignalPanel"; + this.SignalPanel.Size = new System.Drawing.Size(706, 780); + this.SignalPanel.TabIndex = 0; + // + // SecondForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(741, 831); + this.Controls.Add(this.groupBox_PlcSignal); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MaximumSize = new System.Drawing.Size(757, 870); + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(757, 870); + this.Name = "SecondForm"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; + this.Text = "PlcSignal 2022-10-16"; + this.TopMost = true; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SecondForm_FormClosing); + this.groupBox_PlcSignal.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private MyPanel SignalPanel; + private System.Windows.Forms.GroupBox groupBox_PlcSignal; + } +} \ No newline at end of file diff --git a/Common/11MonitorForm/SecondForm.cs b/Common/11MonitorForm/SecondForm.cs new file mode 100644 index 0000000..6fe053f --- /dev/null +++ b/Common/11MonitorForm/SecondForm.cs @@ -0,0 +1,86 @@ +using MesControl; +using MQTTnet; +using MQTTnet.Client.Connecting; +using MQTTnet.Client.Disconnecting; +using MQTTnet.Client.Receiving; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading; +using System.Windows.Forms; +//using SystemFramework; + +namespace MisDataName +{ + public partial class SecondForm : Form + { + public SecondForm() + { + InitializeComponent(); + InitFormDynamicControls(); + InitMainSignalEvent(); + //InitOtherFormAction(); + //SyncForm_Init(); + + string url; + string topic; + url = System.Configuration.ConfigurationManager.AppSettings["MqttUrl"]; + topic = System.Configuration.ConfigurationManager.AppSettings["MqttTargetTopicPLC"]; + + //InitMqtt2(url, topic); + + } + + + + + //void WriteWorkStationSignal(string OpName,string SignalName,bool value) + //{ + // try + // { + // if (Array.IndexOf(SignalNames, "TagType_"+SignalName)!=-1) + // { + // PlcWorkStationSignal plcWorkStationSignal = (PlcWorkStationSignal)Controls.Find("plcWorkStationSignal_" + OpName, true)[0]; + // plcWorkStationSignal.SignalChange("TagType_"+SignalName, value); + // if (SignalName=="14") + // { + // WorkStation_RefreshWorkStationStatus(OpName, value); + // } + + // } + // } + // catch (Exception err) + // { + // //ApplicationLog.WriteLog(err, err.Message); + // } + + //} + + + private void SecondForm_FormClosing(object sender, FormClosingEventArgs e) + { + try + { + this.Dispose(); + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, err.Message); + } + } + } + + class MyPanel : Panel + { + public MyPanel() + { + this.SetStyle(ControlStyles.UserPaint, true); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + } + } +} diff --git a/Common/11MonitorForm/SecondForm.resx b/Common/11MonitorForm/SecondForm.resx new file mode 100644 index 0000000..900f82a --- /dev/null +++ b/Common/11MonitorForm/SecondForm.resx @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAABMLAAATCwAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgChADIAoQIyAKEgMgChczIA + occyAKHqMgChmTIAoTwyAKEJMgChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgChADIAoQQyAKEvMgChdzIA + odYyAKH7MgCh/zIAof8yAKH/MgCh6jIAoacyAKFJMgChEjIAoQAyAKEAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAKEAMgChADIAoQoyAKE+MgChkTIA + oeoyAKH+MgCh+TIAoe0yAKH+MgCh/zIAofwyAKH3MgCh/jIAofgyAKHBMgChZDIAoR4yAKEBMgChAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAKEAMgChATIAoRUyAKFcMgChujIA + ofEyAKH/MgCh9DIAobcyAKFPMgChfjIAof8yAKH/MgCh5TIAoVUyAKGLMgCh4jIAofwyAKH9MgCh2TIA + oYcyAKEoMgChBTIAoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAKEAMgChAjIAoSYyAKF2MgCh0DIA + ofcyAKH+MgCh8zIAof8yAKGjMgChDTIAoQAyAKFpMgCh/zIAof8yAKHhMgChHjIAoQIyAKEiMgChbjIA + ocoyAKH3MgCh/jIAoeUyAKGfMgChQTIAoQsyAKEAAAAAAAAAAAAAAAAAMgChCDIAoUEyAKGXMgCh4jIA + of4yAKH/MgChzzIAoW0yAKFoMgCh+zIAoZcyAKEAMgChADIAoWkyAKH/MgCh/zIAoeEyAKEeMgChADIA + oQAyAKEBMgChETIAoVAyAKGiMgCh8DIAof8yAKH0MgChuTIAoW0yAKEVMgChADIAoQAyAKG2MgCh7TIA + of8yAKHvMgCh7jIAofgyAKFLMgChADIAoTcyAKH1MgChlzIAoQAyAKEAMgChaTIAof8yAKH/MgCh4TIA + oR4yAKEAAAAAAAAAAAAAAAAAMgChADIAoQcyAKE4MgChijIAod8yAKH9MgCh+zIAoc4yAKFdMgChADIA + of8yAKHlMgChlDIAoToyAKGgMgCh7jIAoSwyAKEAMgChFzIAodgyAKGZMgChADIAoQAyAKFpMgCh/zIA + of8yAKHxMgChfDIAoSkyAKEBMgChAAAAAAAAAAAAAAAAADIAoQAyAKECMgChITIAoW8yAKG/MgCh/zIA + oZYyAKEAMgCh/zIAoZoyAKEBMgChADIAoZkyAKHSMgChEjIAoQAyAKEGMgChujIAoZoyAKEAMgChADIA + oWkyAKH/MgCh/zIAof0yAKH+MgCh4TIAoZIyAKFEMgChDjIAoQAyAKEAAAAAAAAAAAAAAAAAMgChADIA + oUIyAKH7MgChlzIAoQAyAKH/MgChlzIAoQAyAKEAMgChmjIAobMyAKEEMgChADIAoQAyAKGcMgChmzIA + oQAyAKEAMgChaTIAof8yAKH/MgCh4zIAoZYyAKHRMgCh+zIAofQyAKHDMgChZDIAoSIyAKEBMgChAAAA + AAAyAKEAMgChPzIAofsyAKGXMgChADIAof8yAKGXMgChADIAoQAyAKGaMgChiDIAoQAAAAAAMgChADIA + oYgyAKGaMgChADIAoQAyAKFpMgCh/zIAof8yAKHhMgChIDIAoRIyAKFeMgChqzIAoe0yAKH+MgCh3jIA + oYYyAKEqMgChADIAoQAyAKE/MgCh+zIAoZcyAKEAMgCh/zIAoZcyAKEAMgChADIAoZgyAKFtMgChAAAA + AAAyAKEAMgChXDIAoZQyAKEAMgChADIAoWkyAKH/MgCh/zIAoeEyAKEeMgChADIAoQAyAKEGMgChMDIA + oX8yAKHTMgCh+jIAoWkyAKEAMgChADIAoT8yAKH7MgChlzIAoQAyAKH/MgChlzIAoQAyAKEAMgChlTIA + oWMyAKEAAAAAADIAoQAyAKE2MgChhTIAoQAyAKEAMgChaTIAof8yAKH/MgCh4TIAoR4yAKEAAAAAAAAA + AAAyAKEAMgChATIAoRUyAKFYMgChQDIAoQAyAKEAMgChPzIAofsyAKGXMgChADIAof8yAKGXMgChADIA + oQAyAKGLMgChQTIAoQAyAKEFMgChADIAoSMyAKF4MgChADIAoQAyAKFpMgCh/zIAof8yAKHhMgChHjIA + oQAAAAAAAAAAAAAAAAAAAAAAMgChADIAoQAyAKEBMgChADIAoQAyAKE/MgCh+zIAoZcyAKEAMgCh/zIA + oZcyAKEAMgChADIAoXcyAKEkMgChBzIAoUIyAKEBMgChFjIAoWUyAKEBMgChADIAoWkyAKH/MgCh/zIA + oeEyAKEeMgChADIAoQAyAKE5MgChSTIAoQ8yAKEBMgChAAAAAAAAAAAAMgChADIAoT8yAKH7MgChlzIA + oQAyAKH/MgChlzIAoQAyAKECMgChWzIAoQ8yAKEVMgChhTIAoQoyAKEHMgChMzIAoQEyAKEAMgChaTIA + of8yAKH/MgCh4TIAoR4yAKEAMgChADIAoWkyAKH1MgChyzIAoX8yAKE4MgChBTIAoQAyAKEAMgChPzIA + ofsyAKGXMgChADIAof8yAKGXMgChADIAoQMyAKFZMgChCzIAoS4yAKHDMgChGjIAoQAAAAAAAAAAADIA + oQAyAKFpMgCh/zIAof8yAKHhMgChHjIAoQAyAKEAMgChLDIAoaEyAKHkMgCh/DIAoe8yAKGrMgChUzIA + oREyAKFBMgCh+zIAoZcyAKEAMgCh/zIAoZcyAKEAMgChBzIAoVAyAKEEMgChQTIAodoyAKEjMgChAAAA + AAAAAAAAMgChADIAoWkyAKH/MgCh/zIAoeEyAKEeMgChAAAAAAAyAKEAMgChBjIAoSAyAKFyMgChwjIA + ofMyAKH4MgCh0zIAobMyAKH9MgChljIAoQAyAKH/MgChlzIAoQAyAKEBMgChBDIAoQAyAKFKMgCh7jIA + oT0yAKEAAAAAADIAoQAyAKEAMgChbDIAof8yAKH/MgCh4TIAoR8yAKEAAAAAAAAAAAAAAAAAMgChADIA + oQEyAKELMgChRzIAoZYyAKHeMgCh/TIAof8yAKGWMgChADIAof8yAKGXMgChAAAAAAAAAAAAMgChADIA + oW0yAKH/MgChZDIAoQAyAKEEMgChHDIAoWAyAKHPMgCh/zIAof8yAKH3MgChkTIAoS8yAKELMgChADIA + oQAAAAAAAAAAAAAAAAAyAKEAMgChATIAoSAyAKF2MgCh/zIAoZYyAKEAMgCh/zIAoZcyAKEAAAAAADIA + oQAyAKEAMgChljIAof8yAKGeMgChOTIAoZEyAKHcMgCh+TIAof8yAKH/MgCh/zIAof8yAKH+MgCh6jIA + obgyAKFXMgChITIAoQEyAKEAAAAAAAAAAAAAAAAAMgChADIAoT8yAKH7MgChlzIAoQAyAKH/MgChlzIA + oQAAAAAAMgChADIAoQwyAKG9MgCh/zIAofMyAKHyMgCh/jIAof8yAKH/MgCh/zIAofoyAKH3MgCh/jIA + of8yAKH/MgCh/zIAofsyAKHbMgChmzIAoUwyAKENMgChATIAoQAyAKEAMgChPzIAofsyAKGXMgChADIA + of8yAKGXMgChATIAoRkyAKFbMgChsTIAofAyAKH/MgCh/zIAof8yAKH/MgCh/DIAoeYyAKGxMgChVTIA + oUIyAKGFMgCh1TIAofUyAKH/MgCh/zIAof8yAKH/MgCh9DIAocUyAKGDMgChMDIAoQYyAKE/MgCh+zIA + oZcyAKEAMgCh/zIAocEyAKGOMgCh2TIAofcyAKH/MgCh/zIAof8yAKH/MgCh7jIAobMyAKFwMgChJjIA + oQoyAKEAMgChADIAoQEyAKEXMgChTTIAoZsyAKHYMgCh/TIAof8yAKH/MgCh/zIAof4yAKHqMgChszIA + oZgyAKH+MgChljIAoQAyAKH/MgCh/zIAof8yAKH/MgCh/zIAof8yAKH0MgChyTIAoYEyAKE/MgChBzIA + oQAAAAAAMgChADIAoSIyAKF2MgChQjIAoRIyAKEAMgChATIAoR4yAKFjMgChrjIAoecyAKH9MgCh/zIA + of8yAKH/MgCh/zIAof8yAKGWMgChADIAof8yAKH/MgCh/zIAofkyAKHWMgChmjIAoUIyAKERMgChATIA + oQAyAKEGMgChFTIAoQMyAKEAMgChKDIAoZUyAKHHMgChxjIAoXcyAKE3MgChBzIAoQAyAKEGMgChKTIA + oXYyAKHDMgCh7jIAof4yAKH/MgCh/zIAoZYyAKEAMgChrjIAoeYyAKH+MgCh0zIAoVcyAKELMgChADIA + oQAyAKEAMgChADIAoVUyAKHAMgChkjIAoVYyAKEUMgChATIAoRYyAKFhMgChqzIAodUyAKGmMgChZTIA + oR8yAKEDMgChBDIAoS0yAKGiMgCh9DIAofUyAKHGMgChWTIAoQAyAKEGMgChKjIAoWsyAKHBMgCh3DIA + ocEyAKFwMgChJTIAoQYyAKEAMgChDDIAoTgyAKF/MgChyjIAocMyAKGUMgChMzIAoQsyAKEEMgChJjIA + oWUyAKG/MgCh0TIAoaYyAKGoMgCh1TIAodYyAKGNMgChQTIAoRAyAKEAMgChAAAAAAAyAKEAMgChADIA + oQ8yAKE8MgChkDIAoc8yAKHfMgChpDIAoVIyAKEcMgChADIAoQEyAKETMgChRzIAoZ8yAKHGMgChvzIA + oWQyAKEtMgChMzIAoY8yAKHvMgCh5zIAoa8yAKFcMgChHDIAoQMyAKEAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAADIAoQAyAKECMgChFTIAoVcyAKGaMgCh3DIAodEyAKGaMgChSDIAoQsyAKEAMgChATIA + oSUyAKGGMgCh6TIAofEyAKHhMgChtzIAoXAyAKErMgChBTIAoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgChADIAoQIyAKElMgChXTIAobgyAKHbMgChxTIA + oYUyAKFbMgChqzIAodEyAKHLMgChhDIAoTsyAKELMgChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAKEAMgChCzIA + oTcyAKGTMgCh0zIAofAyAKG2MgChWjIAoRcyAKEBMgChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA/+Af//+AB//8AAD/8AAAP8AIAA8AGDABARg+AQEYD4ERGAPxMZgAcTOY + ADEzmDAxM5g8MTKIPzEgCDDxIAgwMSB4MAEgeDgBJHg+ATxAD8E8AAHxOAAAMQAAAAEAAwABABwgAQBE + BAEBwAABAEAAA+AAAA/4AAB//wAD///gD/8= + + + \ No newline at end of file diff --git a/Common/11MonitorForm/SecondFormDelegate.cs b/Common/11MonitorForm/SecondFormDelegate.cs new file mode 100644 index 0000000..434652c --- /dev/null +++ b/Common/11MonitorForm/SecondFormDelegate.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MisDataName +{ + public delegate void SecondAct(string ControlName); + + public partial class SecondForm + { + public static SecondAct MainMenuRefresh; + + } +} diff --git a/Common/99DataBaseAccess2/Common/dll/DataBaseAccess.dll b/Common/99DataBaseAccess2/Common/dll/DataBaseAccess.dll new file mode 100644 index 0000000000000000000000000000000000000000..137dc82ad87299ff69434d7a0ee71280434c1d5a GIT binary patch literal 15872 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 literal 0 HcmV?d00001 diff --git a/Common/99DataBaseAccess2/Common/dll/DataBaseAccess.pdb b/Common/99DataBaseAccess2/Common/dll/DataBaseAccess.pdb new file mode 100644 index 0000000000000000000000000000000000000000..e9bf580774428fd0844238f92268fcb5efcc2ed1 GIT binary patch literal 44544 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 literal 0 HcmV?d00001 diff --git a/Common/99DataBaseAccess2/Common/dll/DoWhatPlc.dll b/Common/99DataBaseAccess2/Common/dll/DoWhatPlc.dll new file mode 100644 index 0000000000000000000000000000000000000000..34ab0bbd7586b1afe7a9d7655e8b5cfe6c52b0de GIT binary patch literal 19456 zcmeHvdvsjob?-jsj7Bq~(MTF8HV(2qvaut-WXZCPZP`XIKZIpV_QP%+Dl|AKZO?L>p$>K1dG{d2;L?=sR=tnzVUS8u~;F z05)l>sy8(Ggot`;tdzw~m%5EZaN)Zh-<(e)E?13Z#u9Mky3!=R9P4U)b3Tnk%{i)w zLmV6*uA5E;bjM1>SWl!0`|pQEx-o{luH_5#n^9+EOqpa@Bs zzy%f$Ntq~AgrrQMyTwCNCcKJ}lnI|ABxRyV5t1&_tILRdv^+;J#zM+PQqEJQ2uYb( zqzFlwSgZ(1nYcm`k}|PG5t1^oR1uOcRTZJ-MCG*x-HywEzASTSJ>aTFY&YqFf@*|- z;7SBh_3F!&QVu0i!OVPNjOuxk7E~{kG~gcl2ujogg=5u{dd8MX>K#LwF1`9g$mqdpjYu!|b`ruNQkzV~_uzGc+AbJQg+6Y`Ah#qmLFqqsvchL$eM8_Iq z7+-RgBxPciA|z#^MiG)Sv04$5GJ&N*Vo1saY9xfDbUFI$I@FOr**+_9Rbv9Xt5LAs zbBGVYs78yC7E~h|2A3XiSI^}JuMzeCl`TaK?hc25hpT!m8>j$a5{^xy-pADjNn*SJ@WYUir;EQg)3cT_()G& zhH4di{hsO*$X4zubA>!5|1jD76_gKo)yL0lShpX-2J_t9bqgWMj^ z;SOBL4Xd~WSE&6S&%%ZY$LzoDGbBj}(2Mb3niBN0=axqrsvSS3 z8-9rjZ1^#Efh%!aj=F4j=tM=KDGYg@2;yvowhvq zz_)9*NV}M8(AcTkcDir)XD>B8?8La{C)UdiBaU{`b><&yS~vU_jrCX?d1_!<`8GYk z*)Iv%k|A$n@?{~z8S)2Az9?i*hWslgPYZc8Lw=XZ2ZbETkl$u4>3HK$5^5jNZ*WO;_{Wilb;k_>r>NrpKS zSnV{QA@ii%UFI$?C@Zj5JC3VXLaWbc3!rVuX!D>oWwfFd!MS#@6+#n=t2Nu7H8c3YTA>Sze8?dMs4BYYZ!+E4zbY z4J#llc{o{M4Kos`xNq(~+zm_SEbMtSfvWm^y8E(EOGCys*)bY8F~&A?sAeqDV_R$< z3#%;iCa1jai-42HphJiNV#pyx0CB`2L;w+W2oXTs;1D8!z+|*b5dlQZAw&Q%><}V= zh&zM`AQBEC0*ItThydb7hY$gT(1Q545ga{zU9YO>UCmccq5Fc|0 zB~)WPPd}uoW1H-k%@}L)!RUArIWZznb24Y_OPt82JND(Q_>^t@Q%)+zFbz5R6C{`t zy#MCKtFYs_{!oZDSgs3*|9zSa7Q z3vLL_;j5crlbZN}$JW-=*3{S5*I|q0l>^g_evUPEF-B20R@O(b7A+2^t!R7*Q-bK1 ztBE?1eewP3jSE|alsb^e=R;Q`CdSTdj(erA1r#w@20;C29Y=Ix1vYXBb z-tA#t^V}Wu(XR{V=x#dV4F&=e2|0)I?z%4m-VS@Y9nVtZX|A(|)J z^I}_xb2aDtl4$j`QMCSY&bN*>krzkqZF)?<4swHNU+}WFg*J=!H1b_XS3&0}2cel{ zD(!DQ9OZWUsMz*P%zNl&$u}kWo+K=0xR`sTO#%Cy)!BM=0pocv2gbjlF}@@?Ni2U&aC;%k`vmvuEXT?ipY${SnP5{n%l;C^ zp9L5zMSe%*N%476@DYh{WsrTEfEpc?ItQgzw@JSPw@Au8Ateq~aAdoe$j3do-NhqhSs}|max*?Bc(=jwPyyrr6`U*l=L9QU z%*VxNk1%(M&kuxODe~t9qhj4Go)>k_bx>sc>K9A7HIgeR{+|~4S;60k=dbMef^T8` zxXF~O_EqUU``W!JSG-?(Z?m-V+tTWP7EB5AhnNv_XsV*PB-TbBT~b;H_CFu}f2Cbje1?kX9i?51m_=k%5k7Z$b|a>rifrw&LF{6F zs+gwDSDqKqXMS3$v{%q)#Z;rTR(~n9E0uPoe+dQXDy6MMe+Fo$(msOzETK-N@ii); zYm~;(E~F=w#;py}8KoU6Ic$XJd8M_N^x*=XR~omrioUBfZtWs^+1Aja zA!8AB;!YB+rMLYz8rAfOXb;hH|1oG=aXyC)p0^mw=|Dzv(@N^iXtx_H=~PDhA4U!R zPh0cc=Q%^Q^t{q0JsPyXP+GX6+o+@ODy_dF4DDs5{jj{-SVKQi+Uwmbt)Bi#X~*<#V=etwX?N&hXoWbk^3{wMcN^=dL}@n{hoN1jw7Ub{#(D}V?cqQe z+A^iplynH_@=tPLy>U4K$*(d&|PmZdKYnXv1c@OKFdx4V&p+rCsuN8(Zj)l=iMS3~f?r zF^sdV^hKqOVGM4iGfMk=#Jq~0Q`*~zc@>>k+PkPrBYj6{{$Lo|50&;X+R#L=DD4Yc z7}`&j_C4x0n(60CdzHe_ex*5*G@fHSs7Yx&|8~&TN^3!%?WBE5>q4LHq-&M- z3E0}GUumC)t&L(zTZ;0ornJ)5puDSzpSE*dJgDa`x>IT8sOK*FgwlQ;>^9ozA*B^! zytLC}N-Oa#q22U^(iZzlp*?MDvi9tu=cZ}rr)e)`wEK)bRLQqLGH?IL=%iRid(_xR z&u6sH8~f?qjP_-tn|7|`eD{;T_+xU%q|qmE6ZiYVH#NSW>-U$I8aPXqmb&OIDlILb zuWF^GZh9I_A@u@1G+0<#>ZLmi|E+a`!KZ6$K%0`~mz-gL&F3Ht74YU~-c1pgZpC{2i8}!m( znTDN}&jIs*K3WDW#TzEZje<>rZGw9RuMvy@KSWWHZxkFA{5a4}p8|ducW*48AftE* z@F(77bb;n$A3R0lOYIc+@VXQa^X0HD_V2QsExVmfz*i#$>7I{*@ z3eQbIAB_Pu`WSFE-3?qy6Tn9LB=Aalh|Wn_Z_(WHN%~8v$y@a4;FnR#0-TTn*w?-R zTuXlk+(7>X+)Pzk01@^8Tge3Oq+5aQbPCu>-vM^fMc{t)V}QCTpaX zggfTbt}2DM)1SI(aKihRQG=7u_kowwo502NHW07@s zlsbSZI_zqc_)QAAlwOe|3Yi%f`Gi7dCPhA_keRb0pHs-pl*ktpGD8}-NK?p6NaQMo z%ruJJq>!0jks}J385em{@T}mJ;A?`Ub15OgM!{aealuK!vw|UmJsSmk1;+&^16iUrSKB17ANs&(}Wag~M=M*y2Siq(C3XTh&P$&^Z zKBZ71h zDM9j!zhI+aui&`gq~Ixq+%soIKBthGDUmNIWQK}4rlydYkjPaEnQ0WcNg*@6B1aT5 zGcNK8h0IKfd`clRXGK1zkeMlwFDPV&0#YA^%!EX)QpilB$W02F=@mJmkeP9jPbg$& zQsh$#nK>)+IfcwjiF`pJGgKn=QOHb{$WNq8|LGA+TIQQ&=d;qA^ zLFCqO2HFkz8sygK5KyOUkz1p~Kpp3yFy!ljI`ts8M!i5hnL}=k`hd85KyHl&fI7}e z*Fqiy>NJGh8qQ4DL5?D~MmGR;oKYf>V?Z6}r+&zBpiT+o#!m)-I^Bre8d*RcrL^iOgP9u%KgN2`(2a6JwyFqW^!|8;VeF4+n=t){K)QK%Vqhd@Zl%qgR`ggTZMF?3W9G0KPe;$-L%*@JB z;WLw-9#J`EqbedBImbg)Tos(vR1?7G^bWM#UV+MmAX7FwBxF^V@R7)1TG<@AYdfX4 zQ(Gs6M^kBYxTZCdj^s3m%ay+BNbZRYn?2#kF;iSx67jT^h>7e}X@`{Q7j) zXdksE4jzf5J7fJ)wYJobL}H*hf_o2CG^<53{62FCLx%(ARATQ)BowS<_B%V#h=|`U-|qT2(`;JlU>o-!r9%+otU3d zmYUg3i21?R56;$X4koNwO5{3X-5E~4uY)Q#zp`zq?NKY0mRjXoosk(y9nCk|jWPEm ztl>y(Rx`JzsXvY3oo{YS@m%Xlgm0Y1*kKKr)^-HW&*yYuYvOo3-)fJIw)kKo-{$1p zpPa?!^kBZJEwwulkERn=zKPd@*2IW~v7B#gOC2=(!ioN)W;)-v9})9e)KFU9JUXk5 z$M6T)cbT*2Q&(};n3#!4(@N)ObQZmq;eqTb%*ytWI46U4lHD7ye1%O5I}OiV8lI-{ zx}7uUWqHii#h#hgwmGZX*4&A&Jf=~6F=Q>Loz4!3tsIvJTOounmQDy9i`M~XD-l_3 zsTtl`EbL`mtsLBN@j%Nnp7!D)eo9QpM#3fI#K05NDalz(#2HsQqo;G^Y zDXEK?(X*cRTC`)@HqTk5;Os&r<>si|6Pd+Gj9HCss6dubJ(ML->8x^$4_8uTwpObC zPV2?0qKK?E*p?%a_>kE=>bN8B^gwpE_H-nLMk^&vJMBY0sfWGtIenW;Nn4!ho$EG( zYc=~uhK5Y5*-9Kw@tJ^6awcJ{V|(Y>AZHOmfvtT_@c~$^bkl%kvn`3?WHe@4JIuIg zA=^Mx8b8$P8$o~_BhehqE``HqJ@QJoZ-jqt2!+o*Qu4p)=J7b51PYihq?Qk_~=3v1Lh!cvCJ=@Ba~wXlB^n9HEe@;gD|KEWWg zHC`8GKDL|jq4bfQ6KGosRZ1K`h`}KaIs3k}C|AeIX7)$1{@62h^92=k(5q$%hrE z;d04@$QxJtlfv)D^foO%#7L0rnMOk7sJtripysjJ)0WKc(@dtAndZ@v=K&^n*zZqH zt0YvhIt!(3%xFC4z;E*?*>=3NwSAwkyrB;l?jBn`WBq0X>tQUYE=Oo9Sj3YTq5swDHuH`_s1gfO*qQ zE3f+Dw3&2Hd$wKtu`Xf{w(|Bh@a>7?rj>Kqa?7WhejJH2OPGXG^H>H==F}{MCaa-4 zJ33piZ(>PuCQfTKG89jw($W5uLpckctO^xriimOw(6rQWI z9JWvFWN*7zOYxisp`EFcvZs+uA(Gy-#g>s&Ix%c+J7%WiO%{HF4Jn=$Nv+ZcqwxWp z9cp-u$yBu^fxB5*6;jeM+}SC$qH(9UwE{RtB%Qm0cl6zWT)9kFLUB1K!M!7~BkUCLnQ7Q z3*mkDPW-NW82>imxoHZ_p#0PDFn$$3m-hDIIctJ{e_!HACZ5E`iHiCVF^#9MA;>8_ z+qE_F_Tw3D1kYlrWB}HFJck{IjtIpAh%^Gv7XFNEK@k(YCgFmKdKZMh98*70%A|36QiJlWj*xvM|FYvIKQd&w2jG>;J?tpGw9 z{^(KD0t~w7ZLUJCY%k2hb*9 zM-LyEw|45|AKr&%MbPk0ye4SDL-#IdLwEtuN|gtt@Ax|B8<)?XuM0zgAIrDkg76UF zI4j>T&TP(eX2xy71sb5s@?+SBMKk?(pwc|lk|>!6ScIzI-(|Oqt|;7i{N(jT8=~0# zkr#ta({tO7OP#{@q7FQ4IQVF$F742HP%d!Xn$_HKD%*qiD#;HrbHR)9d&7y7!X@Mg zzr%&2lrl7-iZRv5%igb16+2(*<+J8**dP@P}RSyE7eG+#y{H zlvQ&Qj06ghcx)~hVI|?@F>*HKwV^TZT*^6YwI^gR;}H*rgqha^&44@n056V2iL8u$7(&$h12ee_CoJGKRXxwWpQ4iyblWQ?uRR5BJBpZn|o z`unWu_#Vag+kN=9GL!w3W<`_eCXhTH}AOcvdJ-9HXXin>bW;Q z^VG$!k6*m^lZRh_=;=2;^U2pg@x&Wn`SUma{4wr_+KqK}hjD-!PQ(w_)@3^HaH8*q z!*Vn_oZ)Jc1ATODf41xqmP1)RS91Q>8aCI{lCW?Kw>uJzle{%CO}U8^>w8NOWM-3c zWBs0F{);KX-)7PH^a6SC5#AK%^X#`1-|lhz1_5u|olm8)7UBWCckKag!~Ep8xE*-Y z+kkF<#Ry_c3yJrbwV8IY1b_nTpH?>-HG!fb&F3e+HL<^i~SvafcN#>AH13HImJX7 zI7Qll@oqkAOG^2pXl=ya&y~++{EC3zk=r%L@BEOvU)HGPw0gFpgoAQ+Nn@|WEj;qq zVm-*_J%GFxa%bCChj;t6nJ?iNg#q|;@9_F(A?4*iTci9kYOt~K>dV(Ph`jB{Hzc{Z z#YyZ8yqXT7UO3rEFHGk`^dtsz2)`w$#TToL{5@Z89Q(@fM$G3h3v=A*J^tU|aD6*e z8GPR2`Z|5Znw*T_H?wcD^fefRf$`>b=a z_R$Ws*V?n-&3DdT-@CrGzV)-$T4(>vZ*S@D?CD&VDyf@LclqTd^B2u3nOas}KJ@ep z>K6qFg+WjN(Fttk2ZRn0`M)0o4_wPa962v|`^q3V_)b3jk$IphYQz11WF^lRmmWCQ zyzt8Jo%YjV8x{rq*ZyVUqq}Eb{k2zL`pK{jSIYMfJ^ZIP4O{lpVNZ_@f@6c`KK3!+>FPw7gfBf>AqyP1>qE80LU%T-5wjF?-p;}@N8PyM_9TYLZ9PhPm? z%+GWUe_s_kpP9%5C#(K%-}YxOELij}m7TLbGV7Wp6aMY&r57C@Gye2-x4u2T?TmG& zY>N!$KfJFz@S*Ql6ohktVq}Xz;CZ1al&3`B?YJw$$o!u_XbQb z>)h5KjeY*0?uy1&AAR!W2mki)uD-)x-q`rk{o7xDaN|o~`s7am zii*a%&J`;cin@qImTTGsLW*Y}SHF8oD#!2u^bo@#Vr2Y%!Z zK>{GJQlr^6M&mQnp0=~;r)~JmcEI++xFn*E^K7N%%jkC##j5U zZQ~yE*scfnCF81XAGea{egvpSVJ5i0HZJYX?U~)#**c@CReWxCyOise8GSeL8{^V$ z7T4O#c8}fJ;J#&CE$3F!#~PP*uV2}oLM+Q`yv53cS`@AUuflk=>F_MC_j&B$vV%mm z@o0~o;u=iV)TVLwd2B8Kx5l`%8N(fNs$|nG=R$Dj7?*YzwKXkE&8?><%W8J#C>N?x zxDMQFjZ3>R+_fINxRxeyqjAIX_RQ~ui#xkB?e=@@Hh_Dpal`Uva;-mwCt~E*E${W< zE;BCeV*GAc)0M1kN%dy;ry8Ef5uhH08^B*-eA>>z?^C{O|3>h8jj#66AA6HClFK@~ zlNtS~-(!C<_;(p!?Z@%0;I928;IB2l_0+|A(sqw%%f(YDLCaj{GJuKgD9e`I{M zZ)G;#7LVOl@c!9&YS(z?=R+QQN$~!s@j`o;pe;%@t?0`1bIIug%eoBQ!^RD5`niqD zb<4RN++P`2%efFEOM6P@MwaIXJa*f_J!)JntIIV%?eo}e2lu#fY4_T$@a*B9uLg0U ziU74Jd;+{v;J>I%IXug2z4F|0-VWY}jHl&v#}MQ8d2FJiC(bmkmeb{0JM8z^T>nMM^Pea%BudJK==~CDAudI{&>Hc@$7ll6c<-S1_kD|3H;y3}>km3h8D-G79x+a6?I?@yPyZhPq0wr=NX zx2^AiuG=1D&hAf_x^8=r`ME#8&q4Pi!AGNhA#-wny3}>Y5}Akl)BQelT|daY+n+9V zT|dY?+n??avhpDFYJa-ab;mQANBh&=3*C~SH1dPYo&D)j*KLzBU-qZ_L+HBWnaq#< z=~CCNW0?>8)BPvty8UfrI4|+1OI^3W$voGe?vJ4Bj*~L4^`}c+HxDw8^{2ZpD_xnl z`qQPZo36}L{ptP~x^BJ6+|-{gb=`WC`KUi#{3es3D|1hOy3}>Y2bpL3)BP!Q-8L!n zNq@T3EyJ$lQOp;4{^NMSa8N&#;Bys#y`unYkYEF_1=s@|1d5>zyKp*e`upQU~90ZO7XBR;am;wvAmZr~Llz#dr%Pz5Xox_}M97GMu>5C||(4hO1$ z1waR|7T5&r1P%a4fMPgrG{CvUVxS9H2W$p*0SAC1Kr#BzXkZSo6u1kx57-Xu0k|J= z92kyudO5HFXam*(n}A)we&7heHF+s84Ok3x0qcRy0N1|hpn1)v14KyTHH6#R?r=w*b?qnmjy*d&t3VyzxT~0|2%issKJF#{mqW0 zjGiCVqgP7*Vjp95T?Rh)D7cQ914vp0cBy$l`>+v)ay$AZ=_BA+WGSHV6#-jc(Uy%COeGS`>G# zTn-+_Y2oQUit%i}X{&0x_QrwtbK|K!cdyL2uPE2GIUd|!7*}ojxTVlxaP5|X`>Jti zHzdk#mAg;9RJpF*3E;kAT-wdznx7u<*ewV5m~m;>*^e|H&ii3-ZB~F6;QSLt(Wb*Q z9}Ph~gIiAY&%|lQ3;k<*HJSUwbCm1aoCNNNjT`zmlWY52JWpoZtpxX6<7&OqyY7Cv z@%MOaPX_;D<7?e!^KBd(hx081e*1{R6!1qG{{+S{+Xv%$odMT3L}4myeAaASmrV6` zuauV1xd@k-tz1sUbAwZcalWt#AlLNI4NAgmFmO1O)a}M*r0nm$%XkZ$?s!{-IRJ;j zf=kXVaNF)Cc6NmORq`|Xe1h|tupP}#rsz}aGtBEDWM~2O$uYePG_N=m&{nGFK>8^sV>oe)&{&cBp>-W8AFVde2qJGY~ zLO;NOeeFJuU8^BE{^4SwzVjeI30VU9Cy=8d?}Ee_9DEwG0`fDExaKJ6!~YqOcSF`e zeipJG@^g?2An$=(1o@|sjgadg2L}&_bCaRCB5El14mejC8e9aNfsXRAP!0{w)bC^U z`{g0W=0`Ff6hz|+`dBnS`T}gQpRR}Gx%!Kc(;&YT+UESI88|OW?;w<=&lW^|{!-}g zXCeq2G`)?G^wocX90K|4*WV83U0=cXVtl_3@=VCDLY@VAKja0f$9_xwN{ka<$MKIr zJ_uO{$>XzC-VON(j<18<1o>x>e+jt}ax>&tApZ*TLCD7;w?Y05zd`;I z@(IY_Kzib?%s)%u--}V=AgsG#!N^b!4NAjf{Burl3BVR5;i6y+TEItv zv7tN%oO6Q7z!a5LkW&>rM)14IQCXj>@twy;h4q|04@P?rUPC1o4aFK4s08K#Z9pIJ z5U>N-2fP9lodG?d3RnPi0BeCwz)oO4@ER}#ovRe62O5DcU>&d(*bN*6^5GB918Cmi zT8jM~<4PFr((ysR=EVot1FU~rXYicD!1JYr^D#es3}3<~q4RcI#~H6nmEE-h&JT%g z#?$$_@oasvRe7$x3&GoAJhf-@QFku;ipM6-MTuR;RhvF;skU#|?nU6@e2^}u%-q9^ zEL^)wmFt!jXN1HLj7z&&T=SD}{r3@Ye_~vg*ICCI&$s?70q^I=qfLir{`IZ@MuPXE z@k0M*uHlU9TmM}G?yJTP{hP_P^_y?~_fc?<7+32xd;Mm7-}(<{*u*j8Yu#q^E$>B` z8!))_I|}@Fa4f7o$9{I3tWmC8znC*6P6ILII<}2#>rU?JGGHq-3YUR$#qpd z?9@Y_x)y(WP&(}TMQeI+B`ns7(dV+d&W?^`OA7Zc^I-Zy6 zF(dA=dF?APjm|vQkX)VOu?rk-LtA&UsTGUXvWBLf+j}zNZfswP8?}1MX5pIb9`M*d zCcfL64?duKc%H$MB&-|q%y$RXcb`L?h0*Zcd0D>u&+I+gn*F|0C1uX@EsTMUubYjG zHT$*ApMcY;7p{YmzXtHhHGNyNqddbbz3xu&#})7950Hvr7gM!xk2HJD&huTge#%z{`M(jraxWk zx@%q;BmMcUfv&sem2uIZE_K~C?~6I|Tbq?%8TLeKz-u`;+GvKkVbNqz8Xa3kbg$i$eSVCAsZn-3waCV;NX{GzJ}u3FjgRB5-J$@NJ^S1=9&8c%$RE{}F zL;80?*w^tj;Lt=LF)T&;1(2|f-;Qy!E93;oR!CVRu10#Y20x19^cVFR)&a+`PAbMA zI2xz{76U0@J+KAn2VMY<0>yC9XrLZw1XcqZfUUr8;2>}e7=9+|3RnQN0c(MWfStfT z;1F;eD8}M_G%ydaz_QsGj534)Z7vFTVSG#t)-s&HzNy*Rqba*KJ_Q?pe-dqsQ-`}Y zJ`EekPNEI|Ud({;FAAT5jVtgQXBc%7e05Z9)I=80$Y5jjNwD$nNOJ=qbz2aauaI=G z7GSuvP}=%skZi}JA<=w;F_7m%j)fcvc{$`b$Z?R9Ajd;q0a*rF3yI&*wQsP$ov&bD z91d8Yyg2HE%$KwWf4(LmJ-TKxB=a=|lKGkn$$V8oGGEn@%-0o=%-6>tnXhS(%-3{C z>9dwE`F$~0zN8KL^HqcNn6DX-%vT*G^HmSYe9eSpzGgu(U$Y^ZFU+;We9eVqzOI7& zZSy7VF1>H)*5f>+$9!D_$$VW4$$a6uhA>|XAuq!B>mWx%E`po@*#J2O@_I*Y`ul$al903taE6q?Dft}zd;r56=NZpK4ubqSB-`n~LbCt7067?Y z>r&UO+jGLt*>y^84eG1m16pS&-bo9rf7@rM(p2d`3#j)5KZo@nvp>lmEracgv2o zO`_TOQuYCS^ZR`s`)K2dcH^i0&Ih+-_t&L>$!%rb0fIr#&RLC z8pon?UzhA^YVTgq)SbfJf~nq~1@r32q5mzNrJ9agek>;veU=XMkRu(d$4#F6;PjgK zyrn}w=na7LvFn7x8SUVpCm$H%6JIty^WouJJ&fSV2Ep~mIpE)qW060?2PAN3OKcl= zv2tA>;GC5B3**vu7MFAEQh*_DPXz6#&)vIV-r|0*r>?tqA>*WfF92~FdpI&K`u75; z>+VO$IOtCoZ7*XVNya^Yy3}>A>6LNLpDx;E#@>*OY5sJnYkL>;uZ&;*bkR;RhfLq! zQlG=W)OD|~mhs7-F4}E|e`PH4=a;&!e`Vb9r;GNSQO7dI_|v7Xd!2=hC;oKN&NJ#w z#t(nG)OG7k#tVPC=V#@iFNc4rJ0X}9-Af?--k&bkBN_gcKJL#ibzT2TfA**Q5$L*m zkkWts=~9>N>?q14{SqG#wgVk-{yJb2unX7^903Nwd8NQKpbeW>q=5CnR$w=92sjRupwm_XjX(;x57-Lq1r7m2hQk&x4`>C}0uKSZfc?M`U=W;M z3d98tskS%6axqL65&r!c#<&$2^uqDc`Tc^tF4eX8OZ2)h43+4j5^B4JUUgEgA6cD=wQGPj5Z2%aKpzfGw==Q-4!T*8eSalSVjelB?-=oJj>hVYQdo^^azYxBq zG}Ph)KUZKLMENx|Jj#uzY|3Gp?qS{ATY`xtkH4YiIIQKkN6YcJ=Kp*Q_S9?FeE&@I z@iR0u9$$k$VZ7S?q1t^;?bfQ@^Dzmg-WS#G8VvT~ceVSh${(V?^7tApceUDk4##-> z8MS*0PR9KHW6j@NDwCS-MwL&id{yN+THacf)76j9YI+r#|3|eizoGfQSM|rJ?A81Z zRewE-xi|AutA2Z4zyD12w`qA!RX+~K_(uH|TE0{9h2P&)UQ+Y1ME&@@=I05mzftPP zuWCA9RlkkW@{CcxU!?ZNXuf7@K9*?wuhgG!YWbg3Kc1@jTBXM~B5%y!Fx5Zb@~P#2 zOY8q({rZx#9qd2gsa8w2fG3D4{Cr`69Dn*Li_Uq96H9oBqp)BIpBE=+f$`fZ8I zZEA0r`e~c-&EJ~-DE&TC{r0rx`+BX{f3yCp-xsR=ht;1$H6P#7@6V|INcGdJdi*zf z{0Yt9*VIo1n$N-3kF|b(rukTr>kFjRlcR|V7``XiPpz+di-uZ{zX0h zRXu)@`frT-ZH4yZCXHXH@waIFqZouRx=<$)7{-@OMb5(vy)8D4~?^XGt z>W|U%&e!^QOWVcc8jpK@!~VHSzaQ3gpHMki+re~|bG01zsBBk1Rj52)%e_kV7wY%N z^!vT~{aKX-urp&&QGjb)N`@EWKB}4^DCrBr-x47L#uuV(^4fwy@I^*^2^9Lm!vWO7 zIc;%aP*8%;H9#N0{`=WMgMvgsiNx0oOh2@*=?|+J7A);668k0M8zhrXA5l1r^ot~Y z7(R1QL72bMg@uy8bwMA03+;m<^KbEk3X3iOgDf6Ng@NgXVQz3AiiA2r0the{O8yxh z+#P+k4{%8s;G&=i#1cp{`+ypN@dbrJNf?jMB>;R_)CV~rl!WRux?n&Y4ips8`%V}X znn@pE#u zH~=fb*+2=v-%P83dSC(22($qypbuCN@cOmQz;<94um|9^9@I z?}Y)MEx8le4eSG60A2x(0s+RhAprO1N&(&%GY#Oqv<<*gpaWP9tOYgz4*^?%9Y8;@ z7dQYM0*(N@&$a}p2YBB~BhUtjKY~7z64J5JmB}-fHMV)FP~D5FsU`b zb%?^N4|&|U&3rJh@g!b($uw`RYtMNgukj>adCStg-L5?kPvV7FiGlGFD<8(DsC@1N zc#)pjEDCj$Tao5+Ogt^nGRAO4N4XQz`CaSUwTJIIHYHwplhV9?*QSRj@ye^@wVP5O zd~Si1GyTwAE1$$EXR>gLk(an&djoOt`Qsl94^-h?EbV(>n~^weGgH#-GZk|9qX+su zu6MTwG+SGfc;!t^^L9kG{5*+QUR9cRG|QenP}%HByz;8kJl>ZU_1*Bge0h+w@g!b( zO=(^#&a*iZryPu@c7Ef0PVAt)@)v!5 zaI)Ewc;#VCH6E|$j@q4vC-KTdzq0dGeaLg$UHUnUW>a*Oi@s&twXV&utq0fIddp@4TD-Zq4 z>SK3gFY^J$W>4ak*P7;Wt}NyA^CVt*$#h$*4|!UTtbbgMVYVbrIm^IVk{mM8)u;z)%6^;R{3z@@9 zoN~~oj58?ZCyOI-%5lzLM_oI7P_WY;Bu+Wb z`D+~ZbfdnM#gRDWIOng{ki&5(^TEJYCW%*`bN<>K+4A!wUU|;>>riBmZ-@yWKpvfh z%%S=)7E$JAMPd#A5dj>FcrZu(VgVXwRrrLXg!x6m*u$V zPeh-xF^qd_r`X!q8N=kb>O1`@<))w2pCnE>$dmQK?XHb1j>IVkeaSelMRr0$*ut&s z5~m!eAB`@svJB)%oN}Cg)EaWwj|PrI5+|HVPCt4mvNMn)amsP}5%&_cUabD3J}z;} zarzPW8ntc)a3oGS&e|H+!g7d^3a#8ZSD!sjkz1 z%1>e5GHyhS9v)}+W|FQPKJ8q$dNeVOmzAW+q?R0K)aSWb9nJ_j+{YnChbaTDs+ESJ`=xW2%dGYr6M&bmf@nR-wI` zF3VBmDO-`9f1PYjs>6-Lzjr`Nxbr$ zwaaFYJ(nl(%0rvC@*RroITy&I%;rmpS03uwcqQoTQa(RV;+5Bw=HdP?Egv@cotpy8 zp2RD!In8@0ZO_Y-c;%t5S)YC(Z4Z~h`|~O~%56<^M_`<>GRAR5N4e;W=AXup%duB% zh8OTVewBFTppxGiBpbq zu7R20RL|IVs*QbUqwm+i-+1mETv327j{ZF2OXme=rG}%Hcc85_Vl6ig$6Fbx;ate` z!_U9&*F(WO@5m>n#ZUHKj-DMf!lw-Uo!&_*JQlq{x=hAfneNq1nOa>}S&y-V!P4`m zKP-4a)0cKD9Q&J2-#KUNjJjfGU0v<0Ni$71x1A4%*9}m2T-Zj8CDLn0X9iQJOr2U) zUx^kYA-A2g0-om?I)He8VUKWbJ^t`sm8MiMxvIRfy1cG7WWJlv&WWDOusWxWy3UoU z?#_%}u6g_AdbiTisI~Dnu9k!2Mo*mvXX_2uAwJ_qm1Ie7Qy;PF11xbi*b@T}e8P}q;Q zIlSz+9XWWra`3*JgZG0Ryr1OY;a>EpeA)SYF$eF}9K0hrc*k<^c#^ex&&~^<`D68v z9mi+<;HQ!>WXJK@J)et-$Kx}NZ&6?4V-%46@LAy>*CW|+{WxIH z_0EptGZ#26GvM?U1*XaS7C447a2{)caeP-pu^!MVR``u^e1{+YhasVof^obS-^!jH z_e>5RuT_lW?aRUAJNM#ve8(RChao#Je5YONQ>j~TIM*OT<_qoBfj%2j>mVL#o6OK&Ej}` zhglqNWDXwhFN@=q=ipW4;PIVfarxvs#^UVponmo3zC$dI$9IOs@%WCgI3BM%kK^%r zk{Q~^jL)w;AMsgYadCW}S6m#Qsb%Ne>@@jYs~Q?WaN`OwnHWl=ux$GkJE6;aaTx3v zCGR_?ULnrPMc6?~ASK?(lKD@GA>03l8yHUmbyqaL`skA{KlrzYcl90q^2WxO?%)3M zgBxG^(qF&)&8J>|>XC`%6DO8eS5!3Cb*@;^xw5gmBHFZQluuyypB z%NxtCnb|O_8#jI5+1Y*jxEqq)J$QKS^gAlcCYM!|)%NrxS2TC5sZHUnD9yd8WX}oO z)yu%!lRb@=Hn&8XYVh{!Z@pr5FrlZrWkMSs5}fRA?!f!1<-oG`j%3e-miO2aTdXDG zdBSZ?sjiNeM)}0L3k{rbdTf-f(kNFZQ_G@8c}HfWY|=*Al+h?pP8PblJG+wIDYj2D z)2{84LkF&U37h98Ja2;GEWm~oPP;isaO!#iz~S$0UpFa8*?pURXFOZ0Y*- z-39k@O8~CbsvtiM>y#GSF#H_Am(f6*gYC%8ete&Y9F#zE9Ob^~L44*lcf6PEAacq5 z<2D%Kx`TTsEXZ8oDuDYe^MLulHNdsN0$?F<9Y80rpxA~Eoy5W;>9Ei&F!!OjJ{bm_ z3D9w81LpwTr{<0DgW5*Hhf=#ZPacFS%uU1;G6%JWnH-4)DBkB~Sy@0yBU* zfcsJ$&u0O%fjPkMGBo@y6VIpp2jc8EY@ydL0~#<(P;1-v6T((T!@YzlSn!ZGSH&ei33Xz5P8`P0u( z7b?+M>FVNeKD-AHaITks{!b9(pZ_C$DgXQ*@k0_5M~*G|=l_TwM#2~LNB;Rg;)ne6 zf3$yKp~ZHQfBuj7A^-dzGzJ9zmN*C~#shguAZu`>57K?UPyYEox}BYW{!jk-KUhTN zpZ^o&pZ|j~^7k3I{>xwgD<02%UFHY#`d_=g$Jgd;Z@?FqKlZ`!z-knO^LIByKMUi{ zqxtK<>6!fX-_}0ZR`|Oc=l0owarx`Nv%Mnys~Ly+duDc^&)R`Ff38AY9FKiBj@Ori z_xT*WFX!Opum6T~5Zv*SpI-#59%YY>{GHMQ+e`lXZ}CR9U-H*~`~8x?{@d@D{Po{{zvQp~_WLD&{kL3eo4@`$ zfBm=gkpF*wdHwfSCjDq1=R@ls*>&@q^ETDof8!0WuYGZUGJpN|AIJ6In^F0{>+8RH zo$)6C&NXiXngH&Jv;eIDuiaY)EC<>E?ul^SY}bF^h|f0wyxx$%EuRX!AFuyjjC?Ht mZUSxw8UfzVdn>RMc)wl$eLM1$4|xydJ&^Z6-UEMp9{7I@hbNE# literal 0 HcmV?d00001 diff --git a/Common/99DataBaseAccess2/Common/dll/MQTTnet.Extensions.ManagedClient.dll b/Common/99DataBaseAccess2/Common/dll/MQTTnet.Extensions.ManagedClient.dll new file mode 100644 index 0000000000000000000000000000000000000000..99035f681521e2f7de77f9108af911e9768b8054 GIT binary patch literal 45568 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 mVvNAhON@zWFjAF%cRoA_V%!2bc-3~m|# literal 0 HcmV?d00001 diff --git a/Common/99DataBaseAccess2/Common/dll/MQTTnet.dll b/Common/99DataBaseAccess2/Common/dll/MQTTnet.dll new file mode 100644 index 0000000000000000000000000000000000000000..29514337fa29d1b44093bb04d465550f31c5eba2 GIT binary patch literal 293376 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

%Y`YjZ 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⪙W^k07#wt47YU^>^=bw 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

>wk9Qmb*Xr!(8w4fBE~JUw`&LfA`tfe*53g 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 literal 0 HcmV?d00001 diff --git a/Common/99DataBaseAccess2/Common/dll/MesWorkMqtt.pdb b/Common/99DataBaseAccess2/Common/dll/MesWorkMqtt.pdb new file mode 100644 index 0000000000000000000000000000000000000000..fb106249579e14adc3849508ef626c6ad94d5243 GIT binary patch literal 24064 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 ZUJk_HSUB-t=-^CY@tJmX`lW>i{tKdD00aO4 literal 0 HcmV?d00001 diff --git a/Common/99DataBaseAccess2/Common/dll/Newtonsoft.Json.dll b/Common/99DataBaseAccess2/Common/dll/Newtonsoft.Json.dll new file mode 100644 index 0000000000000000000000000000000000000000..597a1cef97ecae69891fa0366cdb2790140bf0d4 GIT binary patch literal 502272 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

mf6P`GVZz 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⪙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 literal 0 HcmV?d00001 diff --git a/Common/99DataBaseAccess2/Common/dll/WebApiCall.dll b/Common/99DataBaseAccess2/Common/dll/WebApiCall.dll new file mode 100644 index 0000000000000000000000000000000000000000..a519e2aefcc175d7a4149dc9138cbdb715dcfc65 GIT binary patch literal 21504 zcmeHv3wRvWk#2QQKjtmX$dYX=n=uAwupX9d87wfyk|o>1Z%ck+kVl%fJa{xc?itw@ zMv0V!5CUv)c*V(Oc^I;nUGgAgvq^yLvI*JEgH71YetD2MVY7jdC6|zU*(BWW+V`(> zx@Sg`ZOC`;-F)}^cI2r(Ri{p!sycP*oIc&-jeG7S9}#Kzo;gGG1zh>FO2G4jaa2by z{8E%Y7kGaD7nBXp&+j{sDJ1faJ>;Z@6N9N-&Mqbftb{X?OJs71uFbuPVLNR#M*i8d%cs@}HuPOrD0(nX1o(t-+53`u?YAg&2~$MGeq7G+iH%>04&L1D` zyO~+}U-{~yOv2|lYfZ7{N~^dP=0Ya6~5pH)Pi z6{sja$9~0!byG>F;uX+)F_9vuL^oxK@*d*S&Ud+9oiPS>O-;@w3PNTQPBmyzO^Zqm zXo$KP`5Hs&G3J_a+Sj1e1&ziiNrHWWY~@SN;ld)SY4Oo@UWaP3o~i0Z80J*~t2zpE zK}gOM)S1Z(#Wj&Ymx%}*P)Km?d_i^4Up|ROXfMk40#U9@A{5cn4V1iu3w6nbd?|q4 zNWM!{U8E+HqOi~{2)$HlhhFFH*z)HQ6Xs+EGAjBiRI`h&iB+GYbTB zJGccSigw9nR0rd9x(@zRYz%ME#`Fq?8pvE!vJP!@F-DLRBh{xxbsj_`s2X~dky$`O zrrnB`Nw}vW?2j~1fX7Iu)#%H72kqbiw1cl|w3ybYLX+Djoa5f%G={h)U zjtsjW1!_!aVDh*q$QdfN(W2|A3aGFVu}OjR>4b)?JG$n6VvultC!%Y1;;G<5Dj=AG zkyGqW(KpYOOBWFajTCQOFw$@94~+MuaY5j5PI%jP81qs)wgIjp1oGS4fI$~FglaS@ zAbGe(u>V{eLYPG*8=~((7mRyJ7tR~oAqj&JD`41+ppm>1y^MiLGt@EYs2RR742x!H zWAM6W=won{W<<3y7_J$$V^C2uZsG=UN`kXNBFU>D2kyq0Y4j~zp>mAo+_4VoUQ+jN zcv5@#l9|p%Oy`F$ndN)p>vXd5p^&M0th{ zAA?qBV_`$;Wv_hPECYj5qmHEki<^zVEO93N=>(MnYj*bOXwfn`eU^is=0|tUKS<4d~(N$w0T(DE{HYZX(rWk?4 zn}3t!V^32l|FN=sw>RJP-jEYTZ}vXu;XHvR$rMUWH3)A(dded;C^JQhtK&6y06fV- zfZH)q6fCPDm*}mq>u23SX48iWdu9uzQSICr4d#!`kPsmiP296t-~zO&HopH4G*^KFE&h1(CAk>z*6ytpqp z#KWplOtTMg30~vK7oE#6Yy`&LN~{?ecPOzIVBD3&mNazuAg2_VeGRR;i;MKXwP8Lc zov3&5SkxnkNbbW{3Myg1gIA=^oH>J4*>}1Qi-5N(yX)>1~@1n9Rg1d9Xq z?$}{z!MczUSCThC2FVpt^Qj_M&ISqx!58+6h>8dXL=h*98ePVe;hcnhHKvRyBs~#R zZq5M4G3CwaEISbCP_>7-_gKJZ=VU>X%b)FGc@*qJ3>*dpLH9c^petlkj`GSdHDX9g zF+Ju_V%dj{r$T0>PL&*eRP2S<=@0@4(^;(UlN|gEg@p=Km8;3Xl4JfPyY4X zF{Ap<7AR9_?;vh|HYIK<^J_U$M#Rt~QWo=|y8+^}|8E9}XaBdqFXLkla@*HnKa%`8 z=ggG6`X<{_kyk6%HJMi@%>krRb?h(Ko|q1gF9^ zro5M|F|cbfL{7pAOv~FT%=-~<4>FhgI7=6sE4n!M9t1m>$~_2le>=IO|BvLpv$gK* z`d$gWaYk}hKb)-4x6;+vuS~L>?LMEJXa4{>xIv%`&!NxvD&$~XOs#Uy5&`DLc*X7r z`;uw8p0AJD5L2;lxOP$>!|$k%QfQY7BCd7%7VZ%fuuVN?@;YdAYp7811u70L5%JV8 zV|g`b%imz|dmQa7|D|Ai_Yq8!F&rIeYT+msvAk;PF@`p7e}m33DCgVll^o-mcgva(%i{IU`4z;7EkoGf{v2zl9t(5jd${sVuEg5i zfZP2qVY}p3;{Knv?Cqaq(WF+iuqV)L3=>pq*r%#DaUuC$CLts>=7cbq!kBC&%l7-g zW51ufRCL(JH`5Z;C!ylRgK*|51W55WqgB&gr)C;;i{rA#({-@G+orgrS|)j_3cEy~ z;%>zJ>MsAafw;L3M`qt-yJM)_#|8gCu^4Id5ZdJ69WV zBY6i3O>5M;OM>ETMvWO`$a$JtW2*9)#=sprMx=p$d>^7fJ;t>)hI$iUPuC(4=BTw^ zW61k3@)&a1JX2(n{nX)|4-vm4f72*)0Ngh8&a`!mi~!&D3M%0B^wH ziU6+(#)9pyS46CI2GYhSoH489jPMj^ zgiFqN1oO&uM)(}g2uo++W`#B7i{}hMa-G5VGdwqhK{Li!wdMbvNfpjmR&qup7HR*c z>x^=^+aD=ejcq)vW+<(W#-i?CvS9w;?E?HeQ#pSmK!p$1NbBH&N8dWB?7wR+)cIqPP4t%bE>;>D_yn7TNcT5vut zGkG^NE$V24?NIwId=KG!5dMa*OCL_{qsaSwK8TGDy$kyfV-Znj?=_tY_9Xm47NWy# z%`MGKTb8!AGexH?;4Ub&0J-_AxIT#FvY@x1?Y;EKCGvURg0ltv1$q!^ny5SFml!4hIQ`-MVXi~Gg7X1j!{7@F&PNmz?R3OA%Y5B0 zu_}Shu4c@jxdQ7_C6*9aO0+ZRB7xl;Cupi?twwt#PGT>jJ08=(K!@b7hn64a?F zbRYdMlz&L7q0k#-0-m8TU{r|#)+)?%ser2mR0L18;J-yk_=YIID#}fCfw3jQ{{6tL zA;gl@rNDgVJWk&T>;`tRz+^j>ngsSfAq6L80=vuqTJR!6 zrEwPv>F)w|pNq}Z8-YD2uzUS?M3)#o`YVA+nLhd(fgPVU9NLZi@_orkA5|^~r;1?o zwDwV0V)U|kCF;6d?9%8phM(?svENqhF(Q;)Algw*v5h!waj}n7jTtlP5f^(ra)(h* zKXS2eRXuFXrx_Q^c6a$dYb>M#E_NpJ98Q@Z6xak+2VOKdg-NZV9V1J84COS2y46qR+Y5Ms>NlhWw4P?tMy^ zxt8`eN$h_pTg?rWZX`&c&Xo%A0#>)l$j% zn!rBjVqc4lqV6>pI|b}|+KiRi(`6s+nuMhV_L9S`YyP$zpv zLDu6|k}k_%6%r)nM)*^qtv=?F9yRWS6kM^Yb&*?gm+`bQt8hC6}lzD92M{cpg|7-UO?kJ1-Gc@OqAj3fPQNQ#M5f!%h<036dSe#l#ss~ zqwp`V1R9MybLc@AJEi_y~9}BeT9qJ+9<)E+OQSlhs z9!J~9(e{LLQhi8oqm9AG0lyPnuf%DX{y~o;ei_~);9~+lBj67JFQt#ux=SNWgHyVQ@U537D(w{M?s!uJv1=Y8Mw{m$2w*Q$He z5%qQ73_Yp$=|x=|=S)}mS%nOa#9jJ4srMs?PNjXFZ*HgXokYv2((t5p3g6SZyep{e z<7xdFl~LqJMXA>3Dj(3%Y{j6RD_XhY%4Plitu3^|u?l%RSFi-$D)5o4 ztfdtzN5Diq-MNur%SjDnt$nT3mns~@rK2#K8|3mvt9ZapcaCJTY0GizJC39>MS*R| z6pA2ju?ylHpq19x&M>-JS%Bmv)MxkPic6P3t8B(qY6-2kMt7vLBi5Ew#@V-oR@=G3 z5ywGwS7xx7v2!VB6y(X8FP)476+N^~vbT&C*xY53=`vaYWrvw^ISpCG{_TBhmdh$! zdUA*DgVs)KAeGOoO!xP<%NkrZ+Ub$3wUV}3sq~f&s|oM%9<&_Bb~+Hqq{_x6;##ZN zog2#JtiI8_wZ^fBnG?kR)xG`VG-UHgQCwM4Ha%uO9>d^sMs=L)I)*5=%5dpMu9idI?-c2A*Zs$-;R_YS7A7D7&P!ni_e$f9+{ zVt$)DgFRY#wo*@52D7`sGnclFS>-hk+*9x=9TsUKttD9&rXO5675hGlMD4JkYPmr;WTChds;Y&diy&1 z4xnkeqln}=Fai-AtC_6jh;3tZeG2C>6@}UdLM;EEj{t=@qN({HT)|I&jvi;e0ALT5jXcVeS+C3}mvI zVnr?2|=cpEQfjJ6?N+^E8mgL9Cl}iSfF_+@FtOrO-u)@ zHiLGW3-0uC)ogYh%{ALB%(I;6Lgsob{cfRhk>t$nlD#bhmJ-fk72>;`)DcF-q?I## zgOwX99-y5A9r+Axce4GMm|R?q4C@v#JyGEzT}8K0**O~G7FM_jui}(a#W40qNFtnj zvm~3b*otCv8Yt(Q6p|PwRj%mRSsHP&l{o=sS*c-3IW%GkJDGsM;GbQIj(f1ex*dy+ z5_!33V=6~|$lkq(2P$GilB132jMp14HX74VEK{ zoAZNR*04=>ezVh)r%c|{Xp>cJ<|U1Wct_z;v05A=={`=5mP38`5tdt&(c*4Dkxh&J z{R46@Dm;peERs1Km_pv;Q7TVyk60S&wAEz~H+xBzdP-x8Xx)yb-QnSLH@Ap-Y;jSs z!9F4@+=Ul8o|*?G6c^SMdpx;m*@*oE*A2=jf%=pZn)!rP#{@HTue6Qsk&S2}{wf3q#Tc*{!ekoLjvDlmA7irREld2Gd8tQsS!Y;SQi3r4uJbF_#8Pdfy&x4>c`+xq*9_*tT7P$}Cq z^G!#Iyfc$aV?AwV)eGJnEQr)l+BJ1y;^a8vms)vo)+_^DcJGxr04vMeEHPa@5^LHe zH*-^JI3MxO06R|juz(?UQ-_p~xg#{hRs!=Hi#&F~?uL=I2ZC(e(*@w7mAQ!%W4Q)y z<2>Gxb|%v~(m)q8xxaW8hDwnL?rHZ`|w_ylc*@6nM>ngTP+qTEPt7z zRF6f9>@E6QEpH>ekSb@g0_MEu49O{%6_JFoYKR5SN`r~Flbnm7mxqatOEuWm6X!qF z9>#zlBIsC)PN76w%}LCy*RtX&H{4roE`lSq7T-?rW|A( z#o5#m@z+HAU0a%jR#|A31Gi0Sl+vWk=>WZm^E0+MLpN5)p{h>sq(EmY6VPuhb#uSw z7Mu&OCc2XCO+kvp`=QmSkls&SLQV>N8F;1$D>j0+AUwn^D8k;`1g>GwX_+UfAM$aM zPdfmyeL-C(WJ+2eO6>7cD{~O7AuBKd?QQT=l~-cDa=<;guEwFFklq9Rs9|!Q*R$8l zYS%}CcaCg#*1DzdT#n}rS}?WET6mb_CSUR#=}okR6dzt}(OVHG3=xm|axORR6r)vy zH$2}@_R%EmV^aIFPboIFJzZX=c%CTppJxo_uZ0dsG4N{vQN%qBU?i;4$kV0gwsj+H z&LKjIxH@z`PA{JNX)BNTT-j?s+LfcIX%iC)A!*o;1UxVJf}bI-=@ox;aF*YVs6 z61It6cj9f3%RpO8YcP8UaRQ&F!?+HkzC&EIbOY@H|1w0*2GBR5egJ;F3V&qgMUNE9 zU?kkK5AVJDkdNk{E5F=;vF4GZKpt0~-((JnI6(HKofm%kz@`TtUiYP6Y-w0?{jSxd zB^1T)OOT?Y5Q{MyWuWQ_Rf$Fg)iOYck3S|a&-zSR8xAueHlfH%fLr+e5{d8=OT5?u zPJnoaY5LUob@A)`#DZcIwR(c$6SGb31Xs;e;wc7ruBpT)=Hee7h{X;?HN0DV2I{yQ+qutLisZ*-^Bl^!V}k_;I1k z@mU_x6?%_%Eq8cNMZ**E@e`uqiJ7Kep+AbSA{rmR-|s3KH6-bRiVhx9qp|TvL6?P) zV3lQdcbft2zpg~_WI+^a$ZS#YG+-XyJ2sG}{cIr@!>8;QFE(jpFhQE~*;E z@J8oy&!fQc&{io``tdjPO$~43Vq(r%joAUrF{)CTd_4Rnj6U9e^^B@(`(S$gR zMw4a)UBAk`&(-7Ozlx8);YxO;V3^;CkH3jmeGoaVQI5a(1m6FIgm#R{T>K{oAO%GX zykRDMp!oeF{H_Wh{J8Z*dxIG*_cBdBck1>6e~Y%=c-q9;BD$k-6RqJC;R6g8{&8Tl z#WBQOMb(5_k9KH?FsVmde|`1jwiEU9;A-)a;@sdUMI{t`U)OHw_K1*R#-zXBra zVGIZN1pY;%Ua(Hon!$QF?&gY~fZ=T^rM_AXC-Bg;UQ}@gz}$I^?L@bMdN#UbshDM$ zbCZqaP=}l9D=l-CEXDe)X_am~&zn*)C4d*1F+ajiKeM!*rbt2MfUw zo5)0Da>{T_#>amwVlq;#piz9{5Yosz@&y%yC)at={F30}kbMa>2&lopBGthS2wkW! z(H@N?AYlw%egWtR+KaM?lMz$Sp{UFl&!I8TIp`j2QB|I4)$^2Kuw+jaVpV7ZCY~d~ z1W+kjn1bp4S2yn6F}v-jxB5SGb^m)}{~Wx+-}1@LFMswEpTbWZ@bMY(ZhWu9H-+yk z)u>kuzv<3&Tt%3oCZQSe@#h)5z~G-5{J_tAY^i7fH6b&89fOp}!q7@H#MKSc5P6HkL^Mn=s@h*2 z#UEZ0MNC9_mSYNW5*j~V=DjD1N4-)^M9B4Y*8J>bfE0sSeue*&6ny6Kd!v17-A*T! z$C-TTG>y-~j}#Q}nf$DmsuT)V96drIrp{C-UOGNb{Ox0j#FCaJc=ZfFNWXZgby>PK zonF?|(mL4Q)V6fl{-*Z!w$`T0TKBiNTsCMeT{bX)*SOI^E8gP9AJImI>YF!p_mz&- z8{GrktMI1xWzDV7G&-YH$qzTOsZl;ToWZRUrJ97`)>y>`g%)~etFDBrtn>e`dP8;EdBLr(^Oa2-#`ofb z_-4= zkMDi?-p{=9@#8Q5$)COQ?42#Kr$B zFh04GvkUP(>ohv^t;2U0Y8v_F8~4-bYeQ)VP80e8yKx`Wi@T%ExNqslbrbG$HVe*Y zwAW9|_fWV8{>Up%P{aqTNO{7zv@To~Naa(FHMsNSJJlZC$?z!&e=Zj9-1MQA&kqWy zFQ2Oj2KtP4I|4v~PB=n^gd9#Qrc07(& zr&ukeFVRZ;cO{DO5T7+T(3j6;N+&R9?WY-cpnOWkpLO{4hl0CKJn9xL+44NjaoBT1 z;=BNJVHz!g_qY=HTLN8{;E(W&fA(8hjvOIA!y1NM2XB*kUL<&jb>@3&?t@2&b@s-H zF>&Vfwz^*?d@WD<(zr_=gon$PpWDZ6!pD=_P4)CtKQ9+;I$%XX*u-Zjqwv7nwG&SM XV}X70H(0;8@{gs!fA;&w^uYfHnTXXj literal 0 HcmV?d00001 diff --git a/Common/99DataBaseAccess2/Common/dll/WebApiCall.dll.config b/Common/99DataBaseAccess2/Common/dll/WebApiCall.dll.config new file mode 100644 index 0000000..6035ea8 --- /dev/null +++ b/Common/99DataBaseAccess2/Common/dll/WebApiCall.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Common/99DataBaseAccess2/Common/dll/WebApiCall.pdb b/Common/99DataBaseAccess2/Common/dll/WebApiCall.pdb new file mode 100644 index 0000000000000000000000000000000000000000..16b7902bc72852a5f41a546970b916612bb9094a GIT binary patch literal 75264 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 literal 0 HcmV?d00001 diff --git a/Common/99DataBaseAccess2/DataBaseAccess.sln b/Common/99DataBaseAccess2/DataBaseAccess.sln new file mode 100644 index 0000000..87a94f3 --- /dev/null +++ b/Common/99DataBaseAccess2/DataBaseAccess.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32901.82 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "04-DataBaseAccess", "DataBaseAccess\04-DataBaseAccess.csproj", "{F434E066-4C59-47C8-AA82-6F48CC84501A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F434E066-4C59-47C8-AA82-6F48CC84501A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F434E066-4C59-47C8-AA82-6F48CC84501A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F434E066-4C59-47C8-AA82-6F48CC84501A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F434E066-4C59-47C8-AA82-6F48CC84501A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {CB4AAB51-C433-4A0B-B835-FF7E3CB86238} + EndGlobalSection +EndGlobal diff --git a/Common/99DataBaseAccess2/DataBaseAccess/99-DataBaseAccess2.csproj b/Common/99DataBaseAccess2/DataBaseAccess/99-DataBaseAccess2.csproj new file mode 100644 index 0000000..9616abb --- /dev/null +++ b/Common/99DataBaseAccess2/DataBaseAccess/99-DataBaseAccess2.csproj @@ -0,0 +1,54 @@ + + + + + Debug + AnyCPU + {5C0C572B-F8F1-41DE-B049-4D40AE29CD21} + Library + Properties + DataBaseAccess2 + 99DataBaseAccess2 + v4.8 + 512 + true + + + + true + full + false + ..\..\dll\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Common/99DataBaseAccess2/DataBaseAccess/DataAccess.cs b/Common/99DataBaseAccess2/DataBaseAccess/DataAccess.cs new file mode 100644 index 0000000..77d8a54 --- /dev/null +++ b/Common/99DataBaseAccess2/DataBaseAccess/DataAccess.cs @@ -0,0 +1,611 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Configuration; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DataLinkMesWork2 +{ + public class DataAccess2 + { + public static string ConnectionString_MES = ConfigurationManager.AppSettings["ConnectionString_MES"]; + public static bool ExecuteNonQuery(string sql, string connectionString, out string errorMessage) + { + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + cmd.ExecuteNonQuery(); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + //ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + + } + public static bool ExecuteDataset(string sql, string connectionString, out DataSet ds, out string errorMessage) + { + errorMessage = ""; + bool result = true; + errorMessage = ""; + ds = new DataSet(); + + /// SQLSERVER + /// SQLiteDB + try + { + //bool result = false; + errorMessage = ""; + ds = new DataSet(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(sql, conn); + dsCommand.Fill(ds); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + //ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + catch (Exception err) + { + + } + + return result; + + + } + ///

+ /// 增 删 改 + /// + /// + /// + /// + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlCommand cmd = new SqlCommand(procedureName, conn)) + { + cmd.CommandTimeout = 0; + cmd.CommandType = CommandType.StoredProcedure; + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + cmd.Parameters.Add(sqlParameters[i]); + } + } + cmd.ExecuteNonQuery(); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + if (conn.State == ConnectionState.Open) + conn.Close(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters,out DataTable dt) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + //ds = new DataSet(); + dt = new DataTable(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(procedureName, conn); + dsCommand.SelectCommand.CommandType = CommandType.StoredProcedure; + dsCommand.SelectCommand.CommandTimeout = 0; + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + dsCommand.SelectCommand.Parameters.Add(sqlParameters[i]); + } + } + + dsCommand.Fill(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters, out DataSet ds) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + ds = new DataSet(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(procedureName, conn); + dsCommand.SelectCommand.CommandType = CommandType.StoredProcedure; + dsCommand.SelectCommand.CommandTimeout = 0; + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + dsCommand.SelectCommand.Parameters.Add(sqlParameters[i]); + } + } + + dsCommand.Fill(ds); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + public static bool ExecuteDataset(string sql, out DataSet ds) + { + string errorMessage; + string connectionString = ConnectionString_MES; + bool result = false; + errorMessage = ""; + ds = new DataSet(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(sql, conn); + dsCommand.Fill(ds); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + public static bool ExecuteDataTable(string sql, out DataTable dt) + { + //public static bool ExecuteDataTable(string sql, string connectionString, out DataTable dt, out string errorMessage) + string errorMessage; + string connectionString = ConnectionString_MES; + bool result = false; + errorMessage = ""; + dt = new DataTable(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(sql, conn); + dsCommand.Fill(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + public static DataTable ExecuteSQL(string sql, ref SqlParameter[] sqlParameters) + { + string connectionString = ConnectionString_MES; + string err; + bool result = false; + err = ""; + DataTable dt = new DataTable(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter(sql, conn)) + { + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + dsCommand.SelectCommand.Parameters.Add(sqlParameters[i]); + } + } + dsCommand.Fill(dt); + } + result = true; + } + catch (Exception e) + { + err = e.ToString(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteSelectMesWork\r\n" + sql + "\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return dt; + } + + public static bool ExecuteSQL(string sql) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + cmd.ExecuteNonQuery(); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + /// + /// 提供通用的调用存储过程的方法(增加数据的数据表的到数据库的调用) + /// + /// 存储过程名称 + /// 存储过程参数数组 + /// 增加数据的数据表 + /// + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters, DataTable dt) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + // if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.InsertCommand = new SqlCommand(procedureName, conn); + dsCommand.InsertCommand.CommandType = CommandType.StoredProcedure; + for (int i = 0; i < sqlParameters.Length; i++) + { + dsCommand.InsertCommand.Parameters.Add(sqlParameters[i]); + } + if (dt == null) return false; + dt.AcceptChanges(); + for (int i = 0; i < dt.Rows.Count; i++) + { + dt.Rows[i].SetAdded(); + } + dsCommand.Update(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + /// + /// 提供通用的调用存储过程的方法(增加数据的数据表的到数据库的调用) + /// + /// + /// + /// + public static bool ExecuteStoredProcedure(string procedureName, out DataTable dt) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + dt = new DataTable(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(procedureName, conn); + dsCommand.SelectCommand.CommandType = CommandType.StoredProcedure; + + dsCommand.Fill(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + /// + /// + /// + /// + /// + /// + /// + public static bool ExecuteSQL(string sql, ref SqlParameter[] sqlParameters, DataTable dt) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + + + try + { + // if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.InsertCommand = new SqlCommand(sql, conn); + + for (int i = 0; i < sqlParameters.Length; i++) + { + sqlParameters[i].IsNullable = true; + dsCommand.InsertCommand.Parameters.Add(sqlParameters[i]); + } + if (dt == null) return false; + dt.AcceptChanges(); + for (int i = 0; i < dt.Rows.Count; i++) + { + dt.Rows[i].SetAdded(); + } + dsCommand.Update(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + //ApplicationConfig.ConnectionStringPIS_NEW_Value = "0"; + //TestConnection(); + //errorMessage = e.ToString(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteSQL\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + public static bool ExecuteNonQuery_newID(string sql, out long newID) + { + sql += ";select @@identity"; + string connectionString; + connectionString = ConnectionString_MES; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + conn.Open(); + newID = Convert.ToInt64(cmd.ExecuteScalar()); + } + return true; + } + catch (Exception e) + { + newID = 0; + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\n ExecuteNonQuery_newID\r\n�洢���̣�\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + return false; + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + } + + public static bool ExecuteOutNum(string sql, out int count) + { + string connectionString; + connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + count = 0; + try + { + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + count = Convert.ToInt32(cmd.ExecuteScalar().ToString()); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + } + + +} diff --git a/Common/99DataBaseAccess2/DataBaseAccess/JsonHelper.cs b/Common/99DataBaseAccess2/DataBaseAccess/JsonHelper.cs new file mode 100644 index 0000000..5ec9f9c --- /dev/null +++ b/Common/99DataBaseAccess2/DataBaseAccess/JsonHelper.cs @@ -0,0 +1,336 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Data; +using System.Runtime.Serialization.Json; +using System.Web.Script.Serialization; +//using System.Runtime.Serialization.Json; + +//using System.Runtime.Serialization.Json; + +public class JsonHelper +{ + #region 序列化和反序列化 + // 序列化 + public static string JsonSerializer(T t) + { + // 使用 DataContractJsonSerializer 将 T 对象序列化为内存流。 + DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(T)); + MemoryStream ms = new MemoryStream(); + // 使用 WriteObject 方法将 JSON 数据写入到流中。 + jsonSerializer.WriteObject(ms, t); + // 流转字符串 + string jsonString = Encoding.UTF8.GetString(ms.ToArray()); + ms.Close(); + //替换Json的Date字符串 + string p = @"\\/Date\((\d+)\+\d+\)\\/"; + MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString); + Regex reg = new Regex(p); + jsonString = reg.Replace(jsonString, matchEvaluator); + return jsonString; + } + public static T JsonDeserialize(string jsonString) + { + //将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式 + string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}"; + MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate); + Regex reg = new Regex(p); + jsonString = reg.Replace(jsonString, matchEvaluator); + DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(T)); + // 字符串转流 + MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); + // 通过使用 DataContractJsonSerializer 的 ReadObject 方法,将 JSON 编码数据反序列化为T + T obj = (T)jsonSerializer.ReadObject(ms); + return obj; + } + public static string ConvertJsonDateToDateString(Match match) + { + string result = string.Empty; + DateTime dateTime = new DateTime(1970, 1, 1); + dateTime = dateTime.AddMilliseconds(long.Parse(match.Groups[1].Value)); + dateTime = dateTime.ToLocalTime(); + result = dateTime.ToString("yyyy-MM-dd HH:mm:ss"); + return result; + } + private static string ConvertDateStringToJsonDate(Match m) + { + string result = string.Empty; + DateTime dt = DateTime.Parse(m.Groups[0].Value); + dt = dt.ToUniversalTime(); + TimeSpan ts = dt - DateTime.Parse("1970-01-01"); + result = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds); + return result; + } + #endregion + + // 对象转换为Json + public static string ObjectToJson(object obj) + { + JavaScriptSerializer js = new JavaScriptSerializer(); + js.MaxJsonLength = Int32.MaxValue; // 定义JavaScriptSerializer接受字符串的最大长度 hdk 20180524 + try + { + return js.Serialize(obj); + } + catch (Exception exception) + { + + throw new Exception(exception.Message); + } + } + // 数据表转化为集合 + public static List> DataTableToList(DataTable dt) + { + List> list = new List>(); + foreach (DataRow dataRow in dt.Rows) + { + Dictionary dic = new Dictionary(); + + + foreach (DataColumn dc in dt.Columns) + { + if (dataRow[dc.ColumnName].GetType() == typeof(DateTime)) + { + string str = Convert.ToDateTime(dataRow[dc.ColumnName]).ToString("yyyy-MM-dd HH:mm:ss"); + dic.Add(dc.ColumnName, str); + } + else if + (dataRow[dc.ColumnName].GetType() == typeof(byte[])) + { + string str = Convert.ToBase64String((byte[])dataRow[dc.ColumnName]); + dic.Add(dc.ColumnName, str); + } + else + { + dic.Add(dc.ColumnName, dataRow[dc.ColumnName]); + } + + //Type type1 = dt.Rows[0]["产品图片"].GetType(); + //Type type2 = typeof(byte[]); + + } + list.Add(dic); + } + return list; + } + /// + /// 表转换为Json + /// + /// + /// + public static string DataTableToJson(DataTable dt) + { + return ObjectToJson(DataTableToList(dt)); + } + /// + /// 将DataTable中的数据转换成JSON格式 + /// + /// 数据源DataTable + /// 是否输出数据总条数 + /// JSON中显示的数据总条数 + /// + public static string CreateJsonParameters(DataTable dt, bool displayCount, int totalcount) + { + StringBuilder JsonString = new StringBuilder(); + //Exception Handling + + if (dt != null) + { + JsonString.Append("{ "); + JsonString.Append("\"rows\":[ "); + for (int i = 0; i < dt.Rows.Count; i++) + { + JsonString.Append("{ "); + for (int j = 0; j < dt.Columns.Count; j++) + { + if (j < dt.Columns.Count - 1) + { + //if (dt.Rows[i][j] == DBNull.Value) continue; + if (dt.Columns[j].DataType == typeof(bool)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + dt.Rows[i][j].ToString().ToLower() + ","); + } + else if (dt.Columns[j].DataType == typeof(string)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + ObjectToJson(dt.Rows[i][j]).ToString() + ","); + //JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + // dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\","); + } + else + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\","); + } + } + else if (j == dt.Columns.Count - 1) + { + //if (dt.Rows[i][j] == DBNull.Value) continue; + if (dt.Columns[j].DataType == typeof(bool)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + dt.Rows[i][j].ToString().ToLower()); + } + else if (dt.Columns[j].DataType == typeof(string)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + ObjectToJson(dt.Rows[i][j]).ToString()); + //JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + // dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\""); + } + else + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\""); + } + } + } + /*end Of String*/ + if (i == dt.Rows.Count - 1) + { + JsonString.Append("} "); + } + else + { + JsonString.Append("}, "); + } + } + JsonString.Append("]"); + + if (displayCount) + { + JsonString.Append(","); + + JsonString.Append("\"total\":"); + JsonString.Append(totalcount); + } + + JsonString.Append("}"); + return JsonString.ToString().Replace("\n", ""); + } + else + { + return null; + } + } + public static string CreateJsonParameters(DataTable dt) + { + StringBuilder JsonString = new StringBuilder(); + //Exception Handling + + if (dt != null) + { + JsonString.Append("{ "); + JsonString.Append("\"rows\":[ "); + for (int i = 0; i < dt.Rows.Count; i++) + { + JsonString.Append("{ "); + for (int j = 0; j < dt.Columns.Count; j++) + { + if (j < dt.Columns.Count - 1) + { + //if (dt.Rows[i][j] == DBNull.Value) continue; + if (dt.Columns[j].DataType == typeof(bool)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + dt.Rows[i][j].ToString().ToLower() + ","); + } + else if (dt.Columns[j].DataType == typeof(string)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + ObjectToJson(dt.Rows[i][j]).ToString() + ","); + //JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + // dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\","); + } + else + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\","); + } + } + else if (j == dt.Columns.Count - 1) + { + //if (dt.Rows[i][j] == DBNull.Value) continue; + if (dt.Columns[j].DataType == typeof(bool)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + dt.Rows[i][j].ToString().ToLower()); + } + else if (dt.Columns[j].DataType == typeof(string)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + ObjectToJson(dt.Rows[i][j]).ToString()); + //JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + // dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\""); + } + else + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\""); + } + } + } + /*end Of String*/ + if (i == dt.Rows.Count - 1) + { + JsonString.Append("} "); + } + else + { + JsonString.Append("}, "); + } + } + JsonString.Append("]"); + + JsonString.Append("}"); + return JsonString.ToString().Replace("\n", ""); + } + else + { + return null; + } + } + StringBuilder result = new StringBuilder(); + StringBuilder sb = new StringBuilder(); + /// + /// 根据DataTable生成EasyUI Tree Json树结构 + /// + /// 数据源 + /// ID列 + /// Text列 + /// 节点Url + /// 关系字段 + /// 父ID + public string GetTreeJsonByTable(DataTable tabel, string idCol, string txtCol, string url, string rela, object pId) + { + result.Append(sb.ToString()); + sb.Clear(); + if (tabel.Rows.Count > 0) + { + sb.Append("["); + string filer = string.Format("{0}='{1}'", rela, pId); + DataRow[] rows = tabel.Select(filer); + if (rows.Length > 0) + { + foreach (DataRow row in rows) + { + sb.Append("{\"id\":\"" + row[idCol] + "\",\"text\":\"" + row[txtCol] + "\",\"attributes\":\"" + row[url] + "\",\"state\":\"open\""); + if (tabel.Select(string.Format("{0}='{1}'", rela, row[idCol])).Length > 0) + { + sb.Append(",\"children\":"); + GetTreeJsonByTable(tabel, idCol, txtCol, url, rela, row[idCol]); + result.Append(sb.ToString()); + sb.Clear(); + } + result.Append(sb.ToString()); + sb.Clear(); + sb.Append("},"); + } + sb = sb.Remove(sb.Length - 1, 1); + } + sb.Append("]"); + result.Append(sb.ToString()); + sb.Clear(); + } + return result.ToString(); + } +} \ No newline at end of file diff --git a/Common/99DataBaseAccess2/DataBaseAccess/Properties/AssemblyInfo.cs b/Common/99DataBaseAccess2/DataBaseAccess/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..34eb61c --- /dev/null +++ b/Common/99DataBaseAccess2/DataBaseAccess/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("DataBaseAccess")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DataBaseAccess")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("f434e066-4c59-47c8-aa82-6f48cc84501a")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Common/DoWhatPlc/01_01DoWhatPlc.csproj b/Common/DoWhatPlc/01_01DoWhatPlc.csproj new file mode 100644 index 0000000..afaaaf8 --- /dev/null +++ b/Common/DoWhatPlc/01_01DoWhatPlc.csproj @@ -0,0 +1,56 @@ + + + + + Debug + AnyCPU + {0D1AF432-439A-4920-8692-43AE139F5530} + Library + Properties + DoWhatPlc + DoWhatPlc + v4.5.1 + 512 + true + + + + true + full + false + ..\WebApiDll\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\MisData_3.0_2022.08.23.1622.LLX\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Common/DoWhatPlc/DoWhat.cs b/Common/DoWhatPlc/DoWhat.cs new file mode 100644 index 0000000..56a40a0 --- /dev/null +++ b/Common/DoWhatPlc/DoWhat.cs @@ -0,0 +1,1299 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + + +namespace DoWhatPlc +{ + public class EngineValue + { + public string OpName { set; get; } + public string EngineID { set; get; } + public string EngineType { set; get; } + public int EngineTypeID { set; get; } + public int PalletCode { set; get; } + public int ProcessCode { set; get; } + public int PartPalletCode { set; get; } + public string PalletInfo { set; get; } + /// + /// 显示返修标志 + /// + public int RepairPartStatusPLC { set; get; } + /// + /// 1 合格;2 不合格 + /// + public int QualityMask { set; get; } + + public string OrderForm { set; get; } + } + public class DoWhat + { + public const string ReadPLC_TagID = "ReadPLC_TagID"; + public const string WritePLC_TagID = "WritePLC_TagID"; + public const string ReadPLC_TagTypeCodeID = "ReadPLC_TagTypeCodeID"; + public const string WritePLC_TagTypeCodeID = "WritePLC_TagTypeCodeID"; + public const string ReadPLC_Cmd = "ReadPLC_Cmd"; + public const string WritePLC_Cmd = "WritePLC_Cmd"; + public const string ReadPLC_GroupData = "ReadPLC_GroupData"; + public const string ReadPLC_GroupMonitor = "ReadPLC_GroupMonitor"; + public const string ReadPLC_IpTag = "ReadPLC_IpTag"; + public const string ReadPLC_IpMonitorTag = "ReadPLC_IpMonitorTag"; + public const string ReadQualityDataList = "ReadQualityDataList"; + public const string ReadByteData_Op = "ReadByteData_Op"; + public const string ReadByteData_Ip = "ReadByteData_Ip"; + public const string WritePLC_Bytes_Op = "WritePLC_Bytes_Op"; + public const string WritePLC_Bytes_Ip = "WritePLC_Bytes_Ip"; + public const string IpAllTag = "IpAllTag"; + public const string IpMonitorTag = "IpMonitorTag"; + public const string RegionRead = "RegionRead"; + public const string ReadBytes = "ReadBytes"; + public const string WriteBytes = "WriteBytes"; + } + /// + /// object 类型数据转换成字符串变量表达 + /// + public class ReturnValueString + { + public string TagID { set; get; } + public string TagValue { set; get; } + public string ValueType { set; get; } + public string OpName { set; get; } + public string TimeStamp { set; get; } + public string TagTypeCodeID { set; get; } + public string TagTypeID { set; get; } + /// + /// 测量项目 TEXT2 报警的 工步内容 + /// + public string ItemName { set; get; } + /// + /// 测量位置 TEXT1 报警的 工步号 + /// + public string ShaftID { set; get; } + /// + /// 列位置 工步 工位工步分类 + /// + public string TagOrderBy { set; get; } + + + public string TagValueBefore { get; set; } + public string TimeStampBefore { get; set; } + public string TagName { get; set; } + + + /// + /// 变量变化的持续时间,单位 毫秒 + /// + public string TagKeepTime; + public string FunName; + public string FunCmd; + public string MesServerCode; + public string CmdPlcReadWrite; + public ReturnValueString() + { + + } + public ReturnValueString(string tagID, object tagValue, string opName = "", string tagTypeCodeID = "", string tagTypeID = "", string tagKeepTime = "", + string funName = "", string funCmd = "", string mesServerCode = "", string timeStamp = "", + string timeStampBefore = "", string tagValueBefore = "", string tagName = "",string itemName="", + string shaftID = "", string tagOrderBy = "") + { + TagTypeCodeID = tagTypeCodeID; + TagTypeID = tagTypeID; + TagValue = tagValue.ToString(); + ValueType = tagValue.GetType().Name; + TagID = tagID; + OpName = opName; + TagKeepTime = tagKeepTime; + FunName = funName; + FunCmd = funCmd; + MesServerCode = mesServerCode; + TimeStamp = timeStamp; + TimeStampBefore = timeStampBefore; + TagName = tagName; + TagValueBefore = tagValueBefore; + ItemName = itemName; + ShaftID = shaftID; + TagOrderBy = tagOrderBy; + } + + public ReturnValueObject ReturnValueToObject() + { + ReturnValueObject ro = new ReturnValueObject(TagID, TagValue, OpName, TagTypeCodeID, ValueType, TimeStamp, TimeStampBefore, TagValueBefore, TagName, ItemName, ShaftID); + + return ro; + } + + } + /// + /// 字符串变量转变成object类型变量 + /// + public class ReturnValueObject + { + public string TagID { set; get; } + public object TagValue { set; get; } + public string ValueType { set; get; } + public string OpName { set; get; } + public DateTime TimeStamp { set; get; } + public string TagTypeCodeID { set; get; } + /// + /// 变量变化的持续时间,单位 毫秒 + /// + public int TagKeepTime; + + public object TagValueBefore { get; set; } + public DateTime TimeStampBefore { get; set; } + public string TagName { get; set; } + public string ItemName { set; get; } + public string ShaftID { set; get; } + public string TagOrderBy { set; get; } + public ReturnValueObject(string tagID, string tagValue, string opName = "", string tagTypeCodeID = "", string valueType = "", + string timeStamp = "", string timeStampBefore = "", string tagValueBefore = "", + string tagName = "", string itemName = "", string shaftID = "", string tagOrderBy = "") + { + TagValue = GetTypeValue(valueType, tagValue); + if (tagValueBefore != null) + { + TagValueBefore = GetTypeValue(valueType, tagValueBefore); + } + ValueType = valueType; + TagID = tagID; + OpName = opName; + try + { + TimeStamp = Convert.ToDateTime(timeStamp); + } + catch + { + TimeStamp = DateTime.Now; + + } + try + { + TimeStampBefore = Convert.ToDateTime(timeStampBefore); + } + catch + { + TimeStampBefore = DateTime.Now; + + } + TagTypeCodeID = tagTypeCodeID; + TagName = tagName; + ItemName = itemName; + ShaftID = shaftID; + TagOrderBy = tagOrderBy; + + } + + + public ReturnValueString ReturnValueToString() + { + ReturnValueString rs = new ReturnValueString(TagID, TagValue, OpName, TagTypeCodeID); + return rs; + } + public static object GetTypeValue(string type, string tagValue) + { + object tagV = "-1"; + if (type == null) + { + tagV = tagValue; + } + switch (type.ToLower()) + { + case "bool": + case "boolean": + tagV = false; + switch (tagValue.ToLower()) + { + case "1": + case "true": + tagV = true; + break; + case "0": + case "false": + tagV = false; + break; + } + return tagV; + //return Type.GetType(" System.Boolean ", true, true); + case "byte ": + return Convert.ToByte(tagValue); + case "sbyte": + return Convert.ToSByte(tagValue); + case "char": + return Convert.ToChar(tagValue); + case "decimal": + return Convert.ToDecimal(tagValue); + case "double": + return Convert.ToDouble(tagValue); + case "float": + return Convert.ToSingle(tagValue); + case "int": + return Convert.ToInt32(tagValue); + case "int16": + return Convert.ToInt32(tagValue); + case "uint": + return Convert.ToUInt32(tagValue); + case "long": + return Convert.ToInt64(tagValue); + case "ulong": + return Convert.ToUInt64(tagValue); + case "object": + return tagValue; + case "short": + return Convert.ToInt16(tagValue); + case "ushort": + return Convert.ToUInt16(tagValue); + case "string": + return tagValue; + case "date": + case "datetime": + return Convert.ToDateTime(tagValue); + case "guid": + return tagValue; + default: + return tagValue; + } + } + + + } + + public class TagIDTagFormat + { + public string TagID; + public TagFormat TF; + + public TagIDTagFormat(string tagID, TagFormat tF) + { + TagID = tagID; + TF = tF; + } + } + + + public class QualityDataSaveList + { + public Hashtable valuList; + public DataTable BasicDataTagValue; + public DataTable BasicDataTagValueUpDown; + public Hashtable hashtable_EngineTypeID; + public Hashtable hashtable_tagTable_OpName_SaveData; + } + + + + public struct ControlData + { + public int TagType; + public string opName; + public Control btn; public ControlData(Control Ctrl, string OpName) + { + string[] Array_NameSplit; + Array_NameSplit = Ctrl.Name.Split('_'); + TagType = Convert.ToInt32(Array_NameSplit[2]); + opName = OpName; + btn = Ctrl; + + } + } + public struct ControlChangeByTagType + { + public ControlChangeByTagType(int tagType, string value) + { + TagType = tagType; + Value = value; + } + + public int TagType; + public string Value; + } + /// + /// tag格式化结构 + /// + public struct TagFormat + { + /// + /// TagID + /// + public string TagID; + /// + /// TagID + /// + public string TagName; + /// + /// 工位号 + /// + public string OpName; + /// + /// 数据来源 + /// + public string DataSources; + /// + /// IP + /// + public string IP; + /// + /// OPC的URL + /// + public string OpcIpPort; + /// + /// 组 + /// + public string Group; + /// + /// 监控时间间隔 + /// + public string MonitorInterval; + /// + /// DB号加起始地址,DB1001.30 + /// + public string TagDbAndStartAdr; + /// + /// DB号加起始地址,DB1001.30.1,为了bool写入专用 + /// + public string TagDbAndStartAdrWrite; + /// + /// OPC协议地址 + /// 例如:S7:[192.168.1.211|VFD1|S7ONLINE|01.00,192.168.1.211,02.02,1]DB1001,DINT154 + /// + public string TagOPCAdrStr; + /// + /// DB地址位置 + /// 变量起始地址,例如 0,1,2,56,80... + /// + public int Index; + /// + /// 变量字节长度 + /// 变量字节长度,l例如 1,2,4... + /// + public int Length; + /// + /// X 0,1,2,3,4,5,6,7 + /// 例如 X 0,1,2,3,4,5,6,7 + /// + public int BitIndex; + /// + /// 以连续Byte数组方式读取的DB地址实际位置 + /// 变量起始地址,例如 0,1,2,56,80... + /// + public int IndexBytes; + /// + /// 绝对地址差分,应用区域读取的拆分20200101_LLX + /// + public int AbsAddrDiff; + + + + /// + /// 点类型代码 + /// 比如bool是11,String是8 + /// + public int TagTypeID; + /// + /// 点类型 + /// 比如Bool,INT,STRING等 + /// + public string TagType; + /// + /// 变量类型代码 + /// 比如:允许保存是19 + /// + public int TagTypeCodeID; + /// + /// Value + /// + public object TagValue; + /// + /// 是否监控 + /// + public int IsMonitor; + + + + + + /// + /// 时间戳 + /// + public DateTime TimeStamp; + /// + /// 标签质量 192 , -1 + /// + public string TagQuality; + /// + /// 测量位置 + /// + public string ShaftID; + /// + /// 测量项目 + /// + public string ItemName; + /// + /// 测量单位 + /// + public string Unit; + /// + /// 上限值 + /// + public string TagValueUp; + /// + /// 下限值 + /// + public string TagValueDown; + /// + /// 理论值 + /// + public string TagValeNormal; + /// + /// 合格标志 + /// + public string IsGoodBad; + /// + /// 列位置 + /// + public string TagOrderBy; + /// + /// 变量排序 + /// + public string TagItemOrderBy; + /// + /// 是保存到数据库 + /// + public int IsSaveToSql; + /// + /// 是发送到WebSocket + /// + public int IsWebSocket; + /// + /// 是程序启动时候的值 + /// + public int IsFirstValue; + /// + /// 变量特点 + /// + public int TagProperty; + /// + /// 变量变化的持续时间,单位 毫秒 + /// + public int TagKeepTime; + /// + /// 变量变化前的值 + /// + public object TagValueBefore; + + } + + public class CustomeEvetnArgs : EventArgs + { + public int TagKeepTime { get; set; } + public object TagProperty { get; set; } + public object TagItemOrderBy { get; set; } + public object TagOrderBy { get; set; } + public object IsGoodBad { get; set; } + public object TagValeNormal { get; set; } + public object TagValueDown { get; set; } + public object TagValueUp { get; set; } + public object Unit { get; set; } + public object ItemName { get; set; } + public object ShaftID { get; set; } + public object IsMonitor { get; set; } + public object TagTypeActual { get; set; } + public object TagValueBefore { get; set; } + public object IsFirstValue { get; set; } + public object IsSaveToSql { get; set; } + public object DataDources { get; set; } + public object TagTypeID { get; set; } + public object TagTypeCodeID { get; set; } + public object TagID { get; set; } + public string TimeStamp { get; set; } + public object TagQuality { get; set; } + public object OpName { get; set; } + public object TagValue { get; set; } + public object TagValueType { get; set; } + public object TagType { get; set; } + public object TagName { get; set; } + public object TagKey { get; set; } + public object IsWebSocket { get; set; } + public string TimeStampBefore { get; set; } + } + + public class QualityDataType + { + public int tagValueType; + public int tagTypeID; + public string opName; + public string tagID; + public object tagValue; + public int tagQuality; + public int tagOrderBy; + public int tagItemOrderBy; + public int tagProperty; + public int isGoodBad; + } + + public class HashtableList + { + /// + /// MesServerCode + /// + static public Hashtable hashtable_MesServerCode_Temp; + /// + /// MesDll + /// + static public Hashtable hashtable_MesDll_Temp; + static public Hashtable hashtable_TagTypeDataType_Temp; + static public Hashtable hashtable_TagType_Temp; + + static public Hashtable hashtable_EngineGetOver_EngineTypeID_Temp; + static public Hashtable hashtable_EngineGetOver_EngineType_Temp; + static public Hashtable hashtable_EngineGetOver_EngineID_Temp; + static public Hashtable hashtable_EngineGetOver_OrderForm_Temp; + + static public Hashtable hashtable_OpNameRepair_Temp; + + static public Hashtable hashtable_WorkGroupIndex_Temp; + static public Hashtable hashtable_workStepProperty_Temp; + static public Hashtable hashtable_QualityMesRead_Temp; + static public Hashtable hashtable_IsAllowWork_Temp; + /// + /// 工位号与工位上下线类型 + /// (0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + /// 5 分线上线(总线) 6 分线上线(分线) + /// + static public Hashtable hashtableOpName_OpType_Temp; + + /// + /// + /// 工位号与工位上下线类型 + /// (0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + /// 5 分线上线(总线) 6 分线上线(分线) + /// + public Hashtable hashtableOpName_OpType; + public Hashtable hashtable_IsAllowWork; + public Hashtable hashtable_QualityMesRead; + public Hashtable hashtable_workStepProperty; + public Hashtable hashtable_OpNameRepair; + /// + /// MesServerCode + /// + public Hashtable hashtable_MesServerCode; + /// + /// MesDll + /// + public Hashtable hashtable_MesDll; + public Hashtable hashtable_TagTypeDataType; + public Hashtable hashtable_TagType; + + + public Hashtable hashtable_EngineGetOver_EngineTypeID; + public Hashtable hashtable_EngineGetOver_EngineType; + public Hashtable hashtable_EngineGetOver_EngineID; + public Hashtable hashtable_EngineGetOver_OrderForm; + + public Hashtable hashtable_WorkGroupIndex; + } + + public struct QualityDataQueryStruct + { + + public QualityDataQueryStruct(string opName, Control ctrl) + { + OpName = opName; + Ctrl = ctrl; + tagType = 0; + tagValue = ""; + tagID = ""; + tagTypeID = 0; + tempForm = null; + tagValue2 = null; + + } + + public QualityDataQueryStruct(string opName, int TagType) + { + + OpName = opName; + Ctrl = null; + tagType = TagType; + tagValue = ""; + tagID = ""; + tagTypeID = 0; + tempForm = null; + tagValue2 = null; + } + + public QualityDataQueryStruct(string opName, int TagType, Control ctrl) + { + + OpName = opName; + Ctrl = ctrl; + tagType = TagType; + tagValue = ""; + tagID = ""; + tagTypeID = 0; + tempForm = null; + tagValue2 = null; + } + public QualityDataQueryStruct(string opName, int TagType, object TagValue) + { + + OpName = opName; + Ctrl = null; + tagType = TagType; + tagValue = TagValue; + tagID = ""; + tagTypeID = 0; + tempForm = null; + tagValue2 = null; + } + public QualityDataQueryStruct(string TagID, int TagTypeID, object TagValue, object TagValue2, Form TempForm) + { + + OpName = ""; + Ctrl = null; + tagType = 0; + tagValue = TagValue; + tagID = TagID; + tagTypeID = TagTypeID; + tempForm = TempForm; + tagValue2 = TagValue2; + } + + + public string OpName; + public Control Ctrl; + public int tagType; + public object tagValue; + public object tagValue2; + public string tagID; + public int tagTypeID; + public Form tempForm; + + + } +} + + + +namespace DoWhatPlc1 +{ + public class EngineValue + { + public string OpName { set; get; } + public string EngineID { set; get; } + public string EngineType { set; get; } + public int EngineTypeID { set; get; } + public int PalletCode { set; get; } + public int ProcessCode { set; get; } + public int PartPalletCode { set; get; } + public string PalletInfo { set; get; } + /// + /// 显示返修标志 + /// + public int RepairPartStatusPLC { set; get; } + /// + /// 1 合格;2 不合格 + /// + public int QualityMask { set; get; } + + public string OrderForm { set; get; } + } + public class DoWhat + { + public const string ReadPLC_TagID = "ReadPLC_TagID"; + public const string WritePLC_TagID = "WritePLC_TagID"; + public const string ReadPLC_TagTypeCodeID = "ReadPLC_TagTypeCodeID"; + public const string WritePLC_TagTypeCodeID = "WritePLC_TagTypeCodeID"; + public const string ReadPLC_Cmd = "ReadPLC_Cmd"; + public const string WritePLC_Cmd = "WritePLC_Cmd"; + public const string ReadPLC_GroupData = "ReadPLC_GroupData"; + public const string ReadPLC_GroupMonitor = "ReadPLC_GroupMonitor"; + public const string ReadPLC_IpTag = "ReadPLC_IpTag"; + public const string ReadPLC_IpMonitorTag = "ReadPLC_IpMonitorTag"; + public const string ReadQualityDataList = "ReadQualityDataList"; + public const string ReadByteData_Op = "ReadByteData_Op"; + public const string ReadByteData_Ip = "ReadByteData_Ip"; + public const string WritePLC_Bytes_Op = "WritePLC_Bytes_Op"; + public const string WritePLC_Bytes_Ip = "WritePLC_Bytes_Ip"; + public const string IpAllTag = "IpAllTag"; + public const string IpMonitorTag = "IpMonitorTag"; + public const string RegionRead = "RegionRead"; + public const string ReadBytes = "ReadBytes"; + public const string WriteBytes = "WriteBytes"; + } + /// + /// object 类型数据转换成字符串变量表达 + /// + public class ReturnValueString + { + public string TagID { set; get; } + public string TagValue { set; get; } + public string ValueType { set; get; } + public string OpName { set; get; } + public string TimeStamp { set; get; } + public string TagTypeCodeID { set; get; } + public string TagTypeID { set; get; } + /// + /// 变量变化的持续时间,单位 毫秒 + /// + public string TagKeepTime; + public string FunName; + public string FunCmd; + public string MesServerCode; + public string CmdPlcReadWrite; + public ReturnValueString() + { + + } + public ReturnValueString(string tagID, object tagValue, string opName = "", string tagTypeCodeID = "", string tagTypeID = "", string tagKeepTime = "", string funName = "", string funCmd = "", string mesServerCode = "") + { + TagTypeCodeID = tagTypeCodeID; + TagTypeID = tagTypeID; + TagValue = tagValue.ToString(); + ValueType = tagValue.GetType().Name; + TagID = tagID; + OpName = opName; + TagKeepTime = tagKeepTime; + FunName = funName; + FunCmd = funCmd; + MesServerCode = mesServerCode; + TimeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"); + } + + public ReturnValueObject ReturnValueToObject() + { + ReturnValueObject ro = new ReturnValueObject(TagID, TagValue, OpName, TagTypeCodeID, ValueType, TimeStamp); + + return ro; + } + + } + /// + /// 字符串变量转变成object类型变量 + /// + public class ReturnValueObject + { + public string TagID { set; get; } + public object TagValue { set; get; } + public string ValueType { set; get; } + public string OpName { set; get; } + public DateTime TimeStamp { set; get; } + public string TagTypeCodeID { set; get; } + /// + /// 变量变化的持续时间,单位 毫秒 + /// + public int TagKeepTime; + + public ReturnValueObject(string tagID, string tagValue, string opName = "", string tagTypeCodeID = "", string valueType = "", string timeStamp = "") + { + TagValue = GetTypeValue(valueType, tagValue); + ValueType = valueType; + TagID = tagID; + OpName = opName; + try + { + TimeStamp = Convert.ToDateTime(timeStamp); + } + catch + { + TimeStamp = DateTime.Now; + + } + TagTypeCodeID = tagTypeCodeID; + + } + + public ReturnValueString ReturnValueToString() + { + ReturnValueString rs = new ReturnValueString(TagID, TagValue, OpName, TagTypeCodeID); + return rs; + } + public static object GetTypeValue(string type, string tagValue) + { + object tagV = "-1"; + if (type == null) + { + tagV = tagValue; + } + switch (type.ToLower()) + { + case "bool": + case "boolean": + tagV = false; + switch (tagValue.ToLower()) + { + case "1": + case "true": + tagV = true; + break; + case "0": + case "false": + tagV = false; + break; + } + return tagV; + //return Type.GetType(" System.Boolean ", true, true); + case "byte ": + return Convert.ToByte(tagValue); + case "sbyte": + return Convert.ToSByte(tagValue); + case "char": + return Convert.ToChar(tagValue); + case "decimal": + return Convert.ToDecimal(tagValue); + case "double": + return Convert.ToDouble(tagValue); + case "float": + return Convert.ToSingle(tagValue); + case "int": + return Convert.ToInt32(tagValue); + case "int16": + return Convert.ToInt32(tagValue); + case "uint": + return Convert.ToUInt32(tagValue); + case "long": + return Convert.ToInt64(tagValue); + case "ulong": + return Convert.ToUInt64(tagValue); + case "object": + return tagValue; + case "short": + return Convert.ToInt16(tagValue); + case "ushort": + return Convert.ToUInt16(tagValue); + case "string": + return tagValue; + case "date": + case "datetime": + return Convert.ToDateTime(tagValue); + case "guid": + return tagValue; + default: + return tagValue; + } + } + + + } + + public class TagIDTagFormat + { + public string TagID; + public TagFormat TF; + + public TagIDTagFormat(string tagID, TagFormat tF) + { + TagID = tagID; + TF = tF; + } + } + + + public class QualityDataSaveList + { + public Hashtable valuList; + public DataTable BasicDataTagValue; + public DataTable BasicDataTagValueUpDown; + public Hashtable hashtable_EngineTypeID; + public Hashtable hashtable_tagTable_OpName_SaveData; + } + + + + public struct ControlData + { + public int TagType; + public string opName; + public Control btn; public ControlData(Control Ctrl, string OpName) + { + string[] Array_NameSplit; + Array_NameSplit = Ctrl.Name.Split('_'); + TagType = Convert.ToInt32(Array_NameSplit[2]); + opName = OpName; + btn = Ctrl; + + } + } + public struct ControlChangeByTagType + { + public ControlChangeByTagType(int tagType, string value) + { + TagType = tagType; + Value = value; + } + + public int TagType; + public string Value; + } + /// + /// tag格式化结构 + /// + public struct TagFormat + { + /// + /// TagID + /// + public string TagID; + /// + /// TagID + /// + public string TagName; + /// + /// 工位号 + /// + public string OpName; + /// + /// 数据来源 + /// + public string DataSources; + /// + /// IP + /// + public string IP; + /// + /// OPC的URL + /// + public string OpcIpPort; + /// + /// 组 + /// + public string Group; + /// + /// 监控时间间隔 + /// + public string MonitorInterval; + /// + /// DB号加起始地址,DB1001.30 + /// + public string TagDbAndStartAdr; + /// + /// DB号加起始地址,DB1001.30.1,为了bool写入专用 + /// + public string TagDbAndStartAdrWrite; + /// + /// OPC协议地址 + /// 例如:S7:[192.168.1.211|VFD1|S7ONLINE|01.00,192.168.1.211,02.02,1]DB1001,DINT154 + /// + public string TagOPCAdrStr; + /// + /// DB地址位置 + /// 变量起始地址,例如 0,1,2,56,80... + /// + public int Index; + /// + /// 变量字节长度 + /// 变量字节长度,l例如 1,2,4... + /// + public int Length; + /// + /// X 0,1,2,3,4,5,6,7 + /// 例如 X 0,1,2,3,4,5,6,7 + /// + public int BitIndex; + /// + /// 以连续Byte数组方式读取的DB地址实际位置 + /// 变量起始地址,例如 0,1,2,56,80... + /// + public int IndexBytes; + /// + /// 绝对地址差分,应用区域读取的拆分20200101_LLX + /// + public int AbsAddrDiff; + + + + /// + /// 点类型代码 + /// 比如bool是11,String是8 + /// + public int TagTypeID; + /// + /// 点类型 + /// 比如Bool,INT,STRING等 + /// + public string TagType; + /// + /// 变量类型代码 + /// 比如:允许保存是19 + /// + public int TagTypeCodeID; + /// + /// Value + /// + public object TagValue; + /// + /// 是否监控 + /// + public int IsMonitor; + + + + + + /// + /// 时间戳 + /// + public DateTime TimeStamp; + /// + /// 标签质量 192 , -1 + /// + public string TagQuality; + /// + /// 测量位置 + /// + public string ShaftID; + /// + /// 测量项目 + /// + public string ItemName; + /// + /// 测量单位 + /// + public string Unit; + /// + /// 上限值 + /// + public string TagValueUp; + /// + /// 下限值 + /// + public string TagValueDown; + /// + /// 理论值 + /// + public string TagValeNormal; + /// + /// 合格标志 + /// + public string IsGoodBad; + /// + /// 列位置 + /// + public string TagOrderBy; + /// + /// 变量排序 + /// + public string TagItemOrderBy; + /// + /// 是保存到数据库 + /// + public int IsSaveToSql; + /// + /// 是发送到WebSocket + /// + public int IsWebSocket; + /// + /// 是程序启动时候的值 + /// + public int IsFirstValue; + /// + /// 变量特点 + /// + public int TagProperty; + /// + /// 变量变化的持续时间,单位 毫秒 + /// + public int TagKeepTime; + /// + /// 变量变化前的值 + /// + public object TagValueBefore; + + } + + public class CustomeEvetnArgs : EventArgs + { + public int TagKeepTime { get; set; } + public object TagProperty { get; set; } + public object TagItemOrderBy { get; set; } + public object TagOrderBy { get; set; } + public object IsGoodBad { get; set; } + public object TagValeNormal { get; set; } + public object TagValueDown { get; set; } + public object TagValueUp { get; set; } + public object Unit { get; set; } + public object ItemName { get; set; } + public object ShaftID { get; set; } + public object IsMonitor { get; set; } + public object TagTypeActual { get; set; } + public object TagValueBefore { get; set; } + public object IsFirstValue { get; set; } + public object IsSaveToSql { get; set; } + public object DataDources { get; set; } + public object TagTypeID { get; set; } + public object TagTypeCodeID { get; set; } + public object TagID { get; set; } + public string TimeStamp { get; set; } + public object TagQuality { get; set; } + public object OpName { get; set; } + public object TagValue { get; set; } + public object TagValueType { get; set; } + public object TagType { get; set; } + public object TagName { get; set; } + public object TagKey { get; set; } + public object IsWebSocket { get; set; } + public string TimeStampBefore { get; set; } + } + + public class QualityDataType + { + public int tagValueType; + public int tagTypeID; + public string opName; + public string tagID; + public object tagValue; + public int tagQuality; + public int tagOrderBy; + public int tagItemOrderBy; + public int tagProperty; + public int isGoodBad; + } + + public class HashtableList + { + /// + /// MesServerCode + /// + static public Hashtable hashtable_MesServerCode_Temp; + /// + /// MesDll + /// + static public Hashtable hashtable_MesDll_Temp; + static public Hashtable hashtable_TagTypeDataType_Temp; + static public Hashtable hashtable_TagType_Temp; + + static public Hashtable hashtable_EngineGetOver_EngineTypeID_Temp; + static public Hashtable hashtable_EngineGetOver_EngineType_Temp; + static public Hashtable hashtable_EngineGetOver_EngineID_Temp; + static public Hashtable hashtable_EngineGetOver_OrderForm_Temp; + + static public Hashtable hashtable_OpNameRepair_Temp; + + static public Hashtable hashtable_WorkGroupIndex_Temp; + static public Hashtable hashtable_workStepProperty_Temp; + static public Hashtable hashtable_QualityMesRead_Temp; + static public Hashtable hashtable_IsAllowWork_Temp; + /// + /// 工位号与工位上下线类型 + /// (0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + /// 5 分线上线(总线) 6 分线上线(分线) + /// + static public Hashtable hashtableOpName_OpType_Temp; + + /// + /// + /// 工位号与工位上下线类型 + /// (0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + /// 5 分线上线(总线) 6 分线上线(分线) + /// + public Hashtable hashtableOpName_OpType; + public Hashtable hashtable_IsAllowWork; + public Hashtable hashtable_QualityMesRead; + public Hashtable hashtable_workStepProperty; + public Hashtable hashtable_OpNameRepair; + /// + /// MesServerCode + /// + public Hashtable hashtable_MesServerCode; + /// + /// MesDll + /// + public Hashtable hashtable_MesDll; + public Hashtable hashtable_TagTypeDataType; + public Hashtable hashtable_TagType; + + + public Hashtable hashtable_EngineGetOver_EngineTypeID; + public Hashtable hashtable_EngineGetOver_EngineType; + public Hashtable hashtable_EngineGetOver_EngineID; + public Hashtable hashtable_EngineGetOver_OrderForm; + + public Hashtable hashtable_WorkGroupIndex; + } + + public struct QualityDataQueryStruct + { + + public QualityDataQueryStruct(string opName, Control ctrl) + { + OpName = opName; + Ctrl = ctrl; + tagType = 0; + tagValue = ""; + tagID = ""; + tagTypeID = 0; + tempForm = null; + tagValue2 = null; + + } + + public QualityDataQueryStruct(string opName, int TagType) + { + + OpName = opName; + Ctrl = null; + tagType = TagType; + tagValue = ""; + tagID = ""; + tagTypeID = 0; + tempForm = null; + tagValue2 = null; + } + + public QualityDataQueryStruct(string opName, int TagType, Control ctrl) + { + + OpName = opName; + Ctrl = ctrl; + tagType = TagType; + tagValue = ""; + tagID = ""; + tagTypeID = 0; + tempForm = null; + tagValue2 = null; + } + public QualityDataQueryStruct(string opName, int TagType, object TagValue) + { + + OpName = opName; + Ctrl = null; + tagType = TagType; + tagValue = TagValue; + tagID = ""; + tagTypeID = 0; + tempForm = null; + tagValue2 = null; + } + public QualityDataQueryStruct(string TagID, int TagTypeID, object TagValue, object TagValue2, Form TempForm) + { + + OpName = ""; + Ctrl = null; + tagType = 0; + tagValue = TagValue; + tagID = TagID; + tagTypeID = TagTypeID; + tempForm = TempForm; + tagValue2 = TagValue2; + } + + + public string OpName; + public Control Ctrl; + public int tagType; + public object tagValue; + public object tagValue2; + public string tagID; + public int tagTypeID; + public Form tempForm; + + + } +} + + diff --git a/Common/DoWhatPlc/Properties/AssemblyInfo.cs b/Common/DoWhatPlc/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d89ceef --- /dev/null +++ b/Common/DoWhatPlc/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("DoWhatPlc")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DoWhatPlc")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("0d1af432-439a-4920-8692-43ae139f5530")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Common/DoWhatPlc/TagTypeCodeID.cs b/Common/DoWhatPlc/TagTypeCodeID.cs new file mode 100644 index 0000000..292e5c4 --- /dev/null +++ b/Common/DoWhatPlc/TagTypeCodeID.cs @@ -0,0 +1,463 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +///1 X WorkStart 2 工件到位(PLC) 工件到位。托盘到达工位,并且托盘上有工件。 +///2 X RepairPartStatusPLC 3 RepairPartStatusPLC 备用 +///3 STRING RepairPathString 4 RepairPathString "工位返修字符串(121211112222111),前2位是西门子字符串格式,第一位是总长度,第二位是实际长度" +///4 X EngineTypeGetOverMES 5 传递机型(MES) MES传递总成信息给PLC(上线工位) +///5 X PartPalletGoOver 6 PartPalletGoOver 上线工位。0:正常工作;1:空托盘放行,PLC读取到此标志不走申请上线逻辑。 +///6 X MaterialVerifyOver 7 MaterialVerifyOver MES保存完质量数据,物料数据等与PLC信号交互完成后通知PLC,所以工步都完成,才可以放行工件,正常工作时工件放行的必要条件。 +///7 X FalseGo 8 FalseGo 按MES界面[不合格放行]按钮,MES发送此信号。操作者判断工件不合格,通知设备,按不合格方式放行工件,工件流转到返修下线工位后,返修下线。MES工作完成MES0.3=1,MES合格放行MES0.5=0,MES0.4=1 +///8 INT EngineTypeID 9 EngineTypeID MES发动机机型标志(必须PLC) +///9 STRING EngineID 10 EngineID MES发动机编号(必须PLC) +///10 STRING EngineType 11 机型(MES) MES发动机机型(必须PLC) +///11 X PartPalletStatus 13 PartPalletStatus MES激发变量托盘到位离开(必须PLC) +///12 X HeartBeatPLC 14 HeartBeatPLC 心跳处理:PLC收到MES心跳信号后,PLC延时5秒后,数值取反再写回PLC,写回PLC开始计时,如果5秒钟MES无反馈报通讯故障。 +///13 X HeartBeatMIS 15 HeartBeatMIS 间隔时间5S,心跳处理。收到PLC心跳信号后,MES按原值回写。PLC收到MES信号后延时5秒,取反写入,以此循环。 +///14 X TargetTimeRead 16 TargetTimeRead MES允许可读工位运行时间 +///15 Int MachineTargetTime 17 MachineTargetTime 目标运行时间 +///16 Int MachineActualTime 18 MachineActualTime 实际运行时间 +///17 X MesRead 19 允许保存(PLC) 质量数据可以读数据 +///18 X MesReadOver 20 保存完成(MES) MES保存完数据(必须MIS) +///19 INT QualityMask 21 合格标志(PLC) 质量数据工位合格标志0:没有工作;1:合格 ;2 :不合格(必须PLC) +///20 B PalletInfo 22 PalletInfo 0空托盘,1合格件,2不合格件 +///21 INT RepairStatusPLC 23 RepairStatusPLC 0正常件,1返修件 +///22 INT OrderNo 24 订单号(MES) 订单号(MES) +///23 X StorageNo 25 库位号(MES) 库位号(MES) +///24 X AllowPass 26 允许放行(MES) 允许放行 +///25 X PartLoadFinish 27 PartLoadFinish PartLoadFinish +///26 X Reserved_7 28 Reserved_7 备用 +///27 X Reserved_8 29 Reserved_8 备用 +///28 X Reserved_9 30 Reserved_9 备用 +///29 X Reserved_10 31 Reserved_10 备用 +///30 X Reserved_11 32 Reserved_11 备用 +///31 X Reserved_12 33 Reserved_12 备用 +///32 X Reserved_13 34 Reserved_13 备用 +///33 X Reserved_14 35 Reserved_14 备用 +///34 Int PLCSPareint1 36 PLCSPareint1 备用 +///35 Int PLCSPareint2 37 PLCSPareint2 备用 +///36 Int PLCSPareint3 38 PLCSPareint3 备用 +///37 STRING PLCSarestring1 39 PLCSarestring1 备用 +///38 STRING PLCSarestring2 40 PLCSarestring2 备用 +///39 STRING MarkID 42 MarkID 机体打标号(MES)前2位是西门子字符串格式,第一位是总长度,第二位是实际长度 +///40 X PartLoad 43 PartLoad 上线工位,PLC向MES申请总成编号。收到该信号后,MES将机型标志(DBB22 ~23)、总成号(DBB24 ~63)、总成机型DBB64 ~103写入PLC。之后MES通过信号“传递机型(DBX0.1)”通知PLC。 +///41 X EngineTypeGetOverPLC 44 传递机型(PLC) PLC将机型标志(DBB50…51)、工件编号(DBB52…101)、产品型号(DBB102…187)、托盘编号(DBB188…189)准备完毕后,通知MES。 +///42 X PartLoadOK 48 PartLoadOK 备用 +///43 X Reserved_18 49 Reserved_18 备用 +///44 X PalletDown 50 PalletDown 暂时保留,项目未使用 +///45 X ConfirmOkGo 51 ConfirmOkGo 按MES界面[合格放行]按钮,MES发送此信号。操作者判断工件合格,通知设备,工件按合格方式放行工件。MES工作完成MES0.3=1,MES合格放行MES0.5=1,MES0.4=0 +///46 X ResetDevice 52 ResetDevice 针对手动工位,无HMI,需要复位设备在MES页面操作。 +///47 X UnloadCompleted 53 UnloadCompleted 暂时保留,项目未使用 +///48 X MachineTime_ReadOver 54 MachineTime_ReadOver 备用 +///49 X Reserved_19 58 Reserved_19 备用 +///50 X FixOK 59 FixOK 手动拧紧工位,单工步螺栓拧紧完成,通知PC读取数据。 +///51 X Reserved_21 61 Reserved_21 备用 +///52 X Reserved_22 62 Reserved_22 备用 +///53 X Reserved_23 63 Reserved_23 备用 +///54 X Reserved_24 64 Reserved_24 备用 +///55 X Reserved_25 65 Reserved_25 备用 +///56 X FixAllow 66 FixAllow "设备工作的必须信号,对于有物料验证的工位,MES验证完成给出此信号,对于无物料验证工位,MES直接给出此信号。" +///57 X FixOver 67 FixOver 用于手动拧紧且有质量数据工位。通知设备当前工步拧紧螺钉工作结束。 +///58 X MatchingCompleted 68 MatchingCompleted 分线上总线,匹配成功是1;不成功是0。 +///59 X Match 69 Match 分线上总线,匹配成功是1;不成功是0。 +///60 X Reserved_2 70 Reserved_2 备用 +///61 X IsAutoGetEngineID 71 IsAutoGetEngineID 自动手动申请工件编号。0是自动方式;1:手动方式。暂时保留,生成流水号方式是在数据库中实现的 +///62 X RepairUplineMES 72 RepairUplineMES 上线清空MOBY(针对上线工位):通知PLC从新开始申请上线流程 +///63 INT EngineTypeID_MES 73 机型代码(MES) MES发动机机型标志(必须MES) +///64 STRING EngineID_MES 74 工件编号(MES) MES发动机编号(必须MES) +///65 STRING EngineType_MES 75 EngineType_MES MES发动机机型(必须MES) +///66 X Reserved_20 76 Reserved_20 备用 +///67 INT ProcessCode 77 ProcessCode 手动拧紧工位:由MES通知PLC拧紧序号 +///68 B OnLineState 79 OnLineState 通过线体工位PC实现下达工位工作状态:工位有三种状态:在线、离线、屏蔽。在线:0正常状态,实现正常功能。1离线:设备脱离MES工作,进入不交互模式。 +///69 INT PartPalletCode 80 托盘号(MES) 托盘编号(B5A) +///70 INT BoltCode 88 BoltCode 手动拧紧工位:指导PLC所用套筒 +///71 INT RepairStatus 93 RepairStatus "0正常件,1返修件。对于上线工位MES给出是正常上线还是返修上线,返修路径" +///72 DInt Reserved_15 110 Reserved_15 备用 +///73 DInt Reserved_16 111 Reserved_16 备用 +///74 B Reserved_17 112 Reserved_17 备用 +///75 INT SPareint1 113 SPareint1 备用int1 +///76 INT SPareint2 114 SPareint2 备用int2 +///77 INT SPareint3 115 SPareint3 备用int3 +///78 STRING Sparestring1 116 Sparestring1 备用字符串1 +///79 STRING Sparestring2 117 Sparestring2 备用字符串2 +///80 X MachineStatusPutOn 1000 机床上电(PLC) 机床上电(必须PLC) +///81 X MachineStatusWorkOn 1001 循环开始(PLC) 循环开始(必须PLC) +///82 X MachineStatusAlarm 1002 设备报警(PLC) 机床故障(必须PLC) +///83 X MachineStatusNoPart 1003 MachineStatusNoPart 上料无件(必须PLC) +///84 X MachineStatusBlock 1004 MachineStatusBlock 下料堵塞(必须PLC) + + +namespace MesWork +{ + /// + /// 这是变量类型代码的配置,几乎是不变的 + /// 请不要随意修改,为了保证变量版本同一,并且方便维护,请联系发行人修改! + /// 请注意,此修改为全局修改! + /// + public enum EnumTagTypeCodeID + { + /// + /// 工件到位(PLC) + /// 变量类型:Bool + /// 解释:托盘到达工位,并且托盘上有工件。 + /// + WorkStart = 2, + /// + /// + /// + RepairPartStatusPLC = 3, + /// + /// 工位返修字符串 + /// 变量类型:String + /// 解释:工位返修字符串 + /// + RepairPathString = 4, + /// + /// 传递机型(MES) + /// 变量类型:Bool + /// 解释:MES传递总成信息给PLC(上线工位) + /// + EngineTypeGetOverMES = 5, + /// + /// + /// + PartPalletGoOver = 6, + /// + /// + /// + MaterialVerifyOver = 7, + /// + /// + /// + FalseGo = 8, + /// + /// + /// + EngineTypeID = 9, + /// + /// + /// + EngineID = 10, + /// + /// 机型(MES) + /// 变量类型:String + /// + EngineType = 11, + /// + /// + /// + PartPalletStatus = 13, + /// + /// + /// + HeartBeatPLC = 14, + /// + /// + /// + HeartBeatMIS = 15, + /// + /// + /// + TargetTimeRead = 16, + /// + /// + /// + MachineTargetTime = 17, + /// + /// + /// + MachineActualTime = 18, + /// + /// 允许保存(PLC) + /// 变量类型:Bool + /// + MesRead = 19, + /// + /// 保存完成(MES) + /// 变量类型:Bool + /// + MesReadOver = 20, + /// + /// 合格标志(PLC) + /// 变量类型:Int + /// + QualityMask = 21, + /// + /// + /// + PalletInfo = 22, + /// + /// + /// + RepairStatusPLC = 23, + /// + /// 订单号(MES) + /// 变量类型:Int + /// + OrderNo = 24, + /// + /// 库位号(MES) + /// 变量类型:Bool + /// + StorageNo = 25, + /// + /// 允许放行(MES) + /// 变量类型:Bool + /// + AllowPass = 26, + /// + /// + /// + PartLoadFinish = 27, + /// + /// + /// + Reserved_7 = 28, + /// + /// + /// + Reserved_8 = 29, + /// + /// + /// + Reserved_9 = 30, + /// + /// + /// + Reserved_10 = 31, + /// + /// + /// + Reserved_11 = 32, + /// + /// + /// + Reserved_12 = 33, + /// + /// + /// + Reserved_13 = 34, + /// + /// + /// + Reserved_14 = 35, + /// + /// + /// + PLCSPareint1 = 36, + /// + /// + /// + PLCSPareint2 = 37, + /// + /// + /// + PLCSPareint3 = 38, + /// + /// + /// + PLCSarestring1 = 39, + /// + /// + /// + PLCSarestring2 = 40, + /// + /// + /// + MarkID = 42, + /// + /// + /// + PartLoad = 43, + /// + /// 传递机型(PLC) + /// 变量类型:Bool + /// + EngineTypeGetOverPLC = 44, + /// + /// + /// + PartLoadOK = 48, + /// + /// + /// + Reserved_18 = 49, + /// + /// + /// + PalletDown = 50, + /// + /// + /// + ConfirmOkGo = 51, + /// + /// + /// + ResetDevice = 52, + /// + /// + /// + UnloadCompleted = 53, + /// + /// + /// + MachineTime_ReadOver = 54, + /// + /// + /// + Reserved_19 = 58, + /// + /// + /// + FixOK = 59, + /// + /// + /// + Reserved_21 = 61, + /// + /// + /// + Reserved_22 = 62, + /// + /// + /// + Reserved_23 = 63, + /// + /// + /// + Reserved_24 = 64, + /// + /// + /// + Reserved_25 = 65, + /// + /// + /// + FixAllow = 66, + /// + /// + /// + FixOver = 67, + /// + /// + /// + MatchingCompleted = 68, + /// + /// + /// + Match = 69, + /// + /// + /// + Reserved_2 = 70, + /// + /// + /// + IsAutoGetEngineID = 71, + /// + /// + /// + RepairUplineMES = 72, + /// + /// 机型代码(MES) + /// 变量类型:Int + /// + EngineTypeID_MES = 73, + /// + /// 工件编号(MES) + /// 变量类型:String + /// + EngineID_MES = 74, + /// + /// + /// + EngineType_MES = 75, + /// + /// + /// + Reserved_20 = 76, + /// + /// + /// + ProcessCode = 77, + /// + /// + /// + OnLineState = 79, + /// + /// 托盘号(MES) + /// 变量类型:Int + /// + PartPalletCode = 80, + /// + /// + /// + BoltCode = 88, + /// + /// + /// + RepairStatus = 93, + /// + /// + /// + Reserved_15 = 110, + /// + /// + /// + Reserved_16 = 111, + /// + /// + /// + Reserved_17 = 112, + /// + /// + /// + SPareint1 = 113, + /// + /// + /// + SPareint2 = 114, + /// + /// + /// + SPareint3 = 115, + /// + /// + /// + Sparestring1 = 116, + /// + /// + /// + Sparestring2 = 117, + /// + /// 机床上电(PLC) + /// 变量类型:Bool + /// + MachineStatusPutOn = 1000, + /// + /// 循环开始(PLC) + /// 变量类型:Bool + /// + MachineStatusWorkOn = 1001, + /// + /// 设备报警(PLC) + /// 变量类型:Bool + /// + MachineStatusAlarm = 1002, + /// + /// 上料无件(PLC) + /// 变量类型:Bool + /// + MachineStatusNoPart = 1003, + /// + /// 下料堵塞(PLC) + /// 变量类型:Bool + /// + MachineStatusBlock = 1004, + + + } +} diff --git a/Common/DoWhatPlc/TagTypeID.cs b/Common/DoWhatPlc/TagTypeID.cs new file mode 100644 index 0000000..b8800ac --- /dev/null +++ b/Common/DoWhatPlc/TagTypeID.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesWork +{ + /// + /// 这是信号点类型代码的配置 + /// 这里是不变的,请不要随意修改!!! + /// 请注意,此修改为全局修改! + /// + public enum EnumTagTypeID + { + Int16 = 2, + Int32 = 3, + Float = 4, + UInt64 = 7, + String = 8, + Bool = 11, + Byte = 17, + UInt16 = 18, + Double = 19, + Bytes = 21, + + } +} diff --git a/Common/DoWhatPlc/packages.config b/Common/DoWhatPlc/packages.config new file mode 100644 index 0000000..376abb5 --- /dev/null +++ b/Common/DoWhatPlc/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Common/MesControl/MesBoolSignal.Designer.cs b/Common/MesControl/MesBoolSignal.Designer.cs new file mode 100644 index 0000000..2989846 --- /dev/null +++ b/Common/MesControl/MesBoolSignal.Designer.cs @@ -0,0 +1,79 @@ +namespace MesControl +{ + partial class MesBoolSignal + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.pictureBox_Signal = new System.Windows.Forms.PictureBox(); + this.label_SignalName = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_Signal)).BeginInit(); + this.SuspendLayout(); + // + // pictureBox_Signal + // + this.pictureBox_Signal.BackgroundImage = global::MesControl.Properties.Resources.none; + this.pictureBox_Signal.Location = new System.Drawing.Point(3, 1); + this.pictureBox_Signal.Name = "pictureBox_Signal"; + this.pictureBox_Signal.Size = new System.Drawing.Size(20, 20); + this.pictureBox_Signal.TabIndex = 0; + this.pictureBox_Signal.TabStop = false; + // + // label_SignalName + // + this.label_SignalName.AutoSize = true; + this.label_SignalName.Font = new System.Drawing.Font("宋体", 12F); + this.label_SignalName.Location = new System.Drawing.Point(32, 3); + this.label_SignalName.MaximumSize = new System.Drawing.Size(72, 16); + this.label_SignalName.MinimumSize = new System.Drawing.Size(72, 16); + this.label_SignalName.Name = "label_SignalName"; + this.label_SignalName.Size = new System.Drawing.Size(72, 16); + this.label_SignalName.TabIndex = 1; + this.label_SignalName.Text = "心跳信号"; + // + // MesBoolSignal + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Transparent; + this.Controls.Add(this.label_SignalName); + this.Controls.Add(this.pictureBox_Signal); + this.MaximumSize = new System.Drawing.Size(110, 22); + this.MinimumSize = new System.Drawing.Size(110, 22); + this.Name = "MesBoolSignal"; + this.Size = new System.Drawing.Size(110, 22); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_Signal)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.PictureBox pictureBox_Signal; + private System.Windows.Forms.Label label_SignalName; + } +} diff --git a/Common/MesControl/MesBoolSignal.cs b/Common/MesControl/MesBoolSignal.cs new file mode 100644 index 0000000..c3e1d98 --- /dev/null +++ b/Common/MesControl/MesBoolSignal.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace MesControl +{ + public partial class MesBoolSignal : UserControl + { + public MesBoolSignal() + { + InitializeComponent(); + } + + /// + /// 外部调用控件触发的信号 + /// + /// + public void InputBoolSignal(bool Signal) + { + + if (Signal) + { + + pictureBox_Signal.BackgroundImage = Properties.Resources.green; + } + else + { + pictureBox_Signal.BackgroundImage = Properties.Resources.init; + } + + } + + [Browsable(true)] + [Description("控件中显示的文本内容"), Category("SignalText"), DefaultValue("")] + public string SignalText + { + get + { + return label_SignalName.Text; + } + + set + { + label_SignalName.Text = value; + } + + } + + SignalImage_Enum enum1; + + [Browsable(true)] + [Description("控件用于显示状态的图片"), Category("SignalImage"), DefaultValue("none")] + public SignalImage_Enum SignalImage + { + get + { + return enum1; + } + set + { + SetSignalImage(value); + enum1 = value; + + + + } + + + } + + + + public enum SignalImage_Enum + { + + none, init, green, yellow, red + + } + + void SetSignalImage(SignalImage_Enum Image) + { + switch (Image) + { + case SignalImage_Enum.none: + pictureBox_Signal.BackgroundImage = Properties.Resources.none; + break; + case SignalImage_Enum.init: + pictureBox_Signal.BackgroundImage = Properties.Resources.init; + break; + case SignalImage_Enum.green: + pictureBox_Signal.BackgroundImage = Properties.Resources.green; + break; + case SignalImage_Enum.yellow: + pictureBox_Signal.BackgroundImage = Properties.Resources.yellow; + break; + case SignalImage_Enum.red: + pictureBox_Signal.BackgroundImage = Properties.Resources.red; + break; + + } + + } + + + } +} diff --git a/Common/MesControl/MesBoolSignal.resx b/Common/MesControl/MesBoolSignal.resx new file mode 100644 index 0000000..1810bb4 --- /dev/null +++ b/Common/MesControl/MesBoolSignal.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + \ No newline at end of file diff --git a/Common/MesControl/MesControl.csproj b/Common/MesControl/MesControl.csproj new file mode 100644 index 0000000..624392c --- /dev/null +++ b/Common/MesControl/MesControl.csproj @@ -0,0 +1,139 @@ + + + + + Debug + AnyCPU + {FAB322CC-531D-4AEA-986A-B921B64D8D3F} + Library + Properties + MesControl + MesControl + v4.6.1 + 512 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + + + + UserControl + + + MesBoolSignal.cs + + + UserControl + + + PlcWorkStationSignal.cs + + + UserControl + + + PlcConnect.cs + + + + True + True + Resources.resx + + + UserControl + + + + + + MesBoolSignal.cs + + + PlcWorkStationSignal.cs + + + ResXFileCodeGenerator + Designer + Resources.Designer.cs + + + PlcConnect.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Common/MesControl/PlcConnect.Designer.cs b/Common/MesControl/PlcConnect.Designer.cs new file mode 100644 index 0000000..5e44fd1 --- /dev/null +++ b/Common/MesControl/PlcConnect.Designer.cs @@ -0,0 +1,81 @@ +namespace MesControl +{ + partial class PlcConnect + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.pictureBox_OpName = new System.Windows.Forms.PictureBox(); + this.label_OpName = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_OpName)).BeginInit(); + this.SuspendLayout(); + // + // pictureBox_OpName + // + this.pictureBox_OpName.BackgroundImage = global::MesControl.Properties.Resources.BreakPLC; + this.pictureBox_OpName.Location = new System.Drawing.Point(3, 1); + this.pictureBox_OpName.MaximumSize = new System.Drawing.Size(20, 20); + this.pictureBox_OpName.MinimumSize = new System.Drawing.Size(20, 20); + this.pictureBox_OpName.Name = "pictureBox_OpName"; + this.pictureBox_OpName.Size = new System.Drawing.Size(20, 20); + this.pictureBox_OpName.TabIndex = 0; + this.pictureBox_OpName.TabStop = false; + // + // label_OpName + // + this.label_OpName.AutoSize = true; + this.label_OpName.Font = new System.Drawing.Font("宋体", 12F); + this.label_OpName.Location = new System.Drawing.Point(32, 3); + this.label_OpName.MaximumSize = new System.Drawing.Size(72, 16); + this.label_OpName.MinimumSize = new System.Drawing.Size(72, 16); + this.label_OpName.Name = "label_OpName"; + this.label_OpName.Size = new System.Drawing.Size(72, 16); + this.label_OpName.TabIndex = 1; + this.label_OpName.Text = "通讯状态"; + // + // PlcConnect + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Transparent; + this.Controls.Add(this.label_OpName); + this.Controls.Add(this.pictureBox_OpName); + this.MaximumSize = new System.Drawing.Size(110, 22); + this.MinimumSize = new System.Drawing.Size(110, 22); + this.Name = "PlcConnect"; + this.Size = new System.Drawing.Size(110, 22); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox_OpName)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.PictureBox pictureBox_OpName; + private System.Windows.Forms.Label label_OpName; + } +} diff --git a/Common/MesControl/PlcConnect.cs b/Common/MesControl/PlcConnect.cs new file mode 100644 index 0000000..6bbf2e1 --- /dev/null +++ b/Common/MesControl/PlcConnect.cs @@ -0,0 +1,221 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace MesControl +{ + public delegate void PlcStatusHandle(); + public partial class PlcConnect: UserControl + { + public PlcConnect() + { + InitializeComponent(); + + } + public static PlcStatusHandle PlcBreakChange,PlcConnectChange; + + + #region 内部变量 + int externalTimerTimes =0; + + int testPlcBreakInterval=10000; + + int testPlcBreakTime=0; + + int externalTimerInterval = 200; + + bool isBreakPLC = true; + + bool plcTestEnable; + + bool plcBreakIsChanged=false; + bool plcConnectIsChanged = false; + + #endregion + #region 内部方法 + + void TimerTimeChange() + { + if (externalTimerTimes == 999) + { + externalTimerTimes = 0; + } + else + { + externalTimerTimes++; + } + + if (testPlcBreakTime > 0) + { + testPlcBreakTime--; + plcBreakIsChanged = false; + + if (PlcConnectChange!=null&&!plcConnectIsChanged) + { + PlcConnectChange(); + plcConnectIsChanged = true; + } + } + else + { + if (plcTestEnable) + { + if(PlcBreakChange != null&& !plcBreakIsChanged) + { + PlcBreakChange(); + plcBreakIsChanged = true; + } + plcConnectIsChanged = false; + } + isBreakPLC = true; + } + + } + #endregion + + #region 外部方法 + public void ExternalTimer() + { + + if (!isBreakPLC) + { + switch (externalTimerTimes % 5) + { + case 0: + pictureBox_OpName.BackgroundImage = Properties.Resources.PlcConnect0; + break; + case 1: + pictureBox_OpName.BackgroundImage = Properties.Resources.PlcConnect1; + break; + case 2: + pictureBox_OpName.BackgroundImage = Properties.Resources.PlcConnect2; + break; + case 3: + pictureBox_OpName.BackgroundImage = Properties.Resources.PlcConnect3; + break; + case 4: + pictureBox_OpName.BackgroundImage = Properties.Resources.PlcConnect4; + break; + + } + } + else + { + pictureBox_OpName.BackgroundImage = Properties.Resources.BreakPLC; + } + + + TimerTimeChange(); + } + + + + + public void ExternalPlcConnect() + { + testPlcBreakTime = (testPlcBreakInterval / externalTimerInterval) + 1; + isBreakPLC = false; + + } + + public void PlcBreak() + { + pictureBox_OpName.BackgroundImage = Properties.Resources.BreakPLC; + isBreakPLC = true; + } + + #endregion + + #region 属性 + + [Browsable(true)] + [Description("控件中显示的文本内容"), Category("外观"), DefaultValue("OP0000")] + public string LabelText + { + get + { + return label_OpName.Text; + } + + set + { + label_OpName.Text = value; + } + + } + + + [Browsable(true)] + [Description("外部定时器周期"), Category("行为"), DefaultValue("200")] + public int ExternalTimerInterval + { + get + { + return externalTimerInterval; + } + + set + { + externalTimerInterval = value; + } + + } + + [Browsable(true)] + [Description("检测PLC在线状态超时,超过此时间,PLC为离线状态"), Category("行为"), DefaultValue("200")] + public int TestPlcBreakInterval + { + get + { + return testPlcBreakInterval; + } + + set + { + testPlcBreakInterval = value; + } + + } + + [Browsable(true)] + [Description("指示PLC是否为断开状态"), Category("行为"), DefaultValue("True")] + public bool IsBreakPLC + { + get + { + return isBreakPLC; + } + + set + { + isBreakPLC = value; + } + + } + + [Browsable(true)] + [Description("是否启用检测PLC在线状态功能"), Category("行为"), DefaultValue("True")] + public bool PlcTestEnable + { + get + { + return plcTestEnable; + } + + set + { + plcTestEnable = value; + } + + } + + #endregion + + + } +} diff --git a/Common/MesControl/PlcConnect.resx b/Common/MesControl/PlcConnect.resx new file mode 100644 index 0000000..0abf881 --- /dev/null +++ b/Common/MesControl/PlcConnect.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + \ No newline at end of file diff --git a/Common/MesControl/PlcWorkStationSignal.Designer.cs b/Common/MesControl/PlcWorkStationSignal.Designer.cs new file mode 100644 index 0000000..e4e1488 --- /dev/null +++ b/Common/MesControl/PlcWorkStationSignal.Designer.cs @@ -0,0 +1,80 @@ +namespace MesControl +{ + partial class PlcWorkStationSignal + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.groupBox_WorkStationGrp = new System.Windows.Forms.GroupBox(); + this.plcConnect_WorkStation = new MesControl.PlcConnect(); + this.groupBox_WorkStationGrp.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox_WorkStationGrp + // + this.groupBox_WorkStationGrp.BackColor = System.Drawing.Color.Transparent; + this.groupBox_WorkStationGrp.Controls.Add(this.plcConnect_WorkStation); + this.groupBox_WorkStationGrp.Location = new System.Drawing.Point(4, 4); + this.groupBox_WorkStationGrp.Name = "groupBox_WorkStationGrp"; + this.groupBox_WorkStationGrp.Size = new System.Drawing.Size(125, 50); + this.groupBox_WorkStationGrp.TabIndex = 0; + this.groupBox_WorkStationGrp.TabStop = false; + this.groupBox_WorkStationGrp.Text = "OP0000"; + // + // plcConnect_WorkStation + // + this.plcConnect_WorkStation.BackColor = System.Drawing.Color.Transparent; + this.plcConnect_WorkStation.ExternalTimerInterval = 200; + this.plcConnect_WorkStation.IsBreakPLC = false; + this.plcConnect_WorkStation.LabelText = "通讯状态"; + this.plcConnect_WorkStation.Location = new System.Drawing.Point(7, 21); + this.plcConnect_WorkStation.MaximumSize = new System.Drawing.Size(110, 22); + this.plcConnect_WorkStation.MinimumSize = new System.Drawing.Size(110, 22); + this.plcConnect_WorkStation.Name = "plcConnect_WorkStation"; + this.plcConnect_WorkStation.PlcTestEnable = false; + this.plcConnect_WorkStation.Size = new System.Drawing.Size(110, 22); + this.plcConnect_WorkStation.TabIndex = 0; + this.plcConnect_WorkStation.TestPlcBreakInterval = 0; + // + // PlcWorkStationSignal + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Transparent; + this.Controls.Add(this.groupBox_WorkStationGrp); + this.Name = "PlcWorkStationSignal"; + this.Size = new System.Drawing.Size(136, 60); + this.groupBox_WorkStationGrp.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox_WorkStationGrp; + private PlcConnect plcConnect_WorkStation; + } +} diff --git a/Common/MesControl/PlcWorkStationSignal.cs b/Common/MesControl/PlcWorkStationSignal.cs new file mode 100644 index 0000000..eb47a8c --- /dev/null +++ b/Common/MesControl/PlcWorkStationSignal.cs @@ -0,0 +1,225 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace MesControl +{ + public delegate void WorkStationPlcBreakChanged(); + public partial class PlcWorkStationSignal : UserControl + { + public PlcWorkStationSignal() + { + InitializeComponent(); + PlcConnect.PlcBreakChange = new PlcStatusHandle(internalPlcBreak); + PlcConnect.PlcConnectChange = new PlcStatusHandle(internalPlcConnect); + + } + + public EventHandler WorkStationPlcStatusChange; + + #region 工位信号方法与属性 + + public void InitSignalControl() + { + + + for (int i = 0; i < SignalItems.Count; i++) + { + + MesBoolSignal mesBoolSignalNew = new MesBoolSignal(); + this.groupBox_WorkStationGrp.Controls.Add(mesBoolSignalNew);//扩展GroupBox + mesBoolSignalNew.BackColor = System.Drawing.Color.Transparent; + mesBoolSignalNew.Location = new System.Drawing.Point(7, 46 + (25 * i)); + mesBoolSignalNew.Name = SignalItems[i].Name; + mesBoolSignalNew.SignalImage = MesBoolSignal.SignalImage_Enum.none; + mesBoolSignalNew.SignalText = SignalItems[i].SignalText; + mesBoolSignalNew.Size = new System.Drawing.Size(110, 22); + mesBoolSignalNew.TabIndex = i; + + } + + //groupbox大小 + groupBox_WorkStationGrp.Size = new Size(125, 50 + (SignalItems.Count * 25)); + //控件大小 + this.Size = new Size(136, 60 + (SignalItems.Count * 25)); + + } + + private List signalItems = new List(); + [Browsable(true)] + [Description("MES信号控件集合"), Category("数据")] + [TypeConverter(typeof(System.ComponentModel.CollectionConverter))] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + public List SignalItems + { + get + { + return signalItems; + } + + set + { + signalItems = value; + InitSignalControl(); + } + } + + /// + ///更改工位各个信号状态(默认) + /// + /// + /// + public void SignalChange(string SignalName, bool Value) + { + MesBoolSignal thisControl = (MesBoolSignal)Controls.Find(SignalName, true)[0]; + if (thisControl != null) + thisControl.SignalImage = Value ? MesBoolSignal.SignalImage_Enum.green : MesBoolSignal.SignalImage_Enum.init; + + } + + #endregion + + #region PLC在线状态属性与方法 + + ///////////////////////////////////////////////方法/////////////////////////////////////////////////// + + public void PlcConnectStatusChange(bool value) + { + plcConnect_WorkStation.ExternalPlcConnect(); + + } + public void ExternalTimerExcute() + { + plcConnect_WorkStation.ExternalTimer(); + } + + public void PlcBreak() + { + plcConnect_WorkStation.PlcBreak(); + } + + void internalPlcBreak() + { + if (WorkStationPlcStatusChange != null) + { + WorkStationPlcStatusChange(groupBox_WorkStationGrp.Text+"&Breaked",null); + } + + } + + void internalPlcConnect() + { + if (WorkStationPlcStatusChange != null) + { + WorkStationPlcStatusChange(groupBox_WorkStationGrp.Text + "&Connected", null); + } + } + + + //////////////////////////////////////////////////////////////属性/////////////////////////////////////////////// + + [Browsable(true)] + [Description("检测PLC在线状态开关"), Category("行为"), DefaultValue(true)] + public bool TestPLC_Enable + { + get + { + return plcConnect_WorkStation.PlcTestEnable; + } + set + { + plcConnect_WorkStation.PlcTestEnable = value; + } + } + + [Browsable(true)] + [Description("PLC心跳超时(超过此时间认为PLC离线)"), Category("行为"), DefaultValue(10000)] + public int TestPLC_Interval + { + get + { + return plcConnect_WorkStation.TestPlcBreakInterval; + } + set + { + + plcConnect_WorkStation.TestPlcBreakInterval = value; + + } + } + + + [Browsable(true)] + [Description("外部定时器循环时间"), Category("行为"), DefaultValue(200)] + public int ExternalTimerInterval + { + get + { + return plcConnect_WorkStation.ExternalTimerInterval; + } + set + { + plcConnect_WorkStation.ExternalTimerInterval = value; + } + } + + [Browsable(true)] + [Description("PLC在线状态"), Category("行为"), DefaultValue(false)] + public bool PLC_ConnectStatus + { + get + { + return plcConnect_WorkStation.IsBreakPLC; + } + set + { + plcConnect_WorkStation.IsBreakPLC = value; + } + } + + #endregion + + #region 当前控件方法与属性 + + [Browsable(true)] + [Description("控件显示的工位号"), Category("外观"), DefaultValue("OP0000")] + public string WorkStationNameText + { + get + { + return groupBox_WorkStationGrp.Text; + } + set + { + groupBox_WorkStationGrp.Text = value; + + } + + } + + [Browsable(true)] + [Description("控件中plc通讯显示的文本内容"), Category("外观"), DefaultValue("PLC连接")] + public string WS_PlcLabelText + { + get + { + return plcConnect_WorkStation.LabelText ; + } + + set + { + plcConnect_WorkStation.LabelText = value; + } + + } + + + #endregion + + } +} diff --git a/Common/MesControl/PlcWorkStationSignal.resx b/Common/MesControl/PlcWorkStationSignal.resx new file mode 100644 index 0000000..48f62a6 --- /dev/null +++ b/Common/MesControl/PlcWorkStationSignal.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + \ No newline at end of file diff --git a/Common/MesControl/Properties/AssemblyInfo.cs b/Common/MesControl/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..68d5529 --- /dev/null +++ b/Common/MesControl/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("MesControl")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MesControl")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("fab322cc-531d-4aea-986a-b921b64d8d3f")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Common/MesControl/Properties/Resources.Designer.cs b/Common/MesControl/Properties/Resources.Designer.cs new file mode 100644 index 0000000..543a51e --- /dev/null +++ b/Common/MesControl/Properties/Resources.Designer.cs @@ -0,0 +1,193 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace MesControl.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MesControl.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性 + /// 重写当前线程的 CurrentUICulture 属性。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap BreakPLC { + get { + object obj = ResourceManager.GetObject("BreakPLC", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap green { + get { + object obj = ResourceManager.GetObject("green", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap init { + get { + object obj = ResourceManager.GetObject("init", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap none { + get { + object obj = ResourceManager.GetObject("none", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap PlcConnect0 { + get { + object obj = ResourceManager.GetObject("PlcConnect0", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap PlcConnect1 { + get { + object obj = ResourceManager.GetObject("PlcConnect1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap PlcConnect2 { + get { + object obj = ResourceManager.GetObject("PlcConnect2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap PlcConnect3 { + get { + object obj = ResourceManager.GetObject("PlcConnect3", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap PlcConnect4 { + get { + object obj = ResourceManager.GetObject("PlcConnect4", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap PlcConnectBig { + get { + object obj = ResourceManager.GetObject("PlcConnectBig", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap PlcConnectSmall { + get { + object obj = ResourceManager.GetObject("PlcConnectSmall", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap red { + get { + object obj = ResourceManager.GetObject("red", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap yellow { + get { + object obj = ResourceManager.GetObject("yellow", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Common/MesControl/Properties/Resources.resx b/Common/MesControl/Properties/Resources.resx new file mode 100644 index 0000000..e9eebfc --- /dev/null +++ b/Common/MesControl/Properties/Resources.resx @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\red.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\yellow.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\PlcConnect1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\PlcConnect0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\PlcConnect3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\none.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\PlcConnectSmall.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\PlcConnect2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\init.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\PlcConnectBig.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\BreakPLC.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\PlcConnect4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Common/MesControl/Properties/_system~.ini b/Common/MesControl/Properties/_system~.ini new file mode 100644 index 0000000..e69de29 diff --git a/Common/MesControl/Resources/BreakPLC.png b/Common/MesControl/Resources/BreakPLC.png new file mode 100644 index 0000000000000000000000000000000000000000..4873366aae7666823af3aaa4e1f3a8250cffad7c GIT binary patch literal 4041 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 JPDHLkV1gj&ai9PI literal 0 HcmV?d00001 diff --git a/Common/MesControl/Resources/PlcConnect1.png b/Common/MesControl/Resources/PlcConnect1.png new file mode 100644 index 0000000000000000000000000000000000000000..8c0a417c4e044feb5bf5e86be49569972b398d50 GIT binary patch literal 2936 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 FV1gdBS^EG0 literal 0 HcmV?d00001 diff --git a/Common/MesControl/Resources/PlcConnect3.png b/Common/MesControl/Resources/PlcConnect3.png new file mode 100644 index 0000000000000000000000000000000000000000..165eaebf23cc4732d06c16705bea028fcf21e40d GIT binary patch literal 3647 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

OSG8q`#=rukS*W(Cj zA^6+_K>lfSP~Z2j0e#yqUrCY=_CL@S@a}E5UUx}|0N1Zd`W92Rm`S!N*$#~)#u;bV?ff+WR}x^9F=2(C P00000NkvXXu0mjf;&;=D literal 0 HcmV?d00001 diff --git a/Common/MesControl/Resources/PlcConnectSmall.png b/Common/MesControl/Resources/PlcConnectSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..8f43514961ee0b3e48b84b5b25811b8f03db1264 GIT binary patch literal 3265 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 literal 0 HcmV?d00001 diff --git a/Common/MesControl/Resources/_system~.ini b/Common/MesControl/Resources/_system~.ini new file mode 100644 index 0000000..e69de29 diff --git a/Common/MesControl/Resources/green.png b/Common/MesControl/Resources/green.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b463ef1549f24bd41f3c55009e58fabb99808f GIT binary patch literal 3885 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 literal 0 HcmV?d00001 diff --git a/Common/MesControl/Resources/init.png b/Common/MesControl/Resources/init.png new file mode 100644 index 0000000000000000000000000000000000000000..c148366505baa0fa32cc0541529eaffb7e273c62 GIT binary patch literal 3902 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 P00000NkvXXu0mjfw}6l( literal 0 HcmV?d00001 diff --git a/Common/MesControl/SignalInit.cs b/Common/MesControl/SignalInit.cs new file mode 100644 index 0000000..3b5b0a8 --- /dev/null +++ b/Common/MesControl/SignalInit.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MesControl +{ + public partial class PlcWorkStationSignal + { + void initsignal() + { + //private PlcConnect plcConnect_WorkStation; + //this.plcConnect_WorkStation = new MesControl.PlcConnect(); + //this.groupBox_WorkStationGrp.Controls.Add(this.plcConnect_WorkStation); + + //// + //// plcConnect_WorkStation + //// + //this.plcConnect_WorkStation.BackColor = System.Drawing.Color.Transparent; + //this.plcConnect_WorkStation.ExternalTimerInterval = 200; + //this.plcConnect_WorkStation.IsBreakPLC = false; + //this.plcConnect_WorkStation.LabelText = "通讯状态"; + //this.plcConnect_WorkStation.Location = new System.Drawing.Point(7, 21); + //this.plcConnect_WorkStation.MaximumSize = new System.Drawing.Size(110, 22); + //this.plcConnect_WorkStation.MinimumSize = new System.Drawing.Size(110, 22); + //this.plcConnect_WorkStation.Name = "plcConnect_WorkStation"; + //this.plcConnect_WorkStation.PlcTestEnable = false; + //this.plcConnect_WorkStation.Size = new System.Drawing.Size(110, 22); + //this.plcConnect_WorkStation.TabIndex = 0; + //this.plcConnect_WorkStation.TestPlcBreakInterval = 0; + + } + + + + } +} diff --git a/Common/MesControl/_system~.ini b/Common/MesControl/_system~.ini new file mode 100644 index 0000000..e69de29 diff --git a/Common/MyLog4Net/00_MyLog4Net.csproj b/Common/MyLog4Net/00_MyLog4Net.csproj new file mode 100644 index 0000000..1c1c6ad --- /dev/null +++ b/Common/MyLog4Net/00_MyLog4Net.csproj @@ -0,0 +1,61 @@ + + + + + Debug + AnyCPU + {1DC48C83-1842-4DE8-ACAF-26E1E7F7C58F} + Library + Properties + MyLog4Net + MyLog4Net + v4.8 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\log4net.2.0.14\lib\net45\log4net.dll + + + + + + + + + + + + + + + + + + + + + Always + + + + \ No newline at end of file diff --git a/Common/MyLog4Net/MyLogEventArgs.cs b/Common/MyLog4Net/MyLogEventArgs.cs new file mode 100644 index 0000000..a913363 --- /dev/null +++ b/Common/MyLog4Net/MyLogEventArgs.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MyLog4Net +{ + public class MyLogEventArgs : EventArgs + { + public string Message { get; set; } + public string Module { get; set; } + } +} diff --git a/Common/MyLog4Net/MyLogHelper.cs b/Common/MyLog4Net/MyLogHelper.cs new file mode 100644 index 0000000..cb446e4 --- /dev/null +++ b/Common/MyLog4Net/MyLogHelper.cs @@ -0,0 +1,65 @@ +using log4net; +using System; + +namespace MyLog4Net +{ + public class MyLogHelper + { + public delegate void MyLogEventHandler(object sender, MyLogEventArgs e); + public static event MyLogEventHandler LogCommit; + + /// + /// 普通日志 + /// + /// 日志内容 + public static void Info(string module, string message) + { + ILog log = LogManager.GetLogger(module); + if (log.IsInfoEnabled) + { + log.Info(message); + + var e = new MyLogEventArgs(); + e.Module = module; + e.Message = message; + LogCommit?.Invoke(null, e); + } + } + /// + /// 错误日志带异常 + /// + /// 错误日志 + public static void Error(string module, string message, Exception ex) + { + ILog log = LogManager.GetLogger(module); + if (log.IsErrorEnabled) + { + log.Error(message, ex); + + var e = new MyLogEventArgs(); + e.Module = module; + e.Message = message; + LogCommit?.Invoke(null, e); + } + } + + /// + /// 错误日志不带异常 + /// + /// 错误日志 + public static void Error(string module, string message) + { + ILog log = LogManager.GetLogger(module); + if (log.IsErrorEnabled) + { + log.Error(message); + + var e = new MyLogEventArgs(); + e.Module = module; + e.Message = message; + LogCommit?.Invoke(null, e); + } + } + } + +} diff --git a/Common/MyLog4Net/Properties/AssemblyInfo.cs b/Common/MyLog4Net/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1228254 --- /dev/null +++ b/Common/MyLog4Net/Properties/AssemblyInfo.cs @@ -0,0 +1,37 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Log4Net")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Log4Net")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("1dc48c83-1842-4de8-acaf-26e1e7f7c58f")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] diff --git a/Common/MyLog4Net/log4net.config b/Common/MyLog4Net/log4net.config new file mode 100644 index 0000000..92f4d40 --- /dev/null +++ b/Common/MyLog4Net/log4net.config @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Common/MyLog4Net/packages.config b/Common/MyLog4Net/packages.config new file mode 100644 index 0000000..a0798f9 --- /dev/null +++ b/Common/MyLog4Net/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Common/WebApiDll/DoWhatPlc.dll b/Common/WebApiDll/DoWhatPlc.dll new file mode 100644 index 0000000000000000000000000000000000000000..05a149a8fe74de4828a3e53500ee002c3716072b GIT binary patch literal 35328 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

XFjv2M6#%<`n&UynY-1RSiN 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

JL^zXwsLYDzAIYP(_ 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

oXBZv@b%ud`QQ1!*5L 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%0AT%B- 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

s7VTVO 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 literal 0 HcmV?d00001 diff --git a/Common/dll/00MesWorkMqtt.dll b/Common/dll/00MesWorkMqtt.dll new file mode 100644 index 0000000000000000000000000000000000000000..6085aee6e4010e58b6391a29dd1b5361780f203c GIT binary patch literal 12288 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 literal 0 HcmV?d00001 diff --git a/Common/dll/00MesWorkMqtt.pdb b/Common/dll/00MesWorkMqtt.pdb new file mode 100644 index 0000000000000000000000000000000000000000..fb817865c83c8cecfb02fc65117935b7d2d60842 GIT binary patch literal 32256 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 literal 0 HcmV?d00001 diff --git a/Common/dll/01DoWhatPlc.dll b/Common/dll/01DoWhatPlc.dll new file mode 100644 index 0000000000000000000000000000000000000000..9bd5bc9eb5e3878ca8e6d6b0c106e7f281842629 GIT binary patch literal 20480 zcmeHvdwd(!nf5y~vMkB6EZNS5kPziUB62ZyZa6rAZ;4|_94B%T0s&jLCyt0L2}w?3 zz|?L^AZ(z7TiF(N&@F6t3+$!k`*4;8nr>;g%kpEF@7MA@?>lEC z*)p_y`ThFGu7aL%{qRGgCvfCXz2L{gFx29;UdP^OI+#o)`cjepU{53-Ph^7KW-v7n4@Tp`<}Kl1f1=l{DlPRaRH56~ z6K&EAT3-43J9cT~G(T9PRTFK5;sWG@eyto?KwU(TBMazg5#-1MS|x%UStwG199eKG zL5?gGD?yGdpt~i899eKHL5?hVlpseIN|YeS`FbcobhA|XWN#w|R<|#prEX-Ge z99dYP1Ua&>PziEm;cO+yk%dJ{u#bzGvqKE@Wylu9fN+j2h_Oi3otEH?RaEPAt2%SG zuKOGz)W=D>uPB6KVK@@yXm03CMJhlNm8{GW#R#1t$D+_&Ir^MK2=35*#Y0Qw=o(rk zNB0oM40KNjUBU&FgpiPp(hyRx;SHhMPOe-7iMW_0ViV^e}An5%4TQ z^eAjJ(5YW5WrxrmP*A=z-3ahFOO{fxbkw=10}nbma?fG@5J8SC)F?rYEUZw199dYY z1Ua&>N(uIH4Rdygfzr;i1u-Dt(y>yAL3C!dK@S$3iy}v;8PyM=WbU3KpWEUWC>}zA za2O#}9><~(%EQ3dea_G{K0^o&`hNq9(1p|U1QdkxW2L!havCKdg)1}znTA%Qt~@Tz zmqKv<8rWDu8qNo%6e{0F0Zg4ZRlQWc-?A&JOKBSyW1T3y3ZN)&WzI_ww;)R)vbiDR<{yA8~;~Rf<7>|BvN;tosQ+Y_fUb_pK?o_ z!7HyneOKM}cF_3o5ALsf!Dd|Bx-}g1t5)Lh>%V+XsyxTobV8!vaK-n&Tz8J0f#tft z=jhj28J_h1;EB3hZTGAD=090?x6L?M-3E@n#Y%j9%{@O_JsWkp;I2DgsJcK}$y!|r zCt6}9x~=~gFV;P5$Jq5+>Xo{~HoM93^>?dUYULa`Qf{0ho+>=&Kgjuifi4I*QWaU1 zd$RTwOI?svPqF%prQ(uR5nf~Ugr#C2DfMqzz1>pRXVssudYz?i&#Eu6y2ny`vMP6V zZM&r=vg&tPJ>OCfWYwowU1+I?vg$Wk^;s&0nX1`WSp7EuTKt);`UO`1!BW4FRX@k- zicnRTme@_aiBQ$p`CE~GB86^*_NLLR+?pJfCaLwWNG;fE7(%Ein^3=slJ8b zY4H5+IT}P!-r841z-r?;I!}b}iGaDrb9BB4e8C#L`go2m5a9t4uoifZE)?OI2&lT} zDAq6p9TtISv!hr#HSf}tA#fM|aNrtTi*&TR|H5U<@^KtVS#cLrs?6 z%mNmheSGBQNDK%uTMz?6zb%LXA#Mv|K)~f-#SjBR(iX&kaJ4On0U>1zVn9gSf*24o zwjc(C0b39Q!hTy20|G8Us~%!NIA{xEKp3u<`y6W5)VmbbJjtF(e=5!}KA{Jq}$K=b>-p%x_uF$M{e=^tg4v1?iAI z+Z6FCt$2?Au6RZN*?1rDg&|FxSf!#rw0W{$uFv+D)iwD6RiCMV#*p-tV@UeSS7ddT z&oLyu#eI(r4He-!*O#3W{QiBjM?BL@mR9P;3CuelXC!!sM%rbb;u)8g6zd7hKAv;+ zrKg`WJHelDz}FZ{baP^SbWA@x=RBZc1t0>WBHm|Y0KJ57&sFBKdch`ane^yip!le%ggu!&#Qql z3YW9)F1gp|q}v3q7Sz0~yd?Hpf*eJLb$i1+U0lmZj{M6!&>kV1<<8o$Rnkl}rQf5Iq zL)e?*JC~}3{f)4-v|iY)6`Zn;HjrEM(|SFwUqSWMBJ5E&vnG_wzMmoA70A^p`929| z;!Ij>+{ICj&|&cnOUygyM#)zKb_IQnFwNj(Zbb_k=-U_v8dW=HU{ByQ7)`N*#w^%l zf?pK;KZ3t4;xy0c?A=tv_&q2)hM&wMCdN(lrf-2yQI#QQmYZExz(1{PWHZy^cr0#X?=7#K=JvnImuyyzJmK?>bnwBA-S-IH^=$2z;O-1iZ$( z4ETzV@qCRHY$1Tpx@Q4zk~%!%tIjH4M|+)Q#i|xggY9S$C)#(Nz*RMO_Ihs7gb_ED7a6&7fQ;vb&j@6Y-@y+ zNx9V$ty0q8EB2Fuzm=5lTk!>X{5UBgXYE_kd)B%8wVd&z(tCZ<#&@OF3&p-)@J?Jc z)2YNC0zNGm5=;nww~X}`vF{W6WwAdHoE~8BD#3Te`+(?&flm6dn{ity<3lp89Uiy40*-XFNwJ}l|C$~gRIQ9dNrcla2;DI?YzZ!2X?J}>RHS~r_`gjnshdSJ6} zmC+vL8S$`d$mPd;vP-d)D~PoyqS$iGT{>N*SWpXMo=qt>-|YvxRq39{Lx>_LiQY68b=~!#+QlF^}*$ z>^g{;UMjKJ%wt&Tyi_@X%~2`eM4x$Skzzm7f>cUXiuHT_VCN~;i3w^rw$D zDprI3ETeYC_#BndF2(p9`6;5<4QRWcu2SqkS&$#rDE2x$0lHSPmncZ(bV#u;qn_o& z_kY~Jdr;2`x>K=tQF;a4tC-W{2m6v@Ay1Gh>8pyZgRhbvw|%JDGlniX5;*$KAU_M!Bpv|TaorKQwmG4xWmv5cx0TKzJw zG-<4%+l1XsVebIg`g6pGl-C-ybVZh7m7={__DSP>dML||80+Xsi@84QIzboGbBaCe z!fH!DQtbN5uyGN+tk|uUZD6k{_PdI(QBVJBENrZ&wTkU6 zYXfUkY$NKjfi6~TE9$a=!nV&9Hd^R%#kRZJz>jjX3%#M(m$f#qUn=$zg^hOlSH)hZ zHn86+_A}($N=1CLf%d(Ld|Sz<7|$r%Xu4uN+iat`inU_AglVy2mtstWsamlV`nrQ^ z6&pfdcTj_3eBExRR>k<5-cH*T+l)TjL6<3ZrMnHRN3nb0+e!Nr`yzZhDWg~j-`NzhWyeUM`~t72~@+-z3Y8Q3~tu7su zyFZP-?d98nKNkL4Om!r7V}!$1Np#REfWGTlMGCtvG(2?UlGs z)M-R&^}M9{WA*TVz1*A73LVeLxm}k1ELxOr8wFkicM_cDw47gl-C!vW>=O7nL$gGC zsoYJ+@WeR)bmAWQSipl7@fhAs)d;Q?Y!GY}+$y+BFan%LQL(QU927hPbkd&!XVHk* zBebkE2>UJfLOMlrT|qicpLSK#ar#Qd8rUA(cmIY`fgodL7)rf&7qHfQCGfI95Adea zy}(je0yy230ctb|JeRHqE}}!gdfZ!|rt@%5Jtn36h8inALqC){{D!_?{sqKu!M@N( z)$|x}75x>kmfiubqnVly5!M5nX*Uon25=MI18k=;U;ZoaJd=I}TtM#w z@pb{;m4bDGO`=~yUg%*_E*I>fg;4fU8!%0mJL)BVgF-H)OYDe3R))nMQOL@u*vA#J za#HLug{+K=eM%uKq;ZQhg{%a{o~MwNda)Z6veG4XL?J7~Vvh=*6dV_PLy&YXB`8=g z*d;hDI4XEjFlcbfdciKiVZl+slY--d;{EWbFm`|rRHLfC}d?+ z?BfbqIVtv-LRQAbKBbTqDw6srWF;u}JcX>(i`^wSEO<(xL~u$3g%UyRc?uy;i+xHVD^x6XP{>M9?0Ug2!C}Es!IOgHg5=`7K?~h% z*9&$D4hxP7o)jDxB#-10tQYJO92OiEJSjLXNF|b9uwJlBa9D6u@TB0lAbBOdV7*|M z;IQDR;7P%8K`NE>g7t!3f)Rz>C&OZoC}d?+?BfbqIVtv-LRQAbKBbTq@^M+3LRNxe z&r`@sz1R&3S?LlxqL7tgu}2iLGAj0Qg{+(udrToK<6@su$O@H7eH5}16nmaRR_euW zP{>M`*b#-S42wOYkd;xfk1J&5q}XE$Ss54mltNa>FZEH#N>J>13R$TayFnok4XAAi1mjh zjmN`wy9;mtWOjCc?H`y>x?H#8K3tt#>yDC zi+7ic?IKC@On~hdC8ZVrVJ|C-C0AWJ+Yf7uZxG{Yv8@*EmJ&xK+9Ao+?dCMk3f79= zC~4M6x!hhIJ#V1zHK2|&P$X6nY$u+5@pH3c*e*QJ;%8xQ*dCl8e!f)#+lyyQ8mv;- zK0GhdV3onOt6_0%8jXEB_PIt@o9-_Gi=sWwJJX z3hh3=4Y58QiS4cN%*qwikx<7--;PLZz+6F@tYsxyv&u>&N6uBV#u9K`w>i-}5Hl~N zb?vF>{z%4b?N7$celwnlWTJ_9vzduRW9bX2&&+ggGn0{Msy&j*gy9`Xw{L2q^hfC1 z%t$Z%ogIngAuSgON6V7QSve}wOqM4`REcs?m5_^^mqJxs6`W(L3DEO;2Q0r=K)DcP z%4LUztjZJK8`+alKHKitK$#8H+D_rYbjIwjYK~+gc@5%nrLVRm+ampDXE?Iolq5}w zcqWyIiEUS@C6yRRiqfC%Nu*-YZmO-F5K7I*%;~BhhGqEh?=opT8EC{p0&nLq1!&IALX&m zN}*SUZEc>?HI=OTx-fmV{e`afRHDaBr@8V|I3ux`nfWMRD%1WkepH{&WMR-&oc^gj z*10dtfl!y2X0jtXRXD4Axf2UB%49RO3o$?5`|;Tt%{__K6eV&UG4u2%KQe(Tx3IFU z=?&3TIwQ3z^x7jclHOP7v>Ic!B~ty7*pzN=O+!xx!@JPkn&zvmBN4uO3g?zoubJ9_ zz=iqjE^JO5h!=XTvC$gelPL7rIkzXL@Yy|B=xR-GPQ;^`M5@rmvq5uWAce79=xj~z zG`quzo_%Jf(77EE3suxmTHZJ~rH{w($N4WYr_QI&;*>FQB__>OrZA&D?KSoH=H_80 z8wTQh*kc`Xs{^L5u$jVI!&ff#PhdQA=UwwMJ?3-qXD@5ZouigF|H4-(CP;iTWHzUb z_8N%A9H$41A&fAlP8b}E=K*^$5nC;)VrQ%w#G235q+w0xHbDnSO7uWBk~N7)I%Otg zN#Pn`@4y$RU7|gyNMfAvEJw*%JJ+p9!IzP=4o6ZaGs|-+tvRV>!h+9PrQqCzCFSN( z?vd=IB+eXTA1aU&R8QpuR60lY^EOM0%+*TO-)_BlRTQz+QromQ67Mq`2kqpDJ28;e zt({wvBBPaZ%-HQiKBZPjh!eycgb7rlB`wsZELgWHe@`TFkhaLbl$941N{ZJ%9i$1JOKY zmBQh3DGEx?xe#|pG##Cgydj-7`@3U<9nnmFl&qYJ^qT#V)V^Gljz|iVkB(P{OEYhnzK;Q-s-Lr>UlMS&LhEaA; z+?t%o)Uw2)+TN-bR;hD@84sB=1F5)F-TDD)zJfN(k5Y;I1cT6GJbg-yH<|Ii%-+0> zYHJ!*N*vgU!66Cqwg=Lpe2$6F?1^G$U|;#DgW4PnVDligm+pvf_G=a%*+telvX>hI$)*-(UVw2Rj+4nPE^0=csPlb zQBv_;inztVbc)@5hPEVoT9fSwSlknNg=~tZGr7&Tusko%x1wS09uR}iL0jTL-oTkS zIH@t3k$#oR@POdk!p1?VQXb9ZJZh54yHm0g=S#?tPgN$|KG})cRH|x$?Xf9B*k&Tx zx&CVF5ssb7zI^OlS&nR3JGZ7xzUt&bCLZW7=V#mQZaimA@ZXe_*_Mf?xpAVBZahWJ z;0bOJb{fxzEk^DhJO_^8c`lXp!rOyqx&7dXP}++~14tQzP9=MAOu&Ob{wj_lB90~2 zu?A1k$vuFaqPjU9Rx0=hB#+po2}HU|O5mJnl$t=PuuBK<3^>Qq&{7f$5!}5}BFYcg z7C&w7=Nh^DP`fCeZj(_1#<>PqH>#z!+=euBeBOQMw%udi_ZvR{mFmUKeW};U5!5u7 z5hSe$Mj*h{$Dj*ug$I<%`<=yld1ZNJ5ov*~J_l;C6~6&+`B?Us`%8-5v-R1!&*%2} z@M;AHyhRKS2E*q>zTsQgE@kjCxEVYQB@9l6VxOZ}o8xl^0dovTvF>)EHU`(w<@)wD zyLX(iYW&EoZD>sd?QO>!h9*3(?*Qw=yMtz$y;Hi3Pj8`f$<+BeFar3AeiP0EpLve6 z?4#mLm3aE(xJ@`Oy)?5hhUJ()IeiN%%_A&{l6hQ3DD=@uHp`%jA{h^xg1%@)6stc9 zVz6ssZY$v;yRfaO1CJICKA5e`CU72$XW7Xb)g@zBwiB;pk{{>hg69|Zh8-u3Q^*m1 zPZEyeXJ|kbW2%ueKdMocT-!cWoi9PV=J=C;YvkmLuFTadC+be0?sVzS*@iQ)6<_>8 zK>2ojci|hsH|h_TYQEXN+=nlcO1^MrW2nw9;)`i3w7}NVphugS3_tACk<}U0HD4ga zhw_N82nSqFtd&QY_*}*KQyQPEJmQq&YD1J-r!`FrHY)1%X;0MR}bs9cr z@q5k=efrK+B-xgTuRqvh%DrR9UcT?vkPg52$H#~Fo4JSZR3zdIjmookhQa3^3IP_St*An}&;*-*xrwJ7;pxrt^27KK`Az zKljL+e?I)?r;qJ^>+VP2{@k&*Zhi3WZ$9<*Q=jLKs9sxB!@8AjH}*#TiTLikml?Yg z-B<0FT~EGRmF(@Nuc2!8=Z9R7q|FTIvz<;Mm_?tw$V4d*cs|J62I)%>3cu4U`TZms8*q?>QDwsR)&bbq~9uo|| z!QO(m+?_bK;qMo>NYbYrzy6)|zLrbik9EArBKSRmHGUP9Lo<-yfAd~s112!ub+lp< z+k>f$KMN&S2fVzWNyE=;hBeVi0(#W(DO?m9>Xh3-6h`WjG}UOg^=}pSCFleER)PD2 zSHphUU+`WgZ3V{f5^}zzls|~pMy!2^O0y2XpwO~4Z$|CY*iG?HCOM&=%_w1~?71>n ztnn-X`KvLJTyOj=^bA3Q|J#~zj8II#$K?noGPr&yoB(% zEl2)M$lE75xz$N5Z(Q3x)D62b>4}M2kRHOt7sPKVs`14XiCSWBZy7-UW%621Q?#4#ix2MKiFqdX s^5j0Ql{^h-0q-LFWgk3<*8jeI=$1eJr_1_(hP{T3`Tu_Y=k>t<2ZvEGn*aa+ literal 0 HcmV?d00001 diff --git a/Common/dll/01DoWhatPlc.pdb b/Common/dll/01DoWhatPlc.pdb new file mode 100644 index 0000000000000000000000000000000000000000..1bcb2070e532be2f956a56b1deda284762f343a5 GIT binary patch literal 60928 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 aUX&pp@)pQjAa8-Z1@aciTi{R20{<6#a1 literal 0 HcmV?d00001 diff --git a/Common/dll/02WebApiCall.dll b/Common/dll/02WebApiCall.dll new file mode 100644 index 0000000000000000000000000000000000000000..768b0be81d46f61d7fcd7375916e7039af46324a GIT binary patch literal 33280 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 literal 0 HcmV?d00001 diff --git a/Common/dll/02WebApiCall.dll.config b/Common/dll/02WebApiCall.dll.config new file mode 100644 index 0000000..b740b86 --- /dev/null +++ b/Common/dll/02WebApiCall.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Common/dll/02WebApiCall.pdb b/Common/dll/02WebApiCall.pdb new file mode 100644 index 0000000000000000000000000000000000000000..8f2d64485f37be17a063f1a6058d5892e275afb4 GIT binary patch literal 120320 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 literal 0 HcmV?d00001 diff --git a/Common/dll/04DataBaseAccess.dll b/Common/dll/04DataBaseAccess.dll new file mode 100644 index 0000000000000000000000000000000000000000..293cad54542623e169e6223afc2914b9f483a505 GIT binary patch literal 16896 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 literal 0 HcmV?d00001 diff --git a/Common/dll/07BusinessFacade.dll b/Common/dll/07BusinessFacade.dll new file mode 100644 index 0000000000000000000000000000000000000000..8fc2318c09806d467b9af77328f9ba1190c46c4e GIT binary patch literal 184832 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

;_Pk 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 literal 0 HcmV?d00001 diff --git a/Common/dll/07BusinessFacade.pdb b/Common/dll/07BusinessFacade.pdb new file mode 100644 index 0000000000000000000000000000000000000000..91ca8e2a5a93fd24edbf0ddd241ddb8f2a668c6d GIT binary patch literal 517632 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