Commit 9e7aa0cb by pengjinyang

提交

parent b16f074a
......@@ -5,6 +5,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="EasyNetQ" Version="3.5.2" />
<PackageReference Include="sqlSugarCore" Version="4.9.9.10" />
</ItemGroup>
......
......@@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Text;
namespace Domain.Domain.TakeStock.Repository
namespace Domain.TakeStock.Repository
{
public interface ITakeStockScheduleRepository: IRepository<TakeStockSchedule>
{
......
......@@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Text;
namespace Domain.Domain.TakeStock
namespace Domain.TakeStock
{
public class Stock
{
......
......@@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Text;
namespace Domain.Domain.TakeStock
namespace Domain.TakeStock
{
public class TakeStockEnum
{
......
......@@ -2,9 +2,9 @@
using System;
using System.Collections.Generic;
using System.Text;
using static Domain.Domain.TakeStock.TakeStockEnum;
using static Domain.TakeStock.TakeStockEnum;
namespace Domain.Domain.TakeStock
namespace Domain.TakeStock
{
[SugarTable("stock_takestockorder")]
public class TakeStockOrder
......
......@@ -2,9 +2,9 @@
using System;
using System.Collections.Generic;
using System.Text;
using static Domain.Domain.TakeStock.TakeStockEnum;
using static Domain.TakeStock.TakeStockEnum;
namespace Domain.Domain.TakeStock
namespace Domain.TakeStock
{
[SugarTable("stock_takestockorder_log")]
public class TakeStockOrderLog
......
......@@ -2,9 +2,9 @@
using System;
using System.Collections.Generic;
using System.Text;
using static Domain.Domain.TakeStock.TakeStockEnum;
using static Domain.TakeStock.TakeStockEnum;
namespace Domain.Domain.TakeStock
namespace Domain.TakeStock
{
[SugarTable("stock_takestockschedule")]
public class TakeStockSchedule
......
using Domain.Domain.TakeStock;
using Domain.TakeStock;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
......@@ -49,7 +49,9 @@ namespace IService.TakeStock
(int total, List<TakeStockOrder> items) SearchOrderByPage(int pageIndex, int pageSize, Expression<Func<TakeStockOrder, bool>> expr);
List<TakeStockOrderLog> SearchOrderLogs(Expression<Func<TakeStockOrderLog, bool>> expr);
List<TakeStockOrderLog> SearchOrderLogs(Expression<Func<TakeStockOrderLog, bool>> expr);
Task PushTakeStockMsg(int id);
///// <summary>
///// 冻结库存
......
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="EasyNetQ" Version="3.5.2" />
</ItemGroup>
</Project>
using EasyNetQ;
namespace Message.TakeStock
{
[Queue("TakeStock", ExchangeName = "TakeStock")]
public class CreateTakeStockMessage
{
/// <summary>
/// 仓库编码
/// </summary>
public string WarehouseCode { get; set; }
public string Sku { get; set; }
}
}
......@@ -19,6 +19,7 @@ namespace MessageQueue
public async Task<bool> SendAsync<T>(string queueName, T t) where T: class
{
bus.Publish(t);
var task = bus.SendAsync(queueName, t);
return task.IsCompleted;
}
......
......@@ -5,6 +5,8 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="EasyNetQ" Version="3.5.2" />
<PackageReference Include="EasyNetQ.DI.Microsoft" Version="3.5.1" />
<PackageReference Include="Hangfire.Core" Version="1.7.3" />
<PackageReference Include="Microsoft.Extensions.Http" Version="2.2.0" />
</ItemGroup>
......@@ -13,6 +15,7 @@
<ProjectReference Include="..\Common\Common.csproj" />
<ProjectReference Include="..\IService\IService.csproj" />
<ProjectReference Include="..\MessageQueue\MessageQueue.csproj" />
<ProjectReference Include="..\Message\Message.csproj" />
</ItemGroup>
</Project>
using Domain.TakeStock;
using EasyNetQ.AutoSubscribe;
using IService.TakeStock;
using Message.TakeStock;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Service.TakeStock
{
public class CreateTakeStockConsumer : IConsumeAsync<CreateTakeStockMessage>
{
private readonly ITakeStockService _takeStockService;
public CreateTakeStockConsumer(ITakeStockService takeStockService)
{
this._takeStockService = takeStockService;
}
[AutoSubscriberConsumer(SubscriptionId = "CreateTakeStock")]
public async Task ConsumeAsync(CreateTakeStockMessage message)
{
TakeStockSchedule schedule = new TakeStockSchedule()
{
WarehouseCode = message.WarehouseCode,
IsAutomation = true,
Description = "库存不足发起的系统自动盘点。",
CreationTime = DateTime.UtcNow.AddHours(8)
};
List<TakeStockOrder> orders = new List<TakeStockOrder>()
{
new TakeStockOrder
{
Sku = message.Sku,
CreationTime = DateTime.UtcNow.AddHours(8)
}
};
await _takeStockService.CreateTakeStockOrderAsync(schedule, orders);
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using EasyNetQ;
namespace Service.TakeStock
{
[Queue("sku_quenen", ExchangeName = "sku_quenen")]
public class TakeStockMessage
{
/// <summary>
/// 盘点单号
/// </summary>
public string Code { get; set; }
/// <summary>
/// 仓库编码
/// </summary>
public string WarehouseCode { get; set; }
public string Sku { get; set; }
public int Quantity { get; set; }
}
}
......@@ -27,6 +27,7 @@ namespace TakeStock.API.Controllers
[HttpGet]
public IEnumerable<string> Get()
{
takeStockAppService.PushTakeStockMsg();
return new string[] { "value1", "value2" };
}
......
using EasyNetQ;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace TakeStock.API.Extensions
{
public class EasyNetQConventions : Conventions
{
public EasyNetQConventions(ITypeNameSerializer typeNameSerializer) : base(typeNameSerializer)
{
ExchangeNamingConvention = messageInfo => "ttt";
QueueNamingConvention = (t, s) => { return "tttt"; };
ErrorQueueNamingConvention = messageInfo => "";
}
}
}
using EasyNetQ;
using EasyNetQ.AutoSubscribe;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
namespace TakeStock.API.Extensions
{
public static class EasyNetQExtenssion
{
public static IApplicationBuilder UseSubscribe(this IApplicationBuilder appBuilder, string subscriptionIdPrefix, Assembly assembly)
{
var services = appBuilder.ApplicationServices.CreateScope().ServiceProvider;
var lifeTime = services.GetService<IApplicationLifetime>();
var bus = services.GetService<IBus>();
lifeTime.ApplicationStarted.Register(() =>
{
var subscriber = new AutoSubscriber(bus, subscriptionIdPrefix)
{
AutoSubscriberMessageDispatcher = new EasyNetQMessageDispatcher(services)
};
subscriber.Subscribe(assembly);
subscriber.SubscribeAsync(assembly);
});
lifeTime.ApplicationStopped.Register(() => { bus.Dispose(); });
return appBuilder;
}
}
}
using EasyNetQ.AutoSubscribe;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace TakeStock.API.Extensions
{
public class EasyNetQMessageDispatcher : IAutoSubscriberMessageDispatcher
{
private readonly IServiceProvider services;
public EasyNetQMessageDispatcher(IServiceProvider services)
{
this.services = services;
}
void IAutoSubscriberMessageDispatcher.Dispatch<TMessage, TConsumer>(TMessage message)
{
var consumer = services.GetService<TConsumer>();
try
{
consumer.Consume(message);
}
finally
{
//services.Release(consumer);
}
}
Task IAutoSubscriberMessageDispatcher.DispatchAsync<TMessage, TConsumer>(TMessage message)
{
var consumer = services.GetService<TConsumer>();
return consumer.ConsumeAsync(message);
}
}
}
using AutoMapper;
using Domain;
using Domain.Domain.TakeStock.Repository;
using Domain.TakeStock.Repository;
using EasyNetQ;
using EasyNetQ.AutoSubscribe;
using Hangfire;
using Hangfire.MySql;
using IService.TakeStock;
......@@ -16,6 +18,7 @@ using SqlSugar;
using StackExchange.Redis;
using System;
using System.Linq;
using System.Reflection;
using System.Transactions;
using TakeStock.API.Extensions;
using TakeStock.Application.TakeStock;
......@@ -52,12 +55,9 @@ namespace TakeStock.API
});
});
//var redis = ConnectionMultiplexer.Connect("172.17.0.2:6379");
//services.AddDataProtection().PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys");
RegisterHttpClient(services);
services.AddAutoMapper();
services.AddSingleton(RabbitHutch.CreateBus(Configuration.GetConnectionString("RabbitMqConnection")));
//services.RegisterEasyNetQ(Configuration.GetConnectionString("RabbitMqConnection"));
//services.AddSingleton(RabbitHutch.CreateBus(rabbitMqConnection, serviceRegister => serviceRegister.Register(c => new EasyNetQConventions(new DefaultTypeNameSerializer()))));
services.AddScoped<RabbitMQClient>();
services.AddScoped<ITakeStockService, TakeStockService>();
......@@ -65,12 +65,15 @@ namespace TakeStock.API
services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
services.AddScoped(typeof(ITakeStockScheduleRepository), typeof(TakeStockScheduleRepository));
services.AddScoped<TakeStockAppService>();
services.AddScoped(typeof(IConsumeAsync<CreateTakeStockConsumer>), typeof(CreateTakeStockConsumer));
services.AddAutoMapper();
RegisterHttpClient(services);
services.AddHttpClient();
// Add Hangfire services.
services.AddHangfire(configuration => configuration.UseRedisStorage(Redis));
// Add the processing server as IHostedService
services.AddHangfireServer();
......@@ -106,6 +109,9 @@ namespace TakeStock.API
app.UseMvc();
//dbContext.Migration();
//app.UseSubscribe("TakeStockService", AppDomain.CurrentDomain.GetAssemblies().Single(a => a.GetName().Name == "Service"));
}
public void RegisterHttpClient(IServiceCollection services)
......
......@@ -8,8 +8,9 @@
<ItemGroup>
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="6.1.1" />
<PackageReference Include="Castle.Windsor.MsDependencyInjection" Version="3.3.1" />
<PackageReference Include="EasyNetQ" Version="3.5.2" />
<PackageReference Include="Hangfire.AspNetCore" Version="1.7.3" />
<PackageReference Include="Hangfire.Core" Version="1.7.3" />
<PackageReference Include="Hangfire.Dashboard.Authorization" Version="2.1.0" />
<PackageReference Include="Hangfire.Dashboard.Dark" Version="1.0.6" />
<PackageReference Include="Hangfire.MySqlStorage" Version="2.0.0" />
......@@ -28,11 +29,12 @@
<ProjectReference Include="..\Domain\Domain.csproj" />
<ProjectReference Include="..\IService\IService.csproj" />
<ProjectReference Include="..\MessageQueue\MessageQueue.csproj" />
<ProjectReference Include="..\Message\Message.csproj" />
<ProjectReference Include="..\Service\Service.csproj" />
<ProjectReference Include="..\TakeStock.Application\TakeStock.Application.csproj" />
<ProjectReference Include="..\TakeStock.SqlSugar\TakeStock.SqlSugar.csproj" />
</ItemGroup>
<ProjectExtensions><VisualStudio><UserProperties appsettings_1json__JSONSchema="http://json.schemastore.org/2.0.0-csd.2.beta.2018-10-10.json" /></VisualStudio></ProjectExtensions>
<ProjectExtensions><VisualStudio><UserProperties appsettings_1json__JSONSchema="" /></VisualStudio></ProjectExtensions>
</Project>
......@@ -5,7 +5,7 @@
"Hangfire": "Information"
}
},
"AllowedHosts": "*",
//"AllowedHosts": "*",
"WMS": {
"Name": "WMS",
"Uri": "http://api.wms.bailuntec.com/api/services/app/",
......@@ -15,10 +15,11 @@
"ConnectionStrings": {
"Localhost": "server=gz-cdb-hqmznu0w.sql.tencentcdb.com;port=63523;database=bailun_wms;uid=root;password=#7kfnymAM$Y9-Ntf;Convert Zero Datetime=True;Allow User Variables=true;",
//"Redis": "127.0.0.1"
"Redis": "common-redis"
//"Redis": "129.204.97.78"
//"Redis": "common-redis"
"Redis": "129.204.97.78",
"RabbitMqConnection": "host=111.230.164.154:5672;username=bailun;password=1234abcd;prefetchcount=2;publisherConfirms=true;timeout=10"
},
"App": {
"CorsOrigins": "*"
}
}
}
using AutoMapper;
using Domain.Domain.TakeStock;
using Domain.TakeStock;
using System;
using System.Collections.Generic;
using System.Text;
......
using System;
using System.Collections.Generic;
using System.Text;
using static Domain.Domain.TakeStock.TakeStockEnum;
using static Domain.TakeStock.TakeStockEnum;
namespace TakeStock.Application.TakeStock.Dto
{
......
using System;
using System.Collections.Generic;
using System.Text;
using static Domain.Domain.TakeStock.TakeStockEnum;
using static Domain.TakeStock.TakeStockEnum;
namespace TakeStock.Application.TakeStock.Dto
{
......
using System;
using System.Collections.Generic;
using System.Text;
using static Domain.Domain.TakeStock.TakeStockEnum;
using static Domain.TakeStock.TakeStockEnum;
namespace TakeStock.Application.TakeStock.Dto
{
......
using System;
using System.Collections.Generic;
using System.Text;
using static Domain.Domain.TakeStock.TakeStockEnum;
using static Domain.TakeStock.TakeStockEnum;
namespace TakeStock.Application.TakeStock.Dto
{
......
using System;
using System.Collections.Generic;
using System.Text;
using static Domain.Domain.TakeStock.TakeStockEnum;
using static Domain.TakeStock.TakeStockEnum;
namespace TakeStock.Application.TakeStock.Dto
{
......
using System;
using System.Collections.Generic;
using System.Text;
using static Domain.Domain.TakeStock.TakeStockEnum;
using static Domain.TakeStock.TakeStockEnum;
namespace TakeStock.Application.TakeStock.Dto
{
......
using AutoMapper;
using Common.Extensions;
using Domain.Domain.TakeStock;
using Domain.TakeStock;
using IService.TakeStock;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
......@@ -127,5 +127,10 @@ namespace TakeStock.Application.TakeStock
var data = takeStockService.SearchOrderLogs(expr);
return _mapper.Map<List<LogOutputDto>>(data);
}
public async Task PushTakeStockMsg()
{
await takeStockService.PushTakeStockMsg(0);
}
}
}
using Domain.Domain;
using Domain.Domain.TakeStock;
using Domain;
using Domain.TakeStock;
using Microsoft.Extensions.Configuration;
namespace SqlSugar
......
using Domain.Domain.TakeStock;
using Domain.Domain.TakeStock.Repository;
using Domain.TakeStock;
using Domain.TakeStock.Repository;
using SqlSugar;
using System;
using System.Collections.Generic;
......
FROM microsoft/dotnet:2.2-runtime AS base
WORKDIR /app
FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY ../TakeStock.Subscriber.csproj TakeStock.Subscriber/
COPY ../Message/Message.csproj Message/
RUN dotnet restore TakeStock.Subscriber/TakeStock.Subscriber.csproj
COPY . .
WORKDIR /src/TakeStock.Subscriber
RUN dotnet build TakeStock.Subscriber.csproj -c Release -o /app
FROM build AS publish
RUN dotnet publish TakeStock.Subscriber.csproj -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "TakeStock.Subscriber.dll"]
using EasyNetQ;
using Message.TakeStock;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
namespace TakeStock.Subscriber
{
class Program
{
static void Main(string[] args)
{
try
{
Init();
var connStr = "host=111.230.164.154:5672;username=bailun;password=1234abcd;prefetchcount=2;publisherConfirms=true;timeout=10";
var bus = RabbitHutch.CreateBus(connStr);
bus.SubscribeAsync<CreateTakeStockMessage>("Create", async message => await Exec(message)
.ContinueWith(task =>
{
if (task.IsCompleted && !task.IsFaulted)
{
bool isSuccess = task.Result;
}
else
{
throw new EasyNetQException("Message processing exception - look in the default error queue (broker)");
}
}));
//CreateTakeStockMessage msg = new CreateTakeStockMessage
//{
// WarehouseCode = "BLTEST",
// Sku = "TEST0001"
//};
//bus.Publish(msg);
}
catch (Exception ex)
{
}
}
private static IServiceCollection services;
private static IServiceProvider serviceProvider;
private static void Init()
{
services = new ServiceCollection();
//注入
//services.AddTransient<ILoggerFactory, LoggerFactory>();
services.AddHttpClient("TakeStock", c =>
{
c.Timeout = TimeSpan.FromSeconds(30);
c.BaseAddress = new Uri("http://193.112.230.53:5002/api/");
});
serviceProvider = services.BuildServiceProvider();
}
private static async Task<bool> Exec(CreateTakeStockMessage message)
{
IHttpClientFactory _httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
var schedule = new
{
WarehouseCode = message.WarehouseCode,
IsAutomation = true,
Description = "库存不足发起的系统自动盘点。",
CreationTime = DateTime.UtcNow.AddHours(8),
Orders = new List<dynamic>()
{
new
{
WarehouseCode = message.WarehouseCode,
Sku = message.Sku,
//CreationTime = DateTime.UtcNow.AddHours(8)
}
}
};
var client = _httpClientFactory.CreateClient("TakeStock");
HttpContent content = new StringContent(JsonConvert.SerializeObject(schedule));
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var response = await client.PostAsync("TakeStock", content);
bool isSuccess = false;
if (response.IsSuccessStatusCode)
{
var responseContent = await response.Content.ReadAsStringAsync();
isSuccess = Convert.ToBoolean(responseContent);
}
return isSuccess;
}
}
}
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="EasyNetQ" Version="3.5.2" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="2.2.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Message\Message.csproj" />
</ItemGroup>
</Project>
......@@ -27,9 +27,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common", "Common\Common.csp
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessageQueue", "MessageQueue\MessageQueue.csproj", "{5C7ACFA4-42B4-4A62-8AAB-7F59B63A448D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TakeStock.API", "TakeStock.API\TakeStock.API.csproj", "{5D4294CC-4185-4970-816D-7FF51B70149B}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TakeStock.API", "TakeStock.API\TakeStock.API.csproj", "{5D4294CC-4185-4970-816D-7FF51B70149B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TakeStock.Application", "TakeStock.Application\TakeStock.Application.csproj", "{58356002-A8B1-43F7-A324-072882A8A0E5}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TakeStock.Application", "TakeStock.Application\TakeStock.Application.csproj", "{58356002-A8B1-43F7-A324-072882A8A0E5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TakeStock.Subscriber", "TakeStock.Subscriber\TakeStock.Subscriber.csproj", "{76B21CB3-D70B-40DF-9012-140EFFF4E3E3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Message", "Message\Message.csproj", "{44038020-A9C7-4A6D-BE1C-8A58E0E539B5}"
EndProject
Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-compose.dcproj", "{64D69277-72E8-4F9C-8AE6-654AFA7B9471}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
......@@ -73,6 +79,18 @@ Global
{58356002-A8B1-43F7-A324-072882A8A0E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{58356002-A8B1-43F7-A324-072882A8A0E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{58356002-A8B1-43F7-A324-072882A8A0E5}.Release|Any CPU.Build.0 = Release|Any CPU
{76B21CB3-D70B-40DF-9012-140EFFF4E3E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{76B21CB3-D70B-40DF-9012-140EFFF4E3E3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{76B21CB3-D70B-40DF-9012-140EFFF4E3E3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{76B21CB3-D70B-40DF-9012-140EFFF4E3E3}.Release|Any CPU.Build.0 = Release|Any CPU
{44038020-A9C7-4A6D-BE1C-8A58E0E539B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{44038020-A9C7-4A6D-BE1C-8A58E0E539B5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{44038020-A9C7-4A6D-BE1C-8A58E0E539B5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{44038020-A9C7-4A6D-BE1C-8A58E0E539B5}.Release|Any CPU.Build.0 = Release|Any CPU
{64D69277-72E8-4F9C-8AE6-654AFA7B9471}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{64D69277-72E8-4F9C-8AE6-654AFA7B9471}.Debug|Any CPU.Build.0 = Debug|Any CPU
{64D69277-72E8-4F9C-8AE6-654AFA7B9471}.Release|Any CPU.ActiveCfg = Release|Any CPU
{64D69277-72E8-4F9C-8AE6-654AFA7B9471}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
......@@ -87,6 +105,8 @@ Global
{5C7ACFA4-42B4-4A62-8AAB-7F59B63A448D} = {1CE94A16-D71B-4989-A04C-853A8916B07F}
{5D4294CC-4185-4970-816D-7FF51B70149B} = {391C67A4-6BF0-47DC-A6AA-8E4E79D45E5C}
{58356002-A8B1-43F7-A324-072882A8A0E5} = {AC7CFA36-1E6B-4339-A10A-951EEE52654A}
{76B21CB3-D70B-40DF-9012-140EFFF4E3E3} = {391C67A4-6BF0-47DC-A6AA-8E4E79D45E5C}
{44038020-A9C7-4A6D-BE1C-8A58E0E539B5} = {72742094-9914-4887-AC36-F43952D39659}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {9263CAC2-DE1F-49C4-AF49-C184938E47CD}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment