diff --git a/SGGL/BLL/PHTGL/ContractCompile/PhtglContracttrackService .cs b/SGGL/BLL/PHTGL/ContractCompile/PhtglContracttrackService .cs index f9dfc9b8..6e2ae0f6 100644 --- a/SGGL/BLL/PHTGL/ContractCompile/PhtglContracttrackService .cs +++ b/SGGL/BLL/PHTGL/ContractCompile/PhtglContracttrackService .cs @@ -257,7 +257,23 @@ namespace BLL Funs.DB.SubmitChanges(); } } - + /// + /// 重置费用信息 + /// + /// + public static void RestSetComparison(string id) + { + var table = Funs.DB.PHTGL_ContractTrack.FirstOrDefault(x => x.Id == id); + if (table != null) + { + + table.EstimatedQuantity = string.Empty; + table.EstimatedAmount = 0m; + table.SettledQuantity = string.Empty; + table.SettledAmount = 0m; + Funs.DB.SubmitChanges(); + } + } public static void DeletePHTGL_ContractTrackById(string id) { PhtglContracttrackprogressService.DeleteModleByContractTrackId(id); diff --git a/SGGL/BLL/PHTGL/ContractCompile/PhtglContracttrackprogressService.cs b/SGGL/BLL/PHTGL/ContractCompile/PhtglContracttrackprogressService.cs index b5476a22..53139c81 100644 --- a/SGGL/BLL/PHTGL/ContractCompile/PhtglContracttrackprogressService.cs +++ b/SGGL/BLL/PHTGL/ContractCompile/PhtglContracttrackprogressService.cs @@ -125,6 +125,11 @@ namespace BLL } } } + /// + /// 根据导入合格价格信息数据来创建进度检测数据 + /// + /// + /// public static void CreateTemplateByContractList(List contractTrackList,string projectid) { var dbcontractTrack=(from x in Funs.DB.PHTGL_ContractTrack where x.ProjectId==projectid select x).ToList(); @@ -141,11 +146,12 @@ namespace BLL { splitLists = Funs.SplitList(contractTrackList, 1); } - ConcurrentBag contractTrackProgressList = new ConcurrentBag();//用于批量新增的数据 + ConcurrentBag contractTrackProgressList = new ConcurrentBag();//用于批量新增的数据(无序集合) ParallelOptions parallelOptions = new ParallelOptions(); parallelOptions.MaxDegreeOfParallelism = Environment.ProcessorCount; + ///使用多线程开启并行任务,操作拆分后的list 同时进行数据处理 Parallel.ForEach(splitLists, parallelOptions, sublist => { diff --git a/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackComparison.aspx b/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackComparison.aspx index 4e492a14..7098f7e0 100644 --- a/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackComparison.aspx +++ b/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackComparison.aspx @@ -80,7 +80,7 @@ FieldType="String" HeaderText="序号" TextAlign="Center" HeaderTextAlign="Center"> - @@ -98,13 +98,13 @@ - - @@ -274,7 +274,7 @@ Hidden="true" runat="server" Text="编辑" Icon="TableEdit"> diff --git a/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackComparison.aspx.cs b/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackComparison.aspx.cs index ce47a18b..046761a0 100644 --- a/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackComparison.aspx.cs +++ b/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackComparison.aspx.cs @@ -202,7 +202,7 @@ namespace FineUIPro.Web.PHTGL.ContractCompile var model = BLL.PhtglContractTrackService.GetPHTGL_ContractTrackById(rowID); if (model != null) { - BLL.PhtglContractTrackService.DeletePHTGL_ContractTrackById(rowID); + BLL.PhtglContractTrackService.RestSetComparison(rowID); } } diff --git a/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackList.aspx b/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackList.aspx index 1b7407ba..ff534f45 100644 --- a/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackList.aspx +++ b/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackList.aspx @@ -87,7 +87,7 @@ - @@ -105,13 +105,13 @@ - - diff --git a/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackList.aspx.cs b/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackList.aspx.cs index 45be76f5..4e5961e3 100644 --- a/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackList.aspx.cs +++ b/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackList.aspx.cs @@ -477,7 +477,8 @@ namespace FineUIPro.Web.PHTGL.ContractCompile model.Quantity = Quantity; model.TotalCostFixedComprehensiveUnitPrice =Funs.GetNewDecimalOrZero( TotalCostFixedComprehensiveUnitPrice); model.MainMaterialCost = Funs.GetNewDecimalOrZero(MainMaterialCost); - model.TotalPrice = Funs.GetNewDecimalOrZero(TotalPrice); + // model.TotalPrice = Funs.GetNewDecimalOrZero(TotalPrice); + model.TotalPrice = (Funs.GetNewDecimalOrZero(Quantity)* model.TotalCostFixedComprehensiveUnitPrice); model.CalculationRule = CalculationRule; model.WorkContent = WorkContent; model.Remarks = Remarks; diff --git a/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackProgressDetectionGrid.aspx b/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackProgressDetectionGrid.aspx index 5571840f..f674baec 100644 --- a/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackProgressDetectionGrid.aspx +++ b/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackProgressDetectionGrid.aspx @@ -18,14 +18,14 @@ background-color: YellowGreen; background-image: none; } - + .f-grid-row.red { background-color: Yellow; } .f-grid-cell[data-color=color1] { background-color: Yellow; color: #000000; - } + } @@ -40,7 +40,7 @@ runat="server" BoxFlex="1" DataKeyNames="Id" AllowCellEditing="true" ClicksToEdit="1" DataIDField="Id" AllowSorting="true" SortField="Id" SortDirection="DESC" OnSort="Grid1_Sort" EnableColumnLines="true" AllowColumnLocking="true" - AllowPaging="True" IsDatabasePaging="true" PageSize="300" OnPageIndexChange="Grid1_PageIndexChange" OnRowDataBound="Grid1_OnRowDataBound" + AllowPaging="True" IsDatabasePaging="true" PageSize="50" OnPageIndexChange="Grid1_PageIndexChange" OnRowDataBound="Grid1_OnRowDataBound" EnableRowDoubleClickEvent="true" OnRowDoubleClick="Grid1_RowDoubleClick" EnableRowClickEvent="True" > diff --git a/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackProgressDetectionGrid.aspx.cs b/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackProgressDetectionGrid.aspx.cs index f9e1f13e..6c225e04 100644 --- a/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackProgressDetectionGrid.aspx.cs +++ b/SGGL/FineUIPro.Web/PHTGL/ContractCompile/ContractTrackProgressDetectionGrid.aspx.cs @@ -1,13 +1,16 @@ using BLL; using Newtonsoft.Json.Linq; using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; +using System.Threading.Tasks; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; +using Model; namespace FineUIPro.Web.PHTGL.ContractCompile { @@ -60,12 +63,12 @@ namespace FineUIPro.Web.PHTGL.ContractCompile Model.PHTGL_ContractTrack queryContractTrack = new Model.PHTGL_ContractTrack(); queryContractTrack.ProjectId = this.CurrUser.LoginProjectId; queryContractTrack.ContractId = this.ContractId; - var modelContractTracks = BLL.PhtglContractTrackService.GetPHTGL_ContractTrackByModle(queryContractTrack); - if (modelContractTracks.Count==0) return; + var modelContractTracks = BLL.PhtglContractTrackService.GetFirstPHTGL_ContractTrackByModle(queryContractTrack); + if (modelContractTracks==null) return; Model.PHTGL_ContractTrackProgress table = new Model.PHTGL_ContractTrackProgress(); - table.ContractTrackId = modelContractTracks[0].Id; + table.ContractTrackId = modelContractTracks.Id; var tb = BLL.PhtglContracttrackprogressService.GetPHTGL_ContractTrackProgressByModle(table); foreach (var item in tb) { @@ -81,8 +84,8 @@ namespace FineUIPro.Web.PHTGL.ContractCompile GroupField p1BCWS = new GroupField(); p1BCWS.HeaderText = "BCWS"; - p1BCWS.TextAlign = TextAlign.Center; - + p1BCWS.TextAlign = TextAlign.Center; + p1BCWS.Attributes["data-color"] = "color1"; GroupField p1ACWP = new GroupField(); p1ACWP.HeaderText = "ACWP"; p1ACWP.TextAlign = TextAlign.Center; @@ -97,7 +100,7 @@ namespace FineUIPro.Web.PHTGL.ContractCompile GroupField p2BCWS = new GroupField(); p2BCWS.HeaderText = "BCWS"; p2BCWS.TextAlign = TextAlign.Center; - + p2BCWS.Attributes["data-color"] = "color1"; GroupField p2ACWP = new GroupField(); p2ACWP.HeaderText = "ACWP"; p2ACWP.TextAlign = TextAlign.Center; @@ -254,10 +257,10 @@ namespace FineUIPro.Web.PHTGL.ContractCompile Grid1.Columns.Add(p); } + } - } - + } #endregion public string ContractId { @@ -284,9 +287,8 @@ namespace FineUIPro.Web.PHTGL.ContractCompile /// private void BindGrid() { - if (!string .IsNullOrEmpty(ContractId)) + if (!string.IsNullOrEmpty(ContractId)) { - DataRow row; Model.PHTGL_ContractTrack queryContractTrack = new Model.PHTGL_ContractTrack(); queryContractTrack.ProjectId = this.CurrUser.LoginProjectId; queryContractTrack.ContractId = this.ContractId; @@ -298,57 +300,72 @@ namespace FineUIPro.Web.PHTGL.ContractCompile var modelContractTracks = BLL.PhtglContractTrackService.GetPHTGL_ContractTrackByModle(queryContractTrack); - + var count = BLL.PhtglContractTrackService.GetPHTGL_ContractTrackByModle(queryContractTrack).Count(); - modelContractTracks= modelContractTracks.Skip(Grid1.PageSize * Grid1.PageIndex).Take(Grid1.PageSize).ToList(); - foreach (var item in modelContractTracks) + modelContractTracks = modelContractTracks.Skip(Grid1.PageSize * Grid1.PageIndex).Take(Grid1.PageSize).ToList(); + + var splitContractTracks = Funs.SplitList(modelContractTracks, 10); + + ParallelOptions parallelOptions = new ParallelOptions(); + parallelOptions.MaxDegreeOfParallelism = Environment.ProcessorCount; + var concurrentGridTable = new ConcurrentDictionary(); + // 使用 Parallel.ForEach 来并行处理拆分后的列表 + Parallel.ForEach(splitContractTracks, parallelOptions, sublist => { - row= GridTable.NewRow(); - row["Id"] = item.Id; - row["MainItemCode"] = item.MainItemCode; - row["MainItemName"] = item.MainItemName; - row["MajorName"] = item.MajorName; - row["MajorCode"] = item.MajorCode; - //row["SubProject"] = item.SubProject; - //row["SubItemProject"] = item.SubItemProject; - row["ProjectCode"] = item.ProjectCode; - row["ProjectName"] = item.ProjectName; - row["ProjectDescription"] = item.ProjectDescription; - row["UnitOfMeasurement"] = item.UnitOfMeasurement; - - Model.PHTGL_ContractTrackProgress qContractTrackProgress = new Model.PHTGL_ContractTrackProgress(); - qContractTrackProgress.ContractTrackId = item.Id; - var modelContractTrackProgresses = BLL.PhtglContracttrackprogressService.GetPHTGL_ContractTrackProgressByModle(qContractTrackProgress); - foreach (var detail in modelContractTrackProgresses) + var tempTable = GridTable.Clone(); // 创建临时的 DataTable + foreach (var item in sublist) { - // var date=detail.Date.Replace("-", ""); - var date=detail.Date + "#"; - row[date+ "BCWS_Quantity"] = detail.BCWS_Quantity; - row[date+ "BCWS_OutputValue"] = detail.BCWS_OutputValue; - row[date+ "BCWS_Percentage"] = detail.BCWS_Percentage; - row[date+ "ACWP_Quantity"] = detail.ACWP_Quantity; - row[date+ "ACWP_OutputValue"] = detail.ACWP_OutputValue; - row[date+ "ACWP_Percentage"] = detail.ACWP_Percentage; + DataRow row = tempTable.NewRow(); + row["Id"] = item.Id; + row["MainItemCode"] = item.MainItemCode; + row["MainItemName"] = item.MainItemName; + row["MajorName"] = item.MajorName; + row["MajorCode"] = item.MajorCode; + //row["SubProject"] = item.SubProject; + //row["SubItemProject"] = item.SubItemProject; + row["ProjectCode"] = item.ProjectCode; + row["ProjectName"] = item.ProjectName; + row["ProjectDescription"] = item.ProjectDescription; + row["UnitOfMeasurement"] = item.UnitOfMeasurement; - var SumModel = PhtglContracttrackprogressService.GetSumProgress(detail.ContractTrackProgressId); - row[date + "SumBCWS_Quantity"] = SumModel.BCWS_Quantity; - row[date + "SumBCWS_OutputValue"] = SumModel.BCWS_OutputValue; - row[date + "SumBCWS_Percentage"] = SumModel.BCWS_Percentage; - row[date + "SumACWP_Quantity"] = SumModel.ACWP_Quantity; - row[date + "SumACWP_OutputValue"] = SumModel.ACWP_OutputValue; - row[date + "SumACWP_Percentage"] = SumModel.ACWP_Percentage; + Model.PHTGL_ContractTrackProgress qContractTrackProgress = new Model.PHTGL_ContractTrackProgress(); + qContractTrackProgress.ContractTrackId = item.Id; + var modelContractTrackProgresses = BLL.PhtglContracttrackprogressService.GetPHTGL_ContractTrackProgressByModle(qContractTrackProgress); + foreach (var detail in modelContractTrackProgresses) + { + // var date=detail.Date.Replace("-", ""); + var date = detail.Date + "#"; + row[date + "BCWS_Quantity"] = detail.BCWS_Quantity; + row[date + "BCWS_OutputValue"] = detail.BCWS_OutputValue; + row[date + "BCWS_Percentage"] = detail.BCWS_Percentage; + row[date + "ACWP_Quantity"] = detail.ACWP_Quantity; + row[date + "ACWP_OutputValue"] = detail.ACWP_OutputValue; + row[date + "ACWP_Percentage"] = detail.ACWP_Percentage; + + var SumModel = PhtglContracttrackprogressService.GetSumProgress(detail.ContractTrackProgressId); + row[date + "SumBCWS_Quantity"] = SumModel.BCWS_Quantity; + row[date + "SumBCWS_OutputValue"] = SumModel.BCWS_OutputValue; + row[date + "SumBCWS_Percentage"] = SumModel.BCWS_Percentage; + row[date + "SumACWP_Quantity"] = SumModel.ACWP_Quantity; + row[date + "SumACWP_OutputValue"] = SumModel.ACWP_OutputValue; + row[date + "SumACWP_Percentage"] = SumModel.ACWP_Percentage; + } + concurrentGridTable.TryAdd(item.Id, row); + // GridTable.Rows.Add(row); } - - GridTable.Rows.Add(row); + }); + // 将线程安全的数据拷贝到 GridTable + foreach (var kvp in concurrentGridTable) + { + DataRow newRow = GridTable.NewRow(); + newRow.ItemArray = kvp.Value.ItemArray; // 使用 ImportRow 方法创建新的行 + GridTable.Rows.Add(newRow); } - Grid1.RecordCount = count; Grid1.DataSource = GridTable; Grid1.DataBind(); } - - - } + } protected void Grid1_OnRowDataBound(object sender, GridRowEventArgs e) { if (!string.IsNullOrEmpty(ContractId)) @@ -357,7 +374,7 @@ namespace FineUIPro.Web.PHTGL.ContractCompile queryContractTrack.ProjectId = this.CurrUser.LoginProjectId; queryContractTrack.ContractId = this.ContractId; var modelContractTracks = BLL.PhtglContractTrackService.GetFirstPHTGL_ContractTrackByModle(queryContractTrack); - if (modelContractTracks ==null) return; + if (modelContractTracks == null) return; Model.PHTGL_ContractTrackProgress qContractTrackProgress = new Model.PHTGL_ContractTrackProgress(); qContractTrackProgress.ContractTrackId = modelContractTracks.Id; var modelContractTrackProgresses = BLL.PhtglContracttrackprogressService.GetPHTGL_ContractTrackProgressByModle(qContractTrackProgress); @@ -381,13 +398,8 @@ namespace FineUIPro.Web.PHTGL.ContractCompile e.CellAttributes[bf3.ColumnIndex]["data-color"] = "color1"; e.CellAttributes[bf4.ColumnIndex]["data-color"] = "color1"; + } - //foreach (var item in modelContractTracks) - //{ - - - - //} } } diff --git a/SGGL/WebAPI/App_Start/SwaggerConfig.cs b/SGGL/WebAPI/App_Start/SwaggerConfig.cs new file mode 100644 index 00000000..90589fcb --- /dev/null +++ b/SGGL/WebAPI/App_Start/SwaggerConfig.cs @@ -0,0 +1,256 @@ +using System.Linq; +using System.Web.Http; +using WebActivatorEx; +using WebAPI; +using Swashbuckle.Application; + +[assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")] + +namespace WebAPI +{ + public class SwaggerConfig + { + public static void Register() + { + var thisAssembly = typeof(SwaggerConfig).Assembly; + + GlobalConfiguration.Configuration + .EnableSwagger(c => + { + // By default, the service root url is inferred from the request used to access the docs. + // However, there may be situations (e.g. proxy and load-balanced environments) where this does not + // resolve correctly. You can workaround this by providing your own code to determine the root URL. + // + //c.RootUrl(req => GetRootUrlFromAppConfig()); + + // If schemes are not explicitly provided in a Swagger 2.0 document, then the scheme used to access + // the docs is taken as the default. If your API supports multiple schemes and you want to be explicit + // about them, you can use the "Schemes" option as shown below. + // + //c.Schemes(new[] { "http", "https" }); + + // Use "SingleApiVersion" to describe a single version API. Swagger 2.0 includes an "Info" object to + // hold additional metadata for an API. Version and title are required but you can also provide + // additional fields by chaining methods off SingleApiVersion. + // + c.SingleApiVersion("v1", "WebAPI"); + + // If you want the output Swagger docs to be indented properly, enable the "PrettyPrint" option. + // + //c.PrettyPrint(); + + // If your API has multiple versions, use "MultipleApiVersions" instead of "SingleApiVersion". + // In this case, you must provide a lambda that tells Swashbuckle which actions should be + // included in the docs for a given API version. Like "SingleApiVersion", each call to "Version" + // returns an "Info" builder so you can provide additional metadata per API version. + // + //c.MultipleApiVersions( + // (apiDesc, targetApiVersion) => ResolveVersionSupportByRouteConstraint(apiDesc, targetApiVersion), + // (vc) => + // { + // vc.Version("v2", "Swashbuckle Dummy API V2"); + // vc.Version("v1", "Swashbuckle Dummy API V1"); + // }); + + // You can use "BasicAuth", "ApiKey" or "OAuth2" options to describe security schemes for the API. + // See https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md for more details. + // NOTE: These only define the schemes and need to be coupled with a corresponding "security" property + // at the document or operation level to indicate which schemes are required for an operation. To do this, + // you'll need to implement a custom IDocumentFilter and/or IOperationFilter to set these properties + // according to your specific authorization implementation + // + //c.BasicAuth("basic") + // .Description("Basic HTTP Authentication"); + // + // NOTE: You must also configure 'EnableApiKeySupport' below in the SwaggerUI section + //c.ApiKey("apiKey") + // .Description("API Key Authentication") + // .Name("apiKey") + // .In("header"); + // + //c.OAuth2("oauth2") + // .Description("OAuth2 Implicit Grant") + // .Flow("implicit") + // .AuthorizationUrl("http://petstore.swagger.wordnik.com/api/oauth/dialog") + // //.TokenUrl("https://tempuri.org/token") + // .Scopes(scopes => + // { + // scopes.Add("read", "Read access to protected resources"); + // scopes.Add("write", "Write access to protected resources"); + // }); + + // Set this flag to omit descriptions for any actions decorated with the Obsolete attribute + //c.IgnoreObsoleteActions(); + + // Each operation be assigned one or more tags which are then used by consumers for various reasons. + // For example, the swagger-ui groups operations according to the first tag of each operation. + // By default, this will be controller name but you can use the "GroupActionsBy" option to + // override with any value. + // + //c.GroupActionsBy(apiDesc => apiDesc.HttpMethod.ToString()); + + // You can also specify a custom sort order for groups (as defined by "GroupActionsBy") to dictate + // the order in which operations are listed. For example, if the default grouping is in place + // (controller name) and you specify a descending alphabetic sort order, then actions from a + // ProductsController will be listed before those from a CustomersController. This is typically + // used to customize the order of groupings in the swagger-ui. + // + //c.OrderActionGroupsBy(new DescendingAlphabeticComparer()); + + // If you annotate Controllers and API Types with + // Xml comments (http://msdn.microsoft.com/en-us/library/b2s063f7(v=vs.110).aspx), you can incorporate + // those comments into the generated docs and UI. You can enable this by providing the path to one or + // more Xml comment files. + // + //c.IncludeXmlComments(GetXmlCommentsPath()); + + // Swashbuckle makes a best attempt at generating Swagger compliant JSON schemas for the various types + // exposed in your API. However, there may be occasions when more control of the output is needed. + // This is supported through the "MapType" and "SchemaFilter" options: + // + // Use the "MapType" option to override the Schema generation for a specific type. + // It should be noted that the resulting Schema will be placed "inline" for any applicable Operations. + // While Swagger 2.0 supports inline definitions for "all" Schema types, the swagger-ui tool does not. + // It expects "complex" Schemas to be defined separately and referenced. For this reason, you should only + // use the "MapType" option when the resulting Schema is a primitive or array type. If you need to alter a + // complex Schema, use a Schema filter. + // + //c.MapType(() => new Schema { type = "integer", format = "int32" }); + + // If you want to post-modify "complex" Schemas once they've been generated, across the board or for a + // specific type, you can wire up one or more Schema filters. + // + //c.SchemaFilter(); + + // In a Swagger 2.0 document, complex types are typically declared globally and referenced by unique + // Schema Id. By default, Swashbuckle does NOT use the full type name in Schema Ids. In most cases, this + // works well because it prevents the "implementation detail" of type namespaces from leaking into your + // Swagger docs and UI. However, if you have multiple types in your API with the same class name, you'll + // need to opt out of this behavior to avoid Schema Id conflicts. + // + //c.UseFullTypeNameInSchemaIds(); + + // Alternatively, you can provide your own custom strategy for inferring SchemaId's for + // describing "complex" types in your API. + // + //c.SchemaId(t => t.FullName.Contains('`') ? t.FullName.Substring(0, t.FullName.IndexOf('`')) : t.FullName); + + // Set this flag to omit schema property descriptions for any type properties decorated with the + // Obsolete attribute + //c.IgnoreObsoleteProperties(); + + // In accordance with the built in JsonSerializer, Swashbuckle will, by default, describe enums as integers. + // You can change the serializer behavior by configuring the StringToEnumConverter globally or for a given + // enum type. Swashbuckle will honor this change out-of-the-box. However, if you use a different + // approach to serialize enums as strings, you can also force Swashbuckle to describe them as strings. + // + //c.DescribeAllEnumsAsStrings(); + + // Similar to Schema filters, Swashbuckle also supports Operation and Document filters: + // + // Post-modify Operation descriptions once they've been generated by wiring up one or more + // Operation filters. + // + //c.OperationFilter(); + // + // If you've defined an OAuth2 flow as described above, you could use a custom filter + // to inspect some attribute on each action and infer which (if any) OAuth2 scopes are required + // to execute the operation + // + //c.OperationFilter(); + + // Post-modify the entire Swagger document by wiring up one or more Document filters. + // This gives full control to modify the final SwaggerDocument. You should have a good understanding of + // the Swagger 2.0 spec. - https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md + // before using this option. + // + //c.DocumentFilter(); + + // In contrast to WebApi, Swagger 2.0 does not include the query string component when mapping a URL + // to an action. As a result, Swashbuckle will raise an exception if it encounters multiple actions + // with the same path (sans query string) and HTTP method. You can workaround this by providing a + // custom strategy to pick a winner or merge the descriptions for the purposes of the Swagger docs + // + c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First()); + + // Wrap the default SwaggerGenerator with additional behavior (e.g. caching) or provide an + // alternative implementation for ISwaggerProvider with the CustomProvider option. + // + //c.CustomProvider((defaultProvider) => new CachingSwaggerProvider(defaultProvider)); + }) + .EnableSwaggerUi(c => + { + // Use the "DocumentTitle" option to change the Document title. + // Very helpful when you have multiple Swagger pages open, to tell them apart. + // + //c.DocumentTitle("My Swagger UI"); + + // Use the "InjectStylesheet" option to enrich the UI with one or more additional CSS stylesheets. + // The file must be included in your project as an "Embedded Resource", and then the resource's + // "Logical Name" is passed to the method as shown below. + // + //c.InjectStylesheet(containingAssembly, "Swashbuckle.Dummy.SwaggerExtensions.testStyles1.css"); + + // Use the "InjectJavaScript" option to invoke one or more custom JavaScripts after the swagger-ui + // has loaded. The file must be included in your project as an "Embedded Resource", and then the resource's + // "Logical Name" is passed to the method as shown above. + // + //c.InjectJavaScript(thisAssembly, "Swashbuckle.Dummy.SwaggerExtensions.testScript1.js"); + + // The swagger-ui renders boolean data types as a dropdown. By default, it provides "true" and "false" + // strings as the possible choices. You can use this option to change these to something else, + // for example 0 and 1. + // + //c.BooleanValues(new[] { "0", "1" }); + + // By default, swagger-ui will validate specs against swagger.io's online validator and display the result + // in a badge at the bottom of the page. Use these options to set a different validator URL or to disable the + // feature entirely. + //c.SetValidatorUrl("http://localhost/validator"); + //c.DisableValidator(); + + // Use this option to control how the Operation listing is displayed. + // It can be set to "None" (default), "List" (shows operations for each resource), + // or "Full" (fully expanded: shows operations and their details). + // + //c.DocExpansion(DocExpansion.List); + + // Specify which HTTP operations will have the 'Try it out!' option. An empty paramter list disables + // it for all operations. + // + //c.SupportedSubmitMethods("GET", "HEAD"); + + // Use the CustomAsset option to provide your own version of assets used in the swagger-ui. + // It's typically used to instruct Swashbuckle to return your version instead of the default + // when a request is made for "index.html". As with all custom content, the file must be included + // in your project as an "Embedded Resource", and then the resource's "Logical Name" is passed to + // the method as shown below. + // + //c.CustomAsset("index", containingAssembly, "YourWebApiProject.SwaggerExtensions.index.html"); + + // If your API has multiple versions and you've applied the MultipleApiVersions setting + // as described above, you can also enable a select box in the swagger-ui, that displays + // a discovery URL for each version. This provides a convenient way for users to browse documentation + // for different API versions. + // + //c.EnableDiscoveryUrlSelector(); + + // If your API supports the OAuth2 Implicit flow, and you've described it correctly, according to + // the Swagger 2.0 specification, you can enable UI support as shown below. + // + //c.EnableOAuth2Support( + // clientId: "test-client-id", + // clientSecret: null, + // realm: "test-realm", + // appName: "Swagger UI" + // //additionalQueryStringParams: new Dictionary() { { "foo", "bar" } } + //); + + // If your API supports ApiKey, you can override the default values. + // "apiKeyIn" can either be "query" or "header" + // + //c.EnableApiKeySupport("apiKey", "header"); + }); + } + } +} diff --git a/SGGL/WebAPI/WebAPI.csproj b/SGGL/WebAPI/WebAPI.csproj index 7ace3eb3..bec0c943 100644 --- a/SGGL/WebAPI/WebAPI.csproj +++ b/SGGL/WebAPI/WebAPI.csproj @@ -57,6 +57,9 @@ ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll + + ..\packages\Swashbuckle.Core.5.6.0\lib\net40\Swashbuckle.Core.dll + @@ -118,6 +121,9 @@ ..\packages\Microsoft.AspNet.WebPages.3.2.4\lib\net45\System.Web.WebPages.Razor.dll + + ..\packages\WebActivatorEx.2.0\lib\net40\WebActivatorEx.dll + True ..\packages\WebGrease.1.6.0\lib\WebGrease.dll @@ -136,6 +142,7 @@ +